From d2dece3df743c97f2cfbb9bbf0dd0449a8730cec Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 4 Jan 2017 04:44:00 -0800 Subject: [PATCH 001/118] adding yolo9000 --- .gitignore | 2 + cfg/coco.data | 4 +- cfg/voc.data | 2 +- cfg/yolo9000.cfg | 211 + data/9k.labels | 9418 ++++++++++++++++++++++++++++++++++ data/9k.names | 9418 ++++++++++++++++++++++++++++++++++ data/coco9k.map | 80 + data/inet9k.map | 200 + src/box.c | 28 + src/box.h | 1 + src/coco.c | 2 +- src/convolutional_kernels.cu | 1 + src/cpu_gemm.c | 91 - src/darknet.c | 8 +- src/data.c | 4 +- src/demo.c | 10 +- src/demo.h | 2 +- src/detector.c | 35 +- src/layer.c | 108 +- src/layer.h | 71 +- src/parser.c | 2 +- src/region_layer.c | 86 +- src/region_layer.h | 14 +- src/server.c | 205 - src/server.h | 4 - src/tree.c | 36 +- src/tree.h | 2 + src/yolo.c | 2 +- src/yolo_kernels.cu | 132 - 29 files changed, 19587 insertions(+), 592 deletions(-) create mode 100644 cfg/yolo9000.cfg create mode 100644 data/9k.labels create mode 100644 data/9k.names create mode 100644 data/coco9k.map create mode 100644 data/inet9k.map delete mode 100644 src/cpu_gemm.c delete mode 100644 src/server.c delete mode 100644 src/server.h delete mode 100644 src/yolo_kernels.cu diff --git a/.gitignore b/.gitignore index fd44ca292fd..2299a477fbb 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ *.csv *.out *.png +*.jpg +old/ mnist/ data/ caffe/ diff --git a/cfg/coco.data b/cfg/coco.data index 30038417c27..610151dc50b 100644 --- a/cfg/coco.data +++ b/cfg/coco.data @@ -1,7 +1,7 @@ classes= 80 train = /home/pjreddie/data/coco/trainvalno5k.txt -valid = coco_testdev -#valid = data/coco_val_5k.list +#valid = coco_testdev +valid = data/coco_val_5k.list names = data/coco.names backup = /home/pjreddie/backup/ eval=coco diff --git a/cfg/voc.data b/cfg/voc.data index eb6af25caaa..7807b5d2a8f 100644 --- a/cfg/voc.data +++ b/cfg/voc.data @@ -2,5 +2,5 @@ classes= 20 train = /home/pjreddie/data/voc/train.txt valid = /home/pjreddie/data/voc/2007_test.txt names = data/voc.names -backup = /home/pjreddie/backup/ +backup = backup diff --git a/cfg/yolo9000.cfg b/cfg/yolo9000.cfg new file mode 100644 index 00000000000..981491d8629 --- /dev/null +++ b/cfg/yolo9000.cfg @@ -0,0 +1,211 @@ +[net] +batch=1 +subdivisions=1 +height=416 +width=416 +channels=3 +momentum=0.9 +decay=0.0005 + +learning_rate=0.00001 +max_batches = 242200 +policy=steps +steps=500,200000,240000 +scales=10,.1,.1 + +hue=.1 +saturation=.75 +exposure=.75 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +filters=28269 +size=1 +stride=1 +pad=1 +activation=linear + +[region] +anchors = 0.77871, 1.14074, 3.00525, 4.31277, 9.22725, 9.61974 +bias_match=1 +classes=9418 +coords=4 +num=3 +softmax=1 +jitter=.2 +rescore=1 + +object_scale=5 +noobject_scale=1 +class_scale=1 +coord_scale=1 + +thresh = .6 +absolute=1 +random=1 + +tree=data/9k.tree +map = data/coco9k.map diff --git a/data/9k.labels b/data/9k.labels new file mode 100644 index 00000000000..e2bd3082485 --- /dev/null +++ b/data/9k.labels @@ -0,0 +1,9418 @@ +n00002452 +n00020827 +n00002684 +n11425580 +n05220461 +n09225146 +n05538625 +n01900150 +n05225602 +n05418717 +n05302499 +n05578095 +n09475179 +n09376198 +n14877585 +n15046900 +n00019613 +n00021265 +n15067877 +n09436708 +n14915184 +n07555863 +n07850329 +n07849336 +n07705711 +n07622061 +n07594066 +n07854982 +n07852833 +n07852614 +n07854184 +n07852229 +n07851443 +n07705931 +n07707451 +n07752966 +n07760859 +n07747055 +n07754684 +n07768694 +n07764847 +n07768858 +n07739125 +n07746551 +n07753113 +n07763987 +n07748574 +n07751451 +n07762244 +n07750872 +n07742704 +n07765208 +n07763792 +n07767847 +n07766173 +n07751004 +n07760153 +n07758680 +n07753592 +n07751280 +n07769731 +n07763629 +n07755411 +n07754451 +n07753275 +n07764155 +n07765073 +n07762114 +n07762913 +n07753743 +n07765999 +n07765361 +n07752377 +n07757132 +n07769584 +n07751148 +n07761141 +n07761309 +n07749731 +n07747951 +n07749446 +n07747607 +n07749582 +n07750449 +n07749969 +n07750146 +n07748157 +n07748416 +n07748276 +n07748912 +n07748753 +n07749192 +n07749312 +n07739344 +n07739506 +n07742313 +n07740220 +n07740954 +n07740461 +n07740342 +n07745940 +n07767171 +n07744246 +n07744057 +n07744811 +n07744682 +n07745466 +n07743902 +n07746334 +n07746186 +n07743544 +n07743224 +n07755707 +n07756951 +n07755929 +n07757990 +n07757312 +n07757511 +n07734744 +n07719213 +n07768423 +n07735510 +n07718472 +n07710283 +n07713395 +n07708398 +n07710007 +n07718747 +n07708798 +n07723039 +n07715561 +n07709333 +n07730406 +n07730033 +n07733394 +n07713267 +n07722217 +n07817871 +n07736813 +n07719839 +n07712267 +n07730207 +n07710616 +n07710952 +n07711569 +n07711080 +n07713763 +n07713895 +n07733567 +n07715103 +n07715221 +n07715407 +n07714990 +n07735687 +n07735803 +n07714188 +n07714448 +n07714895 +n07714571 +n07714078 +n07720442 +n07734017 +n07713074 +n07734555 +n07720615 +n07721325 +n07720875 +n07721195 +n07721018 +n07721456 +n07722052 +n07721942 +n07721678 +n07734292 +n07734183 +n07724943 +n07725376 +n07726095 +n07725255 +n07729485 +n07726796 +n07727458 +n07727048 +n07727578 +n07727868 +n07728804 +n07728053 +n07728585 +n07728181 +n07729384 +n07729828 +n07725531 +n07725789 +n07725888 +n07715721 +n07717070 +n07716906 +n07716358 +n07716034 +n07717556 +n07717410 +n07720277 +n07736256 +n07723330 +n07719616 +n07736692 +n07733712 +n07732747 +n07730855 +n07731587 +n07731006 +n07723559 +n07724654 +n07724269 +n07724492 +n07722485 +n07723177 +n07722888 +n07639069 +n07679356 +n07682197 +n07680517 +n07695878 +n07685730 +n07682316 +n07684517 +n07680761 +n07681691 +n07684600 +n07684164 +n07686720 +n07680932 +n07687211 +n07681450 +n07683786 +n07695742 +n07682477 +n07686873 +n07684289 +n07683490 +n07682808 +n07690585 +n07684938 +n07690892 +n07685399 +n07693972 +n07690273 +n07691091 +n07687789 +n07685218 +n07694516 +n07694839 +n07694659 +n07690511 +n07690739 +n07690431 +n07688624 +n07688898 +n07689003 +n07690152 +n07693725 +n07690019 +n07692614 +n07691758 +n07691539 +n07691650 +n07693223 +n07693048 +n07691237 +n07687626 +n07687381 +n07687469 +n07871810 +n07684084 +n14580897 +n15062057 +n14698884 +n14696793 +n14765422 +n14844693 +n15019030 +n12167075 +n14974264 +n14858292 +n15075141 +n04033425 +n07556637 +n07566340 +n07560652 +n07881800 +n07938313 +n07800091 +n07570720 +n01464844 +n07556406 +n07840804 +n07802417 +n07925608 +n07844867 +n07569644 +n07568502 +n07809096 +n07843775 +n07755089 +n07882497 +n07573347 +n07923748 +n07572957 +n07731952 +n07804323 +n07804771 +n07803093 +n07803545 +n07732168 +n07732636 +n07804657 +n07804900 +n07809368 +n07841345 +n07827284 +n07827130 +n07822518 +n07827410 +n07816052 +n07812184 +n07810907 +n07858595 +n07811416 +n07824702 +n07818277 +n07819769 +n07920989 +n07822323 +n07815424 +n07814390 +n07826930 +n07814487 +n07814203 +n07583066 +n07822845 +n07767344 +n07823105 +n07828987 +n07582609 +n07825972 +n07823460 +n07823698 +n07822197 +n07856270 +n07767709 +n07829412 +n07829331 +n07829248 +n07857731 +n07857170 +n07838233 +n07836838 +n07826091 +n07830593 +n07840027 +n07832416 +n07832902 +n07835921 +n07835457 +n07831146 +n07831267 +n07834618 +n07834507 +n07595914 +n07858978 +n07859583 +n07860103 +n07860331 +n07860447 +n07816164 +n07818689 +n07821260 +n07820683 +n07816575 +n07817160 +n07817315 +n07819166 +n07817024 +n07818995 +n07816398 +n07820497 +n07932841 +n07820145 +n07819896 +n07816296 +n07821758 +n07933154 +n07935379 +n07935043 +n07847198 +n07844042 +n07848196 +n07847453 +n07847917 +n07847827 +n07678729 +n07860805 +n07860988 +n07883031 +n07623136 +n07861158 +n07627931 +n07628068 +n07565161 +n07565083 +n07561590 +n07561112 +n07560903 +n07562495 +n07564971 +n07938149 +n07938007 +n07884567 +n07924033 +n07919310 +n07891189 +n07922764 +n07929519 +n07921455 +n07933274 +n07927197 +n07925966 +n07891309 +n07936263 +n07883251 +n07914271 +n07911371 +n07901587 +n07891433 +n07891726 +n07886176 +n07886057 +n07907943 +n07921615 +n07886572 +n07902121 +n07886463 +n07912211 +n07911677 +n07914777 +n07930554 +n07930433 +n07930315 +n07915491 +n07915094 +n07913393 +n07916041 +n07914995 +n07916183 +n07914413 +n07917392 +n07917133 +n07915918 +n07930864 +n07931870 +n07932039 +n07930062 +n07906111 +n07907037 +n07902799 +n07904865 +n07905474 +n07902937 +n07904395 +n07905038 +n07902336 +n07905979 +n07903101 +n07904760 +n07903208 +n07904934 +n07906284 +n07902443 +n07903841 +n07903962 +n07903731 +n07903643 +n07907161 +n07906718 +n07907831 +n07907548 +n07907429 +n07906877 +n07906572 +n07893253 +n07892418 +n07893642 +n07899003 +n07896287 +n07896661 +n07893528 +n07896165 +n07900225 +n07893891 +n07900406 +n07895237 +n07898745 +n07896060 +n07899108 +n07892512 +n07897750 +n07892813 +n07894703 +n07894102 +n07894551 +n07900616 +n07900958 +n07900734 +n07900825 +n07901457 +n07898117 +n07895435 +n07899434 +n07899292 +n07894298 +n07895595 +n07894965 +n07897865 +n07895839 +n07895710 +n07898333 +n07897438 +n07895962 +n07896893 +n07899899 +n07895100 +n07898443 +n07899533 +n07894799 +n07897975 +n07899660 +n07894451 +n07910656 +n07909593 +n07911249 +n07910048 +n07908411 +n07910379 +n07908647 +n07886849 +n07887634 +n07887099 +n07889510 +n07887192 +n07887304 +n07888229 +n07887967 +n07889274 +n07887461 +n07888465 +n07890226 +n07890352 +n07889814 +n07890068 +n07890540 +n07888816 +n07924834 +n07924443 +n07924276 +n07920540 +n07920222 +n07920052 +n07920349 +n07919441 +n07731284 +n07919572 +n07920872 +n07921239 +n07934282 +n07933799 +n07929172 +n07927931 +n07928488 +n07928367 +n07927512 +n07928887 +n07928696 +n07928790 +n07936745 +n07935737 +n07936548 +n07801508 +n07805594 +n07800740 +n07801091 +n07802026 +n07801779 +n07801892 +n07557165 +n07560193 +n07651025 +n07560331 +n07557434 +n07556970 +n05399243 +n15089258 +n07560542 +n07573696 +n07613815 +n07643981 +n07596684 +n07600696 +n07597145 +n07597365 +n07599998 +n07596967 +n07620689 +n07642471 +n07643200 +n07642742 +n07643026 +n07642933 +n07643306 +n07606538 +n07599911 +n07607138 +n07608429 +n07598256 +n07606669 +n07607605 +n07601572 +n07609632 +n07605597 +n07607967 +n07609215 +n07841907 +n07606764 +n07605944 +n07601686 +n07605380 +n07605040 +n07601809 +n07605474 +n07842130 +n07842044 +n07600285 +n07600177 +n07842202 +n07579688 +n07580053 +n07588947 +n07842753 +n07583197 +n07879350 +n07880751 +n07868200 +n07863802 +n07875152 +n07824191 +n07878785 +n07865484 +n07866015 +n07868955 +n07861557 +n07580253 +n07877187 +n07866868 +n07880458 +n07648913 +n07580470 +n07866277 +n07591961 +n07868508 +n07871436 +n07864934 +n07874780 +n07879659 +n07878926 +n07937461 +n07842433 +n07862611 +n07863374 +n07866723 +n07867021 +n07867164 +n07726525 +n07624466 +n07842308 +n07877299 +n07880080 +n07862348 +n07873464 +n07869775 +n07879953 +n07625061 +n07843636 +n07696403 +n07580592 +n07655263 +n07868340 +n07619004 +n07879174 +n07867324 +n07843464 +n07877961 +n07873807 +n07867421 +n07654298 +n07878647 +n07611839 +n07842605 +n07871720 +n07869611 +n07876651 +n07880968 +n07875436 +n07806221 +n07841495 +n07823951 +n07712382 +n07591586 +n07590320 +n07587111 +n07592481 +n07590611 +n07591473 +n07590502 +n07591049 +n07592768 +n07585758 +n07588193 +n07586894 +n07588299 +n07584110 +n07587441 +n07587023 +n07586099 +n07588574 +n07584332 +n07586604 +n07586718 +n07585107 +n07585557 +n07585208 +n07584593 +n07585906 +n07584423 +n07587618 +n07587700 +n07588111 +n07704054 +n07704205 +n07871234 +n07870167 +n07863547 +n07700003 +n07619208 +n07619409 +n07874159 +n07874343 +n07874259 +n07874441 +n07874063 +n07867751 +n07867616 +n07808587 +n07807834 +n07806633 +n07807171 +n07807710 +n07807922 +n07808904 +n07806774 +n07807472 +n07841639 +n07841800 +n07695965 +n07712748 +n07712559 +n07697825 +n07697313 +n07696728 +n07696625 +n07698543 +n07698401 +n07865105 +n07696977 +n07698250 +n07698782 +n07697100 +n07696839 +n07697537 +n07712856 +n07712959 +n07579575 +n07579787 +n07609840 +n07581346 +n07611991 +n07613266 +n07611358 +n07612632 +n07612996 +n07613480 +n07611267 +n07612367 +n07611148 +n07611046 +n07617611 +n07612137 +n07616386 +n07631926 +n07615774 +n07616487 +n07614730 +n07614500 +n07614198 +n07616748 +n07616046 +n07617051 +n07615671 +n07615190 +n07614825 +n07615460 +n07617708 +n07618432 +n07582152 +n07734879 +n07581775 +n07582277 +n07730320 +n07581249 +n15089645 +n15089472 +n15093137 +n15093298 +n15090742 +n15091473 +n14919819 +n15091669 +n14810561 +n14973585 +n15091304 +n15091846 +n15092227 +n15090065 +n07576438 +n07577374 +n07575984 +n07574602 +n07574426 +n07593199 +n07576182 +n07574923 +n07574780 +n07575726 +n07575076 +n07578093 +n07576577 +n07577144 +n07576781 +n07574504 +n07577538 +n09335240 +n00027167 +n09334396 +n09283193 +n03892891 +n09287968 +n03059685 +n00003553 +n09300905 +n09452395 +n09260907 +n08630039 +n08630985 +n09386842 +n08593262 +n08620061 +n09379111 +n08649711 +n08658309 +n08568978 +n08512259 +n03823111 +n04170933 +n09433839 +n08578517 +n08640739 +n08574314 +n08552138 +n08645104 +n08505018 +n08659861 +n08659446 +n08673395 +n08583455 +n08598301 +n08651247 +n03120491 +n02802544 +n08614632 +n08674739 +n08569998 +n08494231 +n08677424 +n08616050 +n08518171 +n08573842 +n08521623 +n03368352 +n03417345 +n04454908 +n03902482 +n04610879 +n08579352 +n03963645 +n03417749 +n08524735 +n08537837 +n08551296 +n08628141 +n08633683 +n08539072 +n09249034 +n09263912 +n08583292 +n09443281 +n08547544 +n08664443 +n04602044 +n08580944 +n03581125 +n08517676 +n08598568 +n08584914 +n03899933 +n02776631 +n03322099 +n03935234 +n04052442 +n03159535 +n15102894 +n09242389 +n09382099 +n09282208 +n09392402 +n09393605 +n09445289 +n03030880 +n03946162 +n03485997 +n03882960 +n04322026 +n03474896 +n02764398 +n02907082 +n03948830 +n09205509 +n09472413 +n09443453 +n09309292 +n09366017 +n09366317 +n09376786 +n09348460 +n09246464 +n09433442 +n09454153 +n09409752 +n09403734 +n09331251 +n09437454 +n09238926 +n09283866 +n09217230 +n09305898 +n09288635 +n09308743 +n09308572 +n09194227 +n09289331 +n09468604 +n09344324 +n09335809 +n09435739 +n09215437 +n09259219 +n09217638 +n09304750 +n09206896 +n09405787 +n09233446 +n09290444 +n09457979 +n09245515 +n09376526 +n09415671 +n09448690 +n09230041 +n09398076 +n09453008 +n09303008 +n09359803 +n09302616 +n09409512 +n09399592 +n09199101 +n09230202 +n09283405 +n09326662 +n09193705 +n09218641 +n09472597 +n09421951 +n09270735 +n09406793 +n09213434 +n09256479 +n09210862 +n09421799 +n09224725 +n09396465 +n09362945 +n09259025 +n09398677 +n09428293 +n09447666 +n09332890 +n08596076 +n09428628 +n09361517 +n09265620 +n09303528 +n09436444 +n09274152 +n09213565 +n09269472 +n09206985 +n09228055 +n09466678 +n09415584 +n09475925 +n09257843 +n09239302 +n09294877 +n00021939 +n00004258 +n00019128 +n02749953 +n02852523 +n03767112 +n14977504 +n03129123 +n03848729 +n03964744 +n04362025 +n04469003 +n04341686 +n03575240 +n03873064 +n03122748 +n03309808 +n02871147 +n03364340 +n14786479 +n03169390 +n04564698 +n04339291 +n00022903 +n03315023 +n03302121 +n03076708 +n04188643 +n03354613 +n14976871 +n03670849 +n02917521 +n04414909 +n04435180 +n02725872 +n04076846 +n02743547 +n03816849 +n04007894 +n03934656 +n03720163 +n04227144 +n04260364 +n03925226 +n04564581 +n02744844 +n04042358 +n03927091 +n03927539 +n03876519 +n04485423 +n03835197 +n03342127 +n04246271 +n04321238 +n04180314 +n03625783 +n03684611 +n03514693 +n03421485 +n04026180 +n02870526 +n04599396 +n06415688 +n03822171 +n04582205 +n03727605 +n03849679 +n04598792 +n03631922 +n02933649 +n03600722 +n03169176 +n03418618 +n02727016 +n03526198 +n03794798 +n03859608 +n03968581 +n03717447 +n03614782 +n03915900 +n04431025 +n03974070 +n02779435 +n03941231 +n04399382 +n03603442 +n09229709 +n03548402 +n03944138 +n04238128 +n04284869 +n03061211 +n03219135 +n09282724 +n09191635 +n09443641 +n04186268 +n03447358 +n03607029 +n03536348 +n02857023 +n04381860 +n04213626 +n03961939 +n04394630 +n03365592 +n04501550 +n04296562 +n03159640 +n04354182 +n03549732 +n03360300 +n03892178 +n02768973 +n03906224 +n03313333 +n02990373 +n02861886 +n03365991 +n02898711 +n03109693 +n13898207 +n04358874 +n02687821 +n03135532 +n03545756 +n03548626 +n03469175 +n03688943 +n02914991 +n04191595 +n09218315 +n03074380 +n02699494 +n02733524 +n04460130 +n04471148 +n03792048 +n03388043 +n03837869 +n03321954 +n02733213 +n03687137 +n03065424 +n02839110 +n03894379 +n03725717 +n04226464 +n03071160 +n03839993 +n02913152 +n04128413 +n04008947 +n03917198 +n03222318 +n04295881 +n03241335 +n02735688 +n02777734 +n03984381 +n03216828 +n03517899 +n03546340 +n04361095 +n13897996 +n03171356 +n03290195 +n03743902 +n03297735 +n04217882 +n02863426 +n03408054 +n03463381 +n03758089 +n03686130 +n02800497 +n03379828 +n03233744 +n02953197 +n04108822 +n03865557 +n04492749 +n04532670 +n04311004 +n03122073 +n03415486 +n04366367 +n04479939 +n03956922 +n03069752 +n04592465 +n03316406 +n03212811 +n03844673 +n04068441 +n04103094 +n03387653 +n04311595 +n03697007 +n04300358 +n04032603 +n02810782 +n03492250 +n03826186 +n03547054 +n04411264 +n03550153 +n03560430 +n03254189 +n03792972 +n04025508 +n03900979 +n02769963 +n03374473 +n02954163 +n03334291 +n04549028 +n03035252 +n03448956 +n04113765 +n03975035 +n04486054 +n02905152 +n03784896 +n04104384 +n02946127 +n04501947 +n03047052 +n04206790 +n03029197 +n03767745 +n04028581 +n04220250 +n04556948 +n04479823 +n04028764 +n04312432 +n03347617 +n03519387 +n04361260 +n03098959 +n02826886 +n02814860 +n02922292 +n04251701 +n04051825 +n03390786 +n02811936 +n02699770 +n04546855 +n03409393 +n04544325 +n02755823 +n03904657 +n02825961 +n02898369 +n04326799 +n02796623 +n03839795 +n03967942 +n03659686 +n03454707 +n04127395 +n03795580 +n02788148 +n02894605 +n03459775 +n04571566 +n04047401 +n03549589 +n04304680 +n03327234 +n03160309 +n03427296 +n03221720 +n03698815 +n03985881 +n04501370 +n03395514 +n02963821 +n04153025 +n03394649 +n03226880 +n03579538 +n04239074 +n04086446 +n02793842 +n03498662 +n04329834 +n04547592 +n04082710 +n04046974 +n03000134 +n03252637 +n03511175 +n04604644 +n03930313 +n04326547 +n04560882 +n02920369 +n03262072 +n03108853 +n04390977 +n03999160 +n03542333 +n04409384 +n02666943 +n02726681 +n02763604 +n03478756 +n03545150 +n04104500 +n04081699 +n03859280 +n03402941 +n03739518 +n03542605 +n03661043 +n02977936 +n03322570 +n03953416 +n04081281 +n03770316 +n04112654 +n03839671 +n03842012 +n04407686 +n04217546 +n03449564 +n03457902 +n04093625 +n03956157 +n04018399 +n02882190 +n03544360 +n04118635 +n02734725 +n04233124 +n03430418 +n04146050 +n03007444 +n04417809 +n03479397 +n03092166 +n02993546 +n04080705 +n08640531 +n03788498 +n08560295 +n04095109 +n04229737 +n03541696 +n03790755 +n03036022 +n03466839 +n03698723 +n03333610 +n03837698 +n03121298 +n04187547 +n03416489 +n02968074 +n03860404 +n03055857 +n02859443 +n04598318 +n02727426 +n03730334 +n03210552 +n04294879 +n03016389 +n03123809 +n02793495 +n03884778 +n03028079 +n04407435 +n04210390 +n04346328 +n03724756 +n04374735 +n03788195 +n03007130 +n03618982 +n02667576 +n02984061 +n02984203 +n03772077 +n02935658 +n04111414 +n02760099 +n02892499 +n02935891 +n03199647 +n02956699 +n03282295 +n04461437 +n03005033 +n03152303 +n04305210 +n03121431 +n03558176 +n03557360 +n02696165 +n03393017 +n04258438 +n02919792 +n04115256 +n02932400 +n03257210 +n03719053 +n03685820 +n03428090 +n03686924 +n04131368 +n03118969 +n03219483 +n04052658 +n02857477 +n03180865 +n04535524 +n03002816 +n04079244 +n03322836 +n04413969 +n02907873 +n03878066 +n04305323 +n03718458 +n04354026 +n03158186 +n04535370 +n03010915 +n03718935 +n04073948 +n03439348 +n03892557 +n03877845 +n03781244 +n02667379 +n02667478 +n03165616 +n03092314 +n03801671 +n03849814 +n03801533 +n03032252 +n03678729 +n03529860 +n03097362 +n04177931 +n02940385 +n03111041 +n03064935 +n03626115 +n02838728 +n03356858 +n02902079 +n04439585 +n03263076 +n04453037 +n03942920 +n03379204 +n03522003 +n03220692 +n02782778 +n02918112 +n02704949 +n03899768 +n03109881 +n02775178 +n03517647 +n03024064 +n02894158 +n04030518 +n03004824 +n02758134 +n03120198 +n03200231 +n04105893 +n02750070 +n03285912 +n03813078 +n02694045 +n04328946 +n03443005 +n03378005 +n02754656 +n03047941 +n03382292 +n04446276 +n04356925 +n03288500 +n04363991 +n04112579 +n03038685 +n03412058 +n03718581 +n02991302 +n03691817 +n04139395 +n03238131 +n02839592 +n02824319 +n03619890 +n03660909 +n04329477 +n04602762 +n04180229 +n02710324 +n03200701 +n04065464 +n03541091 +n04058096 +n02873839 +n03089879 +n02821627 +n03040376 +n03679712 +n03222176 +n03478907 +n04061793 +n02857644 +n04345028 +n03683708 +n03062122 +n04406239 +n03079741 +n03120778 +n03982331 +n02807731 +n03098688 +n02715513 +n04558478 +n03746486 +n04555291 +n04018667 +n03529175 +n03653740 +n04345201 +n03885535 +n04324387 +n04523831 +n04067818 +n03200539 +n02952585 +n03319745 +n04119478 +n03283221 +n04064862 +n03850245 +n04401680 +n04541987 +n03090172 +n04209613 +n03727465 +n03788601 +n03465718 +n03542860 +n03225108 +n03836062 +n03165466 +n03457008 +n03086580 +n03878211 +n03303831 +n03891538 +n03235042 +n04000592 +n03075946 +n02932019 +n03939677 +n02931148 +n03696065 +n02933462 +n03061505 +n04305572 +n02960352 +n02934451 +n04299370 +n03235180 +n04414199 +n02936714 +n03964495 +n03907227 +n04539203 +n03993703 +n03683079 +n03016737 +n03003730 +n04061969 +n02843276 +n04037220 +n03550289 +n03124590 +n04100519 +n03376159 +n04262161 +n02921884 +n03348868 +n04080454 +n03404449 +n02868638 +n03555006 +n04076713 +n03732114 +n03617095 +n02849885 +n03837606 +n03425325 +n03566193 +n03762434 +n03073694 +n03343560 +n03346455 +n02731398 +n02991847 +n03148324 +n04295571 +n03411544 +n02705201 +n03854722 +n04327204 +n04355267 +n03399677 +n04527648 +n03168107 +n02770211 +n03986704 +n03721590 +n03251533 +n02853016 +n03259505 +n04409625 +n03679384 +n03776460 +n03088389 +n02726305 +n04549919 +n02992032 +n03088580 +n04613696 +n03685307 +n04517408 +n03507241 +n03354207 +n03042490 +n03529629 +n04172107 +n04584373 +n04412416 +n02672371 +n03349892 +n02932693 +n02822064 +n03361297 +n03010473 +n04360501 +n03391770 +n03903868 +n02929289 +n03373943 +n02669295 +n04087826 +n02926591 +n04589593 +n03390983 +n03416094 +n03530642 +n04492375 +n03646916 +n03111296 +n03931765 +n04587648 +n03042697 +n04478512 +n02689144 +n03454536 +n03453443 +n04545305 +n02977619 +n04387261 +n02732827 +n04038727 +n03793186 +n04136510 +n02976350 +n03855333 +n02813399 +n04297750 +n04232800 +n03211789 +n04110178 +n03986562 +n04473108 +n03041810 +n03224603 +n03224753 +n03637898 +n03320959 +n03961711 +n02790669 +n02835829 +n03696301 +n03207630 +n04459773 +n03896526 +n03900393 +n03792526 +n04340935 +n03386011 +n03385557 +n02806088 +n03610098 +n03628511 +n02676938 +n02695627 +n03723781 +n03334382 +n02805983 +n03296328 +n03878963 +n02980441 +n02993194 +n03743016 +n04178329 +n02892201 +n03810952 +n03884926 +n03220237 +n03745571 +n03953020 +n03574555 +n04511002 +n03748162 +n03841666 +n02931417 +n03506370 +n03965456 +n03119203 +n03176763 +n04202417 +n03722288 +n02879309 +n04131208 +n04200800 +n02871525 +n03871371 +n04428634 +n03606251 +n04462240 +n03039827 +n02813544 +n03436417 +n03367410 +n03249342 +n03416640 +n03173387 +n04245508 +n02791270 +n04299215 +n04443257 +n03822656 +n02927161 +n03952576 +n03089624 +n03099274 +n02813645 +n08492461 +n03461385 +n03847823 +n04358707 +n03555426 +n03457686 +n04261281 +n03322704 +n08571898 +n03822504 +n02885882 +n03504723 +n03111690 +n03856012 +n03592245 +n03911513 +n04005630 +n04447443 +n04566257 +n03294048 +n03091374 +n03563967 +n03405265 +n03183080 +n02997391 +n04377057 +n03094503 +n03100490 +n06254669 +n03176594 +n02807523 +n03128519 +n03690938 +n04186051 +n03476991 +n03794136 +n03916031 +n03475823 +n02723165 +n03994008 +n03113152 +n02808185 +n03484487 +n03067339 +n04357314 +n03640850 +n02862916 +n04450640 +n03487444 +n02683791 +n03992325 +n03898271 +n03916470 +n03071021 +n04448070 +n03980026 +n02901793 +n04447276 +n04386792 +n03177165 +n03519081 +n03714235 +n03314780 +n03676087 +n03309687 +n03724066 +n03676483 +n04112752 +n03309110 +n03308481 +n02738031 +n03171228 +n02866578 +n02703275 +n03812924 +n02813752 +n02746365 +n03647520 +n02950256 +n03332393 +n03786715 +n02801450 +n03553248 +n02753044 +n04113641 +n04206570 +n04063373 +n04285146 +n03926148 +n03811847 +n03889726 +n03430959 +n04137444 +n03414162 +n03888257 +n03278248 +n02727825 +n02761206 +n03729951 +n02774921 +n04393095 +n02979290 +n03192543 +n04533802 +n02799897 +n03135030 +n03039259 +n04225729 +n04607035 +n03132261 +n02802721 +n03594148 +n04212282 +n03446832 +n04275661 +n04318131 +n02885338 +n02885462 +n03472232 +n04571292 +n02800213 +n02811059 +n02811204 +n02797881 +n02811350 +n02799175 +n03528901 +n03349771 +n04425804 +n04164406 +n04102037 +n04102162 +n04102618 +n03558404 +n03523987 +n04273972 +n03336282 +n03132076 +n04582869 +n03445924 +n03447075 +n04399537 +n03446070 +n04597066 +n03585073 +n03244047 +n04284341 +n04569822 +n03762332 +n04028074 +n03823216 +n03950537 +n04135024 +n03524150 +n03978686 +n03535780 +n03538037 +n04509260 +n03888605 +n04469514 +n02777292 +n04524142 +n03980478 +n03255030 +n02790996 +n03289660 +n02942699 +n03037404 +n03338821 +n03667664 +n02884994 +n03358726 +n03976467 +n03974915 +n04569063 +n03789171 +n03196062 +n03987266 +n04069434 +n04609531 +n04067658 +n03817191 +n04071263 +n03619396 +n04091097 +n03351434 +n04295081 +n04091693 +n03138669 +n03139464 +n04179824 +n03349469 +n02966687 +n03650551 +n03241093 +n03240683 +n03494706 +n04247876 +n03503718 +n04124202 +n03480719 +n02900160 +n04290615 +n04266162 +n02768226 +n02778669 +n04028315 +n03982430 +n02882647 +n03716327 +n03020416 +n04113406 +n03442756 +n04540255 +n03941417 +n04254680 +n03982232 +n02882301 +n04256891 +n03333252 +n04023962 +n02839351 +n03134739 +n03131967 +n04409515 +n03445777 +n04118538 +n03145719 +n03742019 +n02802426 +n03267113 +n03942813 +n03482877 +n02799071 +n04039742 +n02861147 +n04540053 +n03598930 +n06785654 +n03014440 +n04579986 +n03901750 +n02802215 +n03820318 +n03278914 +n03782006 +n03781787 +n04405762 +n04401088 +n03857828 +n03916720 +n02872529 +n02979186 +n02988304 +n04060647 +n02757462 +n03656957 +n03963294 +n04405540 +n03034405 +n02979074 +n02995345 +n03775388 +n04142731 +n04392985 +n03181293 +n03777754 +n03293741 +n04392526 +n02705944 +n02992529 +n04270371 +n03179910 +n03902125 +n03488438 +n03187595 +n04044498 +n04405907 +n04043733 +n04137773 +n03516996 +n03046921 +n04077430 +n03517760 +n04315948 +n03584254 +n04546340 +n03584400 +n03436182 +n02942349 +n04404997 +n03909160 +n04026053 +n04173511 +n04070003 +n03257586 +n03509608 +n04171208 +n04450243 +n04506506 +n03434188 +n03567066 +n02923129 +n03386544 +n03046802 +n03757604 +n03927299 +n03924679 +n04608923 +n03316105 +n03767459 +n03987990 +n03084834 +n03422072 +n02855390 +n02921029 +n03425769 +n03871524 +n02852360 +n04105704 +n04408871 +n04241573 +n04402057 +n03664943 +n03605915 +n03543012 +n03196990 +n03639497 +n02840134 +n04594218 +n02999410 +n03086868 +n02790823 +n03886641 +n02709637 +n03374838 +n02835412 +n04440963 +n03011018 +n03600977 +n03093792 +n03228967 +n04573281 +n03521076 +n04144241 +n04571958 +n04160372 +n03787523 +n02928299 +n04333869 +n03213826 +n04476972 +n04593866 +n02788689 +n04451818 +n04516672 +n04116512 +n03816136 +n03294833 +n04317420 +n02908217 +n03532342 +n04185071 +n04285622 +n03653220 +n04369282 +n03346135 +n03837422 +n04317833 +n03039947 +n04100174 +n04608567 +n04208427 +n04282872 +n03396074 +n02865931 +n04112147 +n04459909 +n03659292 +n04463679 +n03487090 +n03138344 +n04317976 +n03613592 +n04393808 +n03903424 +n04099003 +n03470629 +n04264628 +n02771004 +n04193377 +n04400737 +n02670683 +n04367011 +n03489162 +n03588951 +n03919430 +n03418242 +n03967562 +n03075097 +n03239726 +n03154446 +n04387706 +n03417970 +n04050066 +n04299963 +n03684224 +n03919289 +n03970156 +n03941684 +n03966976 +n04258859 +n04266486 +n03481172 +n03946076 +n04606574 +n04154565 +n04489817 +n04140064 +n03848348 +n04150980 +n04208210 +n02898269 +n04269944 +n02966545 +n03430313 +n03715386 +n03731695 +n04457910 +n03947466 +n02680754 +n03848168 +n02697675 +n02886434 +n03474779 +n03376938 +n03488188 +n04016240 +n04016576 +n03109150 +n02877962 +n02951585 +n03511333 +n03649909 +n03995856 +n04089976 +n03995372 +n03240140 +n03154073 +n04503593 +n02844307 +n02848216 +n03624400 +n02866386 +n03030557 +n03265032 +n04148054 +n03623556 +n02764044 +n04057047 +n04594828 +n03020692 +n03954731 +n04186848 +n04250473 +n04016684 +n04163530 +n02973904 +n02880842 +n03973628 +n03041632 +n03549473 +n02976123 +n03890093 +n03658185 +n04373089 +n03911658 +n02811468 +n03498962 +n04185804 +n04332074 +n04127521 +n03067212 +n04597400 +n03601638 +n04247630 +n04283585 +n03621049 +n02997607 +n03403643 +n04103206 +n04059516 +n03724417 +n03621377 +n04293119 +n03775199 +n03101517 +n03101986 +n03454885 +n03767966 +n03266371 +n04578934 +n02850732 +n03880531 +n03133878 +n02999138 +n04270147 +n03459328 +n03284981 +n04309548 +n03101796 +n03101156 +n04500060 +n03846677 +n04317325 +n03400231 +n04097760 +n04596742 +n04138977 +n03453231 +n03047799 +n03984234 +n03262519 +n04326676 +n03992703 +n04282992 +n03018209 +n02869155 +n03713436 +n03317788 +n03625646 +n03133050 +n04546194 +n03729826 +n03053474 +n03332271 +n04277352 +n04321453 +n04296261 +n03250847 +n03715669 +n02949202 +n04374315 +n02806379 +n04381724 +n04491388 +n02698634 +n03355925 +n03141823 +n03274265 +n04453156 +n04122349 +n04156140 +n03475581 +n02902687 +n04185946 +n03908714 +n04310904 +n03145522 +n04039381 +n04292414 +n04409806 +n02772700 +n04426316 +n04333129 +n03012013 +n04072551 +n03831382 +n03651843 +n04156946 +n03873416 +n02831894 +n04150153 +n03258905 +n04292921 +n02906734 +n04367480 +n04111190 +n04549629 +n04182322 +n03949317 +n03616428 +n02764779 +n03976657 +n03351979 +n03091044 +n04434531 +n03244231 +n03127408 +n04472563 +n04277493 +n02946824 +n02871824 +n04319937 +n04230603 +n03051396 +n02931836 +n04267577 +n03726993 +n03726760 +n02883004 +n04610676 +n03775847 +n04115996 +n03711999 +n03382856 +n03374372 +n04279353 +n03908204 +n03906997 +n03518943 +n03003091 +n03128248 +n03652100 +n02783161 +n04185529 +n04033901 +n03388183 +n03326948 +n03405725 +n03842156 +n03200906 +n04550184 +n02821943 +n04379243 +n04379964 +n04549122 +n03636649 +n03201035 +n04555400 +n02912065 +n02933112 +n02766320 +n02822579 +n03649797 +n03129753 +n02870880 +n03290653 +n03298716 +n04161981 +n04165409 +n03015254 +n03337140 +n04104147 +n02963302 +n04529681 +n03050546 +n02739550 +n02818832 +n02831724 +n03962852 +n03540914 +n02920083 +n04491638 +n03388549 +n03115762 +n02920259 +n04503413 +n04236809 +n04222210 +n03482252 +n03799876 +n03225988 +n03414676 +n03465426 +n04381587 +n03116530 +n02699629 +n02894337 +n04301000 +n03090000 +n03904060 +n03620967 +n03850492 +n04398951 +n03653583 +n04603729 +n03428226 +n03238586 +n03179701 +n03246933 +n03063968 +n04480033 +n03092883 +n03011741 +n02789487 +n03735963 +n04061681 +n04130143 +n04247736 +n03231368 +n03630262 +n04608329 +n04164868 +n03164722 +n03201208 +n03202354 +n04067921 +n03367059 +n04380533 +n04057981 +n03237340 +n03018349 +n03742115 +n02804414 +n03131574 +n02970534 +n03125729 +n03001627 +n04447861 +n04326896 +n04256520 +n03858418 +n02828884 +n03649674 +n03002711 +n04099969 +n04373704 +n04429376 +n04331277 +n03632729 +n03518445 +n02738535 +n04590933 +n03376595 +n04576002 +n03790953 +n02791124 +n03262932 +n04062428 +n03786621 +n04593077 +n03168217 +n02946270 +n03801880 +n04382438 +n03380724 +n04177755 +n03165096 +n03100346 +n03693474 +n03015149 +n04344873 +n03891251 +n03360622 +n03920867 +n04177820 +n04590021 +n03016953 +n03518305 +n02843553 +n03508101 +n03666591 +n06791372 +n03099945 +n03141702 +n03243218 +n03626760 +n03904909 +n03800933 +n04200537 +n04198797 +n03699975 +n03088707 +n02776205 +n04294212 +n03339643 +n03738472 +n02676261 +n04474466 +n03008976 +n02688443 +n04114844 +n03929660 +n03287351 +n03320046 +n03553019 +n03175604 +n02678897 +n04461879 +n04359589 +n03851341 +n04331639 +n04450749 +n03923918 +n03574816 +n03074855 +n04074963 +n03302790 +n03075768 +n04554406 +n04210120 +n04562262 +n02855089 +n04526964 +n02895606 +n02730265 +n04226826 +n03467796 +n04081844 +n03614007 +n03269401 +n02729965 +n03345837 +n03111899 +n04069276 +n02694426 +n03277771 +n04252331 +n03525827 +n03744840 +n03613294 +n03827536 +n04263760 +n03568117 +n03180969 +n02895438 +n03565288 +n02683558 +n03537241 +n03267972 +n04228054 +n03664675 +n04258333 +n03272239 +n04041069 +n03423479 +n03099147 +n04265275 +n04330267 +n03031422 +n03728437 +n07273802 +n06793231 +n06794110 +n06874185 +n03269203 +n02981321 +n03582959 +n04375405 +n03307792 +n02988963 +n03580518 +n04338517 +n03279153 +n03614532 +n04586932 +n02803349 +n03915437 +n03254862 +n03025886 +n02787622 +n04615226 +n04132603 +n03467517 +n02880546 +n04224842 +n03698360 +n03716887 +n03716966 +n03495258 +n02676566 +n03499907 +n04506289 +n03272010 +n04536153 +n04536866 +n02992211 +n04536335 +n04536595 +n04330998 +n04419642 +n03273551 +n04376400 +n03928116 +n03039015 +n03854065 +n02672831 +n03452741 +n04515003 +n04278353 +n03738066 +n02766792 +n03086457 +n03496296 +n04278247 +n03840681 +n04598582 +n02891788 +n03854815 +n03393324 +n04579667 +n03945615 +n03609397 +n03372029 +n02817799 +n03228016 +n04222847 +n02804610 +n03838899 +n03037709 +n04141076 +n02793089 +n02912894 +n03369276 +n03394916 +n04487394 +n03110669 +n03494537 +n03494278 +n03086670 +n03006626 +n03884397 +n02775483 +n03343354 +n03912218 +n03245724 +n02803934 +n02804252 +n02804123 +n03301568 +n03483230 +n02869249 +n03447721 +n04532831 +n04311174 +n03721384 +n03440682 +n03017168 +n03612965 +n03720891 +n03249569 +n03157348 +n02869737 +n02803666 +n04387400 +n04249415 +n04410086 +n04243941 +n03996416 +n03999992 +n02769290 +n04004475 +n03702248 +n03789946 +n04252653 +n02977058 +n03322940 +n03082979 +n04613939 +n03765561 +n04303357 +n03997484 +n03087069 +n04303497 +n04237423 +n04417180 +n04064401 +n02938886 +n04525305 +n04243546 +n02760199 +n03418915 +n02829596 +n03551395 +n04024274 +n03007591 +n03563200 +n04004767 +n03250405 +n03672827 +n03643737 +n03675235 +n04419868 +n03985069 +n04505036 +n02794664 +n04595285 +n03225777 +n02909285 +n03571942 +n04184435 +n03240892 +n03460040 +n03646296 +n03766044 +n03287733 +n03273061 +n03507963 +n03596285 +n02761557 +n02687423 +n03433877 +n04309049 +n03579982 +n04591517 +n03424630 +n03193107 +n03859000 +n04040373 +n04099175 +n03321103 +n02872333 +n04265904 +n02700064 +n04587404 +n04304375 +n03616763 +n03146846 +n03500699 +n03075634 +n04428191 +n03496892 +n03210245 +n03496612 +n04238763 +n06359193 +n03528523 +n04175147 +n03196324 +n04358117 +n04603399 +n03918480 +n03985232 +n03180011 +n03832673 +n03956785 +n03642806 +n03485407 +n03914337 +n04561422 +n03736064 +n03063485 +n04477219 +n04587559 +n03272125 +n03996145 +n02911332 +n03034663 +n03000684 +n04380916 +n04121728 +n02786837 +n04279462 +n03689157 +n03604156 +n03452267 +n02666196 +n02679257 +n03483823 +n04171831 +n04594489 +n03106898 +n03510244 +n02934168 +n03760310 +n04471632 +n03666362 +n03020034 +n03336575 +n03604843 +n04402984 +n03898129 +n04401828 +n03995265 +n03307037 +n03300443 +n03268918 +n04004990 +n03995535 +n03350602 +n03373237 +n03251932 +n04573937 +n04334365 +n03861271 +n04520784 +n04332243 +n02688273 +n03843555 +n04216634 +n04398834 +n03066849 +n03407865 +n02710201 +n04040759 +n03736970 +n04110955 +n04112430 +n02969010 +n03096960 +n03996849 +n02761392 +n02677718 +n03102859 +n03431243 +n04392764 +n03339529 +n04289027 +n04011827 +n02709367 +n03446268 +n04568069 +n03700963 +n04167346 +n04021798 +n03432129 +n04088797 +n02918595 +n03532672 +n04228215 +n03119510 +n04063154 +n04371774 +n04590746 +n04586581 +n04586421 +n03189083 +n04211528 +n03296081 +n02903204 +n03150232 +n04282494 +n03082807 +n02686227 +n02962200 +n03198500 +n02973017 +n04475411 +n03431745 +n04306592 +n02692086 +n04154152 +n04020298 +n04574999 +n03559999 +n03659809 +n03566329 +n03767203 +n04563204 +n04101701 +n02836035 +n02980036 +n03460147 +n04115144 +n03334912 +n04543772 +n04563413 +n02974003 +n04289690 +n03944341 +n03992509 +n03430551 +n03244919 +n03874293 +n04113194 +n04290507 +n02833793 +n03943115 +n04051549 +n02764505 +n04154340 +n03456299 +n03425413 +n02835724 +n04354487 +n03487886 +n02995871 +n03329302 +n04102406 +n02966193 +n04510706 +n03054901 +n03393761 +n03209359 +n02860415 +n04067472 +n04211857 +n02848523 +n03473227 +n03032811 +n04111668 +n03873699 +n03563460 +n03320421 +n03208556 +n04019541 +n02890188 +n04448361 +n03397947 +n03954393 +n04385799 +n03712111 +n04519153 +n04313503 +n03450018 +n03602883 +n04072193 +n04372370 +n02783459 +n02927887 +n04438507 +n03374649 +n03325088 +n04422875 +n02727141 +n03775636 +n04327682 +n04445952 +n04027023 +n03186818 +n03537412 +n03793850 +n03222516 +n02826589 +n03363549 +n03795758 +n03469493 +n03103396 +n03301833 +n02686379 +n03432061 +n03389611 +n04579432 +n04218564 +n03743279 +n03506560 +n02824448 +n03123917 +n03028596 +n03201529 +n04275548 +n03794056 +n03680858 +n04568557 +n03819994 +n03639077 +n03352628 +n04529962 +n04283255 +n04283096 +n04112252 +n03357716 +n04117464 +n03536122 +n04592741 +n03303217 +n03271574 +n02887079 +n03176386 +n02768114 +n04320973 +n03933933 +n03934042 +n02767433 +n04190052 +n03638883 +n02783994 +n04283378 +n02797692 +n04314914 +n02887209 +n03938401 +n02817031 +n04098513 +n03057920 +n03495570 +n04081044 +n02888569 +n04386051 +n02871005 +n04341414 +n03506184 +n04161358 +n04430475 +n03490884 +n04038440 +n03495039 +n02953455 +n03632577 +n02871439 +n03719343 +n03814639 +n03622839 +n02713003 +n02768655 +n02737660 +n03505133 +n03019685 +n02741475 +n04148579 +n03105467 +n04190376 +n04220036 +n04094720 +n04515129 +n02886599 +n04476831 +n02815950 +n04590263 +n03223686 +n04318787 +n03592773 +n03073977 +n03988170 +n04360798 +n02974348 +n03443149 +n03821518 +n02864593 +n03637181 +n04402449 +n03733131 +n04436329 +n04119751 +n04433585 +n04045644 +n03437941 +n04436185 +n03366974 +n03601840 +n02970685 +n03937931 +n03955489 +n04123740 +n03002096 +n02835915 +n02910145 +n02770830 +n04325041 +n03288886 +n04485082 +n04275175 +n03704549 +n03801760 +n02943871 +n03262809 +n02759257 +n04009801 +n03340723 +n03643253 +n03656484 +n03838298 +n03087366 +n02943241 +n02709101 +n03094159 +n04355933 +n03309465 +n03333711 +n03395859 +n03987376 +n03049782 +n04403413 +n04583212 +n03967396 +n04147495 +n03733925 +n04565375 +n03467068 +n03231160 +n02708711 +n03813176 +n03852280 +n03739693 +n03575958 +n02981911 +n03308152 +n04419073 +n04089836 +n04383015 +n03070193 +n03760944 +n02670382 +n04340521 +n03709206 +n03092656 +n04403638 +n03760671 +n02751295 +n03293863 +n03852688 +n04044716 +n04070207 +n03333129 +n04068601 +n02978478 +n03822767 +n04145863 +n03715114 +n03279508 +n03332989 +n03667829 +n02841506 +n03484931 +n03850053 +n03082280 +n03692522 +n03868643 +n03247083 +n04070415 +n04053508 +n02794156 +n03904782 +n04421872 +n02751215 +n03735637 +n03429288 +n04437953 +n02710600 +n02939866 +n03991837 +n04382880 +n04141975 +n04392113 +n03753077 +n03554460 +n04180888 +n04118776 +n02699915 +n04029734 +n03736470 +n04559730 +n04518343 +n02710429 +n03424862 +n04001499 +n03718335 +n04274985 +n02753394 +n03046257 +n04555897 +n04355338 +n04438304 +n03544143 +n03452594 +n03196217 +n02694662 +n04548280 +n02708093 +n03909406 +n03145147 +n03197337 +n02708433 +n03973839 +n04607869 +n04328186 +n03891332 +n03026907 +n04528968 +n03759661 +n02777100 +n02708555 +n03277459 +n03272810 +n03841143 +n02702989 +n04273796 +n03842986 +n04561287 +n04541320 +n03708843 +n04449966 +n03467984 +n02879718 +n02880393 +n02892948 +n03624134 +n04373894 +n04346157 +n04008634 +n02715712 +n03343853 +n04177041 +n02689274 +n03423306 +n03875955 +n02950826 +n02759963 +n03948459 +n04502851 +n03732020 +n03803116 +n04090263 +n04076284 +n04171459 +n02760429 +n03416775 +n03695857 +n04171629 +n02760855 +n02749479 +n02760658 +n03701391 +n04347519 +n02923682 +n04517211 +n03607659 +n04450133 +n03073296 +n03178674 +n04086273 +n03427202 +n03363749 +n03802007 +n04250224 +n04585980 +n02961451 +n03136369 +n03687928 +n03615790 +n02812949 +n03699591 +n03158885 +n04054361 +n03327691 +n02904640 +n02987492 +n04121511 +n03292475 +n03375575 +n02916350 +n02950943 +n03080633 +n04015908 +n02745611 +n03178000 +n03706229 +n03080497 +n02841315 +n04272054 +n04009552 +n04403925 +n03443912 +n04356056 +n04238617 +n03399761 +n03795976 +n03864692 +n03555662 +n02963503 +n04376876 +n04317175 +n03643149 +n03858183 +n04364545 +n04083800 +n03514451 +n03938037 +n04056180 +n03302671 +n04477387 +n04080833 +n04251144 +n03868863 +n02731629 +n03876231 +n04287747 +n02889646 +n03484576 +n03323703 +n04162706 +n03652932 +n04125853 +n02891188 +n03803284 +n02999936 +n02865665 +n02910353 +n03627232 +n03041114 +n03051249 +n02982599 +n03940256 +n03229244 +n04153751 +n04238321 +n02928608 +n04159354 +n03887185 +n03682487 +n04431745 +n03683606 +n03038281 +n03043958 +n02960690 +n03804744 +n04445327 +n03836451 +n02881906 +n02880189 +n03644858 +n03497352 +n04095342 +n03476313 +n04227900 +n03499354 +n02903126 +n02860640 +n02796318 +n04127249 +n04197781 +n03057541 +n04554871 +n03423719 +n03503477 +n03855604 +n03874599 +n04136800 +n03645011 +n03075370 +n03223162 +n03886762 +n02915904 +n03476684 +n03551084 +n03208938 +n03250089 +n04505470 +n04036303 +n03085013 +n03928814 +n03033362 +n04168199 +n03589513 +n03098140 +n04401949 +n03034244 +n03968293 +n03275681 +n03163222 +n04470953 +n04257986 +n02715229 +n02955247 +n04269270 +n04072960 +n04364160 +n04257790 +n02810471 +n04414675 +n03048883 +n04595855 +n03084420 +n03577090 +n03778817 +n04004210 +n03578656 +n03125057 +n03033986 +n03788047 +n03274561 +n03261776 +n03759954 +n03691459 +n04402580 +n03505667 +n03087816 +n02963692 +n04502670 +n02917377 +n04390873 +n04599124 +n04349401 +n03846772 +n03204955 +n04041747 +n04404817 +n03207305 +n04142999 +n04610274 +n04540547 +n03359285 +n03651388 +n03870980 +n04013729 +n04258138 +n03773035 +n03485198 +n02965783 +n04059947 +n03861842 +n02921756 +n02761834 +n04201064 +n03343737 +n04058594 +n04143140 +n04494204 +n03211117 +n03918737 +n03221351 +n04464615 +n03793489 +n02714751 +n03506727 +n02823124 +n04484432 +n03913343 +n03085219 +n03782190 +n04152593 +n03196598 +n03676759 +n03361380 +n04588739 +n03187268 +n02940570 +n03085602 +n02769075 +n02988066 +n03027250 +n03070059 +n03525454 +n04538552 +n02948557 +n03031152 +n02947818 +n03746005 +n03746155 +n02935017 +n03851787 +n03706653 +n03744276 +n03708036 +n04063868 +n02763306 +n03079230 +n04533946 +n02988679 +n02988486 +n02757061 +n03492542 +n03209910 +n03359436 +n04052757 +n04534359 +n02979399 +n04391838 +n03924069 +n03694639 +n04178190 +n03636248 +n03665366 +n03358172 +n03640988 +n02948072 +n03818343 +n04534895 +n04384910 +n03423877 +n03844045 +n03549897 +n03370387 +n04335886 +n04286575 +n03272383 +n03590841 +n03018712 +n03359137 +n03665924 +n03911767 +n03503997 +n04107743 +n04339879 +n03318294 +n04148703 +n04160847 +n03824713 +n02852173 +n04456115 +n03365374 +n03401129 +n03442597 +n03187037 +n04529108 +n03975232 +n03668279 +n03482523 +n04371050 +n03772584 +n04164757 +n03544238 +n04288272 +n04116098 +n03066359 +n02886321 +n03525074 +n04585745 +n03281145 +n03126707 +n04575824 +n03178430 +n03733281 +n03078287 +n03820728 +n03440216 +n04080138 +n03302938 +n03738241 +n03085915 +n04141712 +n04082886 +n04545858 +n04041544 +n04400289 +n04402746 +n03578055 +n03580845 +n04404412 +n04137897 +n04365328 +n03072201 +n03681477 +n04358491 +n03300216 +n04595028 +n04008385 +n03674440 +n04366116 +n03401279 +n03957315 +n04488202 +n04555700 +n03206908 +n02893692 +n03210683 +n03991062 +n02920658 +n04074185 +n03147509 +n02774152 +n02978881 +n03256032 +n02773037 +n03733805 +n03438257 +n03875806 +n03733644 +n03291819 +n04183329 +n03935335 +n02801938 +n04179712 +n04139859 +n03994614 +n02946921 +n04576211 +n04600312 +n02839910 +n02949542 +n03779370 +n02964843 +n04533700 +n02975212 +n02974697 +n04531098 +n03233905 +n04060904 +n03871083 +n04560292 +n02883344 +n03062336 +n03920288 +n03456024 +n04176190 +n04499062 +n04350581 +n02880940 +n02978753 +n04050933 +n02927764 +n04130257 +n03775546 +n03984759 +n02997910 +n04263257 +n04023695 +n04103769 +n02682922 +n04254120 +n02754103 +n03571280 +n03174731 +n02815749 +n03629520 +n03063073 +n03002948 +n04397452 +n03216710 +n03301940 +n04207343 +n03055418 +n04083309 +n02769748 +n04122685 +n02816656 +n04134008 +n02970408 +n03883524 +n03253886 +n02870676 +n04452528 +n03709823 +n04026417 +n03235796 +n03291963 +n04124098 +n04122825 +n03993180 +n04204081 +n04446844 +n03414029 +n03619793 +n03958227 +n03445617 +n04235860 +n03469903 +n03461288 +n04284572 +n03972524 +n04544450 +n03321563 +n03521899 +n03898395 +n03372549 +n04496872 +n04559910 +n02918831 +n03676623 +n04249882 +n04206225 +n02823750 +n04119360 +n03443371 +n04592099 +n03062245 +n04131690 +n03914438 +n03883385 +n03050864 +n03482405 +n02893608 +n04204238 +n04582349 +n03764736 +n02823510 +n04255586 +n03904433 +n02946509 +n04103364 +n03791053 +n04170037 +n04509417 +n04543158 +n02804515 +n03484083 +n02766534 +n02834778 +n03538634 +n04467099 +n02959942 +n04482393 +n02740533 +n04065272 +n04464852 +n04252077 +n02916179 +n03684823 +n04335435 +n03791235 +n04465501 +n03384352 +n02740300 +n02739889 +n03256788 +n02946348 +n04520382 +n04211219 +n03193597 +n03272562 +n04389854 +n04465358 +n04310018 +n03193260 +n03193423 +n03506880 +n04490091 +n02704792 +n03389761 +n03790512 +n03444034 +n02958343 +n04252225 +n03345487 +n04520170 +n04467665 +n04474035 +n03417042 +n03632852 +n04461696 +n03256166 +n04465666 +n03930630 +n03173929 +n03796401 +n03896419 +n03977966 +n02871314 +n04466871 +n03785016 +n02814533 +n03680512 +n03777568 +n03268790 +n03770679 +n03100240 +n03079136 +n02930766 +n04201733 +n04037443 +n03498781 +n04097373 +n02831335 +n04285965 +n04166281 +n03594945 +n03670208 +n03141065 +n02701002 +n04516354 +n04322801 +n04347119 +n03870105 +n03543394 +n04285008 +n03119396 +n03122295 +n02970849 +n03538406 +n03255899 +n03599486 +n03981924 +n03868242 +n04397027 +n03648431 +n04176068 +n02797295 +n04204347 +n03490119 +n02835271 +n04126066 +n04026813 +n03792782 +n02968473 +n03435991 +n02912557 +n04297098 +n03389889 +n02775039 +n03393912 +n03895866 +n02932523 +n02885108 +n04389521 +n03828020 +n04020912 +n03200357 +n04246855 +n04065789 +n02747177 +n03678558 +n04134523 +n03935116 +n02900705 +n03078995 +n03210372 +n03619650 +n04548362 +n02962843 +n03986355 +n03214582 +n03031012 +n04200000 +n03468821 +n02755140 +n03683995 +n04608435 +n04556533 +n02774630 +n03438863 +n03487533 +n04137217 +n02773838 +n04491769 +n03498441 +n03420345 +n04570815 +n02967294 +n03986949 +n03865371 +n04518764 +n02863750 +n03355768 +n02881193 +n03633091 +n02876657 +n02877266 +n03990474 +n03950228 +n02808440 +n03786901 +n02909870 +n03241496 +n03129001 +n04591887 +n04001265 +n04493381 +n03572321 +n04438897 +n02801525 +n03784270 +n02758960 +n03029445 +n02795169 +n04388743 +n03593526 +n02993368 +n04447028 +n03350204 +n04149083 +n04263336 +n04246060 +n03983396 +n04557648 +n03603722 +n02985963 +n03449451 +n03937543 +n02962061 +n03359566 +n02823428 +n03571625 +n03174450 +n04579056 +n03140431 +n04591713 +n02960903 +n03923379 +n04579145 +n04560804 +n03521675 +n03295246 +n04422727 +n02952374 +n04518132 +n03709363 +n03595409 +n04139140 +n04398044 +n03259401 +n04516214 +n04324297 +n03612814 +n02939185 +n03915118 +n04397768 +n03063689 +n03064250 +n04132985 +n04399158 +n04225031 +n03543603 +n03379343 +n03797390 +n03693707 +n04389430 +n03063599 +n04443766 +n02824058 +n02836174 +n02843158 +n04553703 +n02788572 +n02823335 +n04592005 +n03610418 +n03426134 +n04560113 +n04173046 +n02732072 +n04078574 +n04562935 +n04049303 +n02951703 +n02705429 +n03101664 +n02815834 +n04516116 +n03725600 +n04522168 +n03133415 +n03593122 +n03960374 +n04476259 +n02982515 +n03259009 +n03004275 +n04131929 +n03416900 +n03565830 +n03543735 +n03858085 +n04255163 +n02747802 +n03871628 +n02919414 +n03167978 +n02778456 +n03500389 +n03870672 +n02782681 +n02971356 +n03064758 +n04200258 +n04253057 +n03908618 +n03127925 +n02786331 +n04589325 +n03014705 +n04340750 +n02998003 +n03710193 +n02978055 +n02836392 +n03871724 +n04452615 +n04462011 +n03064350 +n03535024 +n04477548 +n02989099 +n02977438 +n04125257 +n02976939 +n04125021 +n04469813 +n03002341 +n04214282 +n04019101 +n04172342 +n03538179 +n04524313 +n04231693 +n04103918 +n04467307 +n04196502 +n03678362 +n03306385 +n04212165 +n04468005 +n02924116 +n03680942 +n03394272 +n03896233 +n04349306 +n03711044 +n03394480 +n03078802 +n02917067 +n04487081 +n03769881 +n04146614 +n04310157 +n02918964 +n04099429 +n03764276 +n03773504 +n03125870 +n04235291 +n03478589 +n04389033 +n03886053 +n03919096 +n03549199 +n02686568 +n04530566 +n04264914 +n03547229 +n03510583 +n04308084 +n03666917 +n03491032 +n03439814 +n03512147 +n04552348 +n02691156 +n02759387 +n02867715 +n02704645 +n04012084 +n02690373 +n02842573 +n03365231 +n03595860 +n03335030 +n04308273 +n04160586 +n02686121 +n04583620 +n03604311 +n03596543 +n04308397 +n03577672 +n02692877 +n02850950 +n02782093 +n03541923 +n02858304 +n04476116 +n04610013 +n04194289 +n04128837 +n02792409 +n03662601 +n03977592 +n03447447 +n04158807 +n02792552 +n04095210 +n04495843 +n04024983 +n03939178 +n04244997 +n03329663 +n04409128 +n02947660 +n03344393 +n03790230 +n03236423 +n03981566 +n03545470 +n04229480 +n02951358 +n03199901 +n04037964 +n03105306 +n04612504 +n03436891 +n03602081 +n04115456 +n03609235 +n03861430 +n03254374 +n04038231 +n04038338 +n04273569 +n03859170 +n02932891 +n03552749 +n04197110 +n04606251 +n03896103 +n03947888 +n03668488 +n03541269 +n04309348 +n02965300 +n04224543 +n04552696 +n03673027 +n03698604 +n02965216 +n03141327 +n03874138 +n04317063 +n02878222 +n03095699 +n02784124 +n03845190 +n04347754 +n03466493 +n03397266 +n02812201 +n03466600 +n02687172 +n03718212 +n03180504 +n02755529 +n03811295 +n04612373 +n03045228 +n03327133 +n04242408 +n03612010 +n03186285 +n04128499 +n02793199 +n04147183 +n04587327 +n04483307 +n02981792 +n02982416 +n04266014 +n04264765 +n03218198 +n02860847 +n02861022 +n04336792 +n03122202 +n06271778 +n06255081 +n06263609 +n06276697 +n06272290 +n06276501 +n06277280 +n06281040 +n06277135 +n06278338 +n06278475 +n06274760 +n06272803 +n06272612 +n06263369 +n06266417 +n06595351 +n06267145 +n06596607 +n06596727 +n06596364 +n06596474 +n06267893 +n06267564 +n06267655 +n06266633 +n06267991 +n03938244 +n03872495 +n04135315 +n02823964 +n03408444 +n02967626 +n04053677 +n04151940 +n04453910 +n03380867 +n04014297 +n03045698 +n04605726 +n04513827 +n03050026 +n03724870 +n03341153 +n03366823 +n03058107 +n02952237 +n03357376 +n03221059 +n03376279 +n03956623 +n03261603 +n02944459 +n04201297 +n02954938 +n03717622 +n03661340 +n04041243 +n02877765 +n03825788 +n03047690 +n04199027 +n02735538 +n02872752 +n03361550 +n04241394 +n03865949 +n04122578 +n04239786 +n03027625 +n04124370 +n04272389 +n02904927 +n04593524 +n04545748 +n02855701 +n02713364 +n03041449 +n03411079 +n03680355 +n04120489 +n03868406 +n02882894 +n03967270 +n04022332 +n04133789 +n03025250 +n04027706 +n04386664 +n03364008 +n03297103 +n03600475 +n02925666 +n04228581 +n03521544 +n04089666 +n04116294 +n03516844 +n04542715 +n03124043 +n03798061 +n02873733 +n03067518 +n03046133 +n04554211 +n04444749 +n03797896 +n04192858 +n02888270 +n04151581 +n04187233 +n02826068 +n04181718 +n04191943 +n04281375 +n04416005 +n04105068 +n03314608 +n03530910 +n04187061 +n02955065 +n03725035 +n03315644 +n03142679 +n02937958 +n02739668 +n02840245 +n02840619 +n03546766 +n02851099 +n03673767 +n03959701 +n03539433 +n02740764 +n02895154 +n03513376 +n02950632 +n03623338 +n03929855 +n04130907 +n04589890 +n03347037 +n04590553 +n03788365 +n03637318 +n03889871 +n03652729 +n02825657 +n04172776 +n02843684 +n02951843 +n03610524 +n02763901 +n04507155 +n03415252 +n03409591 +n04357121 +n03718789 +n03220513 +n03522100 +n04435653 +n03546235 +n04523525 +n04234887 +n03413684 +n04417672 +n03148727 +n03435593 +n03847471 +n02796207 +n04087709 +n03527444 +n04141327 +n04207763 +n03548086 +n04423845 +n03213538 +n03657121 +n03424325 +n03314378 +n04229816 +n02983189 +n02862048 +n04192698 +n03000247 +n02916936 +n03112719 +n03146219 +n02933340 +n04045255 +n02873520 +n04589190 +n03592669 +n03151077 +n04211356 +n04525584 +n04590129 +n04102285 +n04418357 +n04209239 +n02925107 +n02890513 +n03436549 +n03291741 +n02992368 +n07248320 +n03590306 +n03958752 +n04207151 +n03885293 +n03654576 +n02767665 +n03114379 +n02785648 +n02876084 +n04240752 +n02820210 +n04236377 +n02851939 +n03309356 +n04231272 +n04162433 +n02786058 +n04369025 +n02979836 +n03267821 +n04033995 +n02683323 +n02849154 +n02822220 +n03731483 +n03898633 +n03266749 +n03128427 +n03123553 +n04034262 +n04046400 +n03688405 +n04118021 +n03223299 +n03727837 +n04144539 +n04183217 +n03998194 +n02904233 +n04297847 +n04066270 +n02908773 +n03353951 +n03445326 +n04528079 +n03875218 +n03805725 +n03437430 +n03115897 +n03284743 +n04525417 +n03342015 +n03284886 +n03285578 +n03844233 +n04557308 +n03646020 +n04581102 +n03261019 +n03973402 +n03642444 +n04450994 +n04084889 +n04412097 +n03337383 +n03729308 +n03970546 +n03802393 +n04395024 +n04525038 +n02809105 +n03615406 +n02828427 +n04123567 +n03188725 +n04539794 +n03253796 +n03013850 +n03115400 +n04459610 +n03132666 +n03885194 +n03019938 +n03326795 +n03115180 +n04525191 +n04138261 +n03625355 +n04137355 +n04003856 +n03356982 +n04568841 +n03409297 +n02944579 +n04605163 +n02977330 +n04395106 +n03779128 +n02904803 +n04524941 +n04198453 +n02878425 +n03703862 +n03819595 +n03877351 +n04613015 +n03914831 +n03932670 +n03785237 +n04414476 +n04056932 +n02675219 +n03106722 +n03917814 +n03016868 +n02922798 +n04432662 +n02802990 +n03631177 +n04189282 +n03435743 +n03983612 +n03175189 +n03357267 +n04184316 +n02942460 +n03836906 +n03233123 +n03430091 +n03855214 +n03386726 +n03437741 +n04599235 +n04350458 +n04383839 +n03653110 +n04502502 +n03854421 +n02952109 +n03298858 +n03160740 +n03843438 +n04393549 +n02903852 +n03947798 +n03529444 +n04482297 +n03227317 +n03595523 +n03429914 +n04496614 +n03016609 +n03485794 +n03463666 +n03258330 +n03207743 +n04459362 +n02786198 +n03471190 +n02834397 +n04127904 +n03897943 +n03490006 +n03887697 +n03207835 +n03381776 +n03383099 +n04278447 +n03505383 +n04455652 +n03712337 +n02782602 +n03598151 +n03775747 +n03410571 +n03696568 +n04307767 +n03645577 +n03358380 +n04208065 +n03809603 +n02820556 +n03703730 +n03938522 +n04045397 +n03663531 +n03662719 +n03703945 +n03662887 +n04326084 +n02897820 +n14943580 +n14785065 +n15074568 +n14820180 +n04035912 +n03766935 +n04313628 +n03530511 +n03460297 +n03149686 +n03455488 +n03344642 +n03796522 +n03043693 +n02681392 +n04339638 +n15102455 +n04234455 +n03341297 +n04453390 +n14908027 +n14976759 +n03111177 +n03282401 +n03451798 +n03292603 +n03815149 +n03723267 +n02892304 +n07621618 +n02732572 +n03178782 +n02681518 +n03397087 +n03635108 +n04395651 +n03762602 +n03282591 +n06883725 +n03516367 +n04682462 +n03354903 +n02788021 +n04458633 +n03140292 +n03362890 +n05244934 +n11487732 +n03597469 +n03397532 +n03649161 +n03914106 +n02787435 +n03030262 +n02685082 +n02887970 +n02852043 +n03909020 +n03814906 +n03436075 +n03899328 +n04096066 +n03895293 +n04215402 +n04461570 +n03904183 +n03519981 +n02969323 +n04426618 +n04466613 +n03215508 +n03306610 +n02744323 +n02762508 +n02758863 +n04335209 +n04334599 +n03948242 +n03539678 +n02680512 +n03089014 +n03895585 +n04493505 +n04244379 +n04250850 +n04562496 +n02984469 +n02795528 +n03944672 +n03533014 +n04385536 +n03231912 +n03147280 +n04257684 +n04497962 +n04298661 +n03415749 +n02981024 +n04048441 +n04391569 +n02784218 +n03572107 +n02680337 +n03957420 +n02992795 +n03506028 +n03438071 +n04440749 +n02739427 +n04040247 +n02971167 +n04381994 +n04087432 +n03153375 +n03438661 +n03527149 +n03963198 +n04284002 +n04380346 +n03383948 +n04284438 +n04263502 +n04398688 +n04350769 +n04597913 +n03557270 +n04381073 +n03180384 +n02976249 +n02928049 +n04307986 +n04380255 +n02973805 +n02687992 +n04406817 +n02693246 +n02692232 +n03745146 +n04329190 +n04306080 +n04551055 +n03452449 +n03131669 +n03768916 +n03214253 +n03587205 +n03406966 +n03093574 +n03672352 +n03051540 +n02729837 +n03655720 +n03456186 +n02855925 +n03825080 +n04015204 +n03859495 +n03815482 +n03625943 +n03692379 +n02728440 +n03068998 +n03763968 +n03502509 +n03877472 +n03419014 +n02742322 +n04596852 +n03863108 +n03441112 +n02671780 +n02846141 +n03381126 +n02756098 +n04059157 +n02814774 +n03746330 +n04335693 +n04241249 +n04194127 +n03863262 +n04001845 +n02738859 +n03386870 +n03216402 +n02730930 +n04207903 +n03121897 +n03015478 +n03268645 +n04266375 +n03623198 +n03450516 +n04532106 +n03010795 +n02669723 +n02811719 +n03324928 +n03239259 +n03615563 +n03513137 +n03531281 +n04498389 +n03497657 +n02954340 +n03124474 +n04432203 +n03379051 +n03492922 +n03127747 +n04356595 +n03404360 +n03124170 +n02817516 +n02859184 +n04248507 +n03325941 +n02987379 +n04259630 +n04482177 +n02818135 +n03984643 +n02869837 +n03950899 +n02881757 +n03766322 +n03046029 +n03937835 +n02799323 +n03103563 +n04209133 +n03610682 +n02776825 +n03331077 +n04387095 +n02831237 +n04232153 +n03049924 +n04228693 +n04556408 +n02807133 +n03787032 +n04612026 +n02816768 +n03502331 +n04143897 +n04104770 +n03188531 +n04605572 +n04097866 +n04574067 +n03655072 +n04230808 +n04508163 +n04172904 +n04531873 +n04197391 +n03863923 +n03540090 +n02922578 +n04488530 +n04489008 +n04332580 +n03404149 +n03816005 +n04370774 +n03657511 +n04371563 +n03487642 +n04046277 +n04350905 +n04370048 +n03450734 +n03314884 +n03826039 +n02998841 +n03719743 +n03797182 +n03505504 +n04495698 +n03325584 +n04325704 +n03520493 +n03615655 +n03237992 +n03617480 +n02667093 +n02807616 +n03410938 +n04269822 +n03866082 +n03454442 +n03770439 +n03617312 +n03732458 +n02780815 +n03205669 +n04136333 +n03534580 +n03920737 +n02892767 +n03387323 +n04223299 +n03421324 +n03132776 +n04508949 +n02863014 +n02944146 +n04514241 +n03013580 +n04508489 +n03112869 +n03885788 +n04103665 +n03673450 +n03688192 +n02930214 +n04509171 +n03824381 +n02854739 +n04426427 +n02837887 +n02901114 +n03885028 +n03234164 +n04602956 +n03629231 +n03595614 +n03163381 +n03978966 +n03057021 +n03045337 +n04252560 +n04363777 +n03254046 +n04187970 +n03398228 +n03630383 +n03456665 +n03589791 +n04049405 +n02957008 +n04123448 +n03404251 +n03751269 +n04222307 +n02867966 +n03902756 +n04368496 +n03228254 +n02864504 +n03891051 +n03844815 +n04479046 +n03770954 +n04122492 +n03980874 +n04445154 +n04445040 +n03607923 +n04173907 +n04497570 +n04186455 +n02936402 +n04205318 +n03877674 +n04370288 +n04132158 +n02896442 +n03019434 +n04233715 +n03600285 +n03903733 +n03688605 +n03594734 +n03107488 +n03660124 +n04337287 +n02825442 +n02910864 +n03543112 +n02831595 +n03653833 +n03815615 +n03128085 +n02865351 +n04591157 +n02883205 +n02847631 +n03710721 +n04371430 +n02837789 +n03226538 +n03943920 +n04222470 +n03885669 +n02925519 +n04427715 +n04504141 +n04502197 +n02963159 +n04370456 +n04021028 +n04453666 +n03464053 +n02944075 +n03236735 +n02861387 +n02854926 +n03480579 +n03062015 +n04136161 +n02936570 +n04355511 +n03013438 +n04334105 +n03450230 +n03604400 +n03205574 +n02898585 +n04397645 +n02781121 +n03429682 +n03775071 +n03616979 +n02827606 +n03405595 +n03781683 +n03527565 +n02972397 +n03540267 +n04434932 +n04254777 +n04323819 +n03885904 +n03710637 +n02752496 +n04378956 +n03622931 +n02736798 +n03836976 +n03026506 +n03384891 +n03289985 +n03859958 +n02726017 +n03113657 +n03320519 +n03113835 +n03398153 +n04285803 +n02669534 +n03206718 +n03476083 +n03201776 +n02780704 +n03201638 +n03239054 +n02683454 +n04459018 +n04584207 +n03237416 +n02887489 +n02752615 +n03528263 +n03251766 +n04517823 +n03584829 +n04488857 +n03150511 +n04580493 +n04179913 +n04174101 +n03620052 +n03534776 +n04475631 +n04309833 +n03207941 +n04070727 +n04554684 +n03102654 +n03273913 +n03557590 +n03170635 +n04442312 +n03761084 +n04442441 +n03063338 +n03543254 +n04542943 +n03212114 +n03297495 +n04330340 +n03862676 +n03378174 +n03557692 +n03102371 +n03273740 +n03425595 +n04003241 +n02905036 +n04111531 +n03259280 +n03425241 +n03483316 +n03050655 +n04277826 +n04496726 +n04607242 +n02808304 +n03219010 +n04499446 +n02821030 +n03938725 +n04188179 +n04439712 +n03971218 +n03223553 +n02856463 +n03250279 +n03882058 +n03635668 +n02846511 +n04251791 +n04189816 +n02731900 +n04225987 +n04214046 +n04149813 +n04543996 +n03502200 +n03005285 +n03969259 +n04254009 +n04446521 +n04208936 +n04559451 +n03371875 +n03993053 +n04108268 +n03106110 +n03644378 +n02919890 +n04290079 +n03107046 +n04426788 +n02874537 +n04581829 +n03641569 +n03367545 +n04598965 +n04605321 +n00004475 +n00006484 +n12739332 +n00017222 +n00015388 +n01326291 +n11537327 +n00007846 +n12992868 +n00005787 +n12172906 +n13083586 +n13123431 +n11536673 +n11552806 +n13083023 +n13100156 +n12476510 +n11545524 +n11552386 +n13121544 +n12205694 +n13100677 +n13103136 +n13085113 +n13084834 +n13134302 +n13084184 +n12477163 +n12477583 +n12477747 +n12480895 +n12479537 +n12481458 +n11547562 +n11545714 +n13221529 +n13220122 +n13223265 +n13223588 +n13223710 +n12953206 +n13194572 +n13205058 +n12961879 +n12953484 +n13186654 +n13197274 +n13173882 +n13229543 +n13192625 +n13185269 +n13193642 +n13207335 +n13183056 +n13200651 +n13195341 +n13206817 +n13199970 +n12957924 +n13198914 +n13199717 +n13215586 +n13190747 +n13193856 +n13194036 +n11665372 +n11596108 +n12694486 +n11666854 +n11669921 +n11672400 +n12606438 +n12799776 +n11736694 +n12008487 +n11955896 +n12879527 +n12884260 +n12034141 +n12290748 +n12026476 +n12833149 +n11892817 +n12914923 +n11969607 +n11794024 +n12026018 +n11672269 +n12830222 +n11811473 +n12022054 +n11971406 +n11826198 +n12950314 +n11857875 +n11988596 +n11939699 +n11915214 +n11821184 +n12293723 +n11814584 +n11725015 +n12890265 +n11733312 +n11859472 +n11971248 +n11888800 +n11971927 +n12898774 +n11810358 +n11904109 +n11943407 +n11978233 +n12683407 +n12950126 +n11726707 +n11813077 +n11889619 +n11905749 +n11812910 +n11900569 +n12020184 +n11960245 +n11859737 +n12909421 +n12041446 +n12909917 +n11992806 +n11807979 +n11925303 +n11971783 +n11939491 +n11918473 +n11989869 +n11727091 +n11793779 +n11891175 +n11792341 +n11839568 +n11943660 +n11947802 +n12475242 +n11815491 +n12480456 +n11839823 +n11732567 +n12475035 +n12360108 +n12833985 +n11941924 +n11883328 +n11719286 +n11736851 +n11887119 +n12001707 +n11950345 +n11892637 +n11805956 +n11892029 +n11806219 +n12008252 +n11918286 +n11962272 +n12093600 +n12836862 +n12093329 +n11733054 +n12020507 +n11931918 +n11958080 +n12877838 +n11812094 +n11811706 +n11923174 +n12023726 +n12023407 +n11923637 +n11990313 +n11915899 +n12030908 +n12015221 +n11990167 +n11981192 +n11980318 +n11972759 +n11921395 +n12294124 +n12295796 +n12294723 +n12294331 +n12294871 +n12296432 +n12295033 +n11726269 +n11725821 +n11725973 +n12891305 +n12891643 +n11978713 +n11979527 +n11978961 +n11979715 +n12683571 +n12683791 +n11901759 +n11908549 +n11901294 +n11903671 +n11901977 +n11902389 +n11908846 +n11901597 +n11905392 +n11902200 +n11906917 +n12044467 +n12052787 +n12056217 +n12075830 +n12055516 +n12083113 +n12047884 +n12048056 +n12080820 +n12070381 +n12061380 +n12080395 +n12061614 +n12074408 +n12070583 +n12071744 +n12049282 +n12047345 +n12064389 +n12075010 +n12052447 +n12053405 +n12050533 +n12077944 +n12086539 +n12064591 +n12058822 +n12046028 +n12083591 +n12073991 +n12043444 +n12086012 +n12073554 +n12046815 +n12063639 +n12058630 +n12084890 +n12070016 +n12076223 +n12069679 +n12048399 +n12049562 +n12076577 +n12086192 +n12074867 +n12075299 +n12072722 +n12066018 +n12084555 +n12070712 +n12079963 +n12065316 +n12059314 +n12085664 +n12050959 +n12062468 +n12085267 +n12078172 +n12057211 +n12057447 +n12056758 +n12056601 +n12043836 +n12043673 +n12067193 +n12066630 +n12062781 +n12062626 +n11808299 +n11808721 +n11808932 +n11808468 +n11809594 +n11809094 +n11727358 +n11727738 +n11727540 +n11816649 +n11816336 +n11816829 +n11816121 +n11815918 +n11815721 +n12362274 +n12362668 +n12361946 +n11950877 +n11950686 +n11961100 +n12020736 +n12020941 +n11934616 +n11933546 +n11934807 +n12879963 +n12015959 +n11836722 +n11860555 +n12258885 +n11980682 +n12016567 +n11737534 +n11965627 +n11991263 +n11989393 +n12006766 +n12887293 +n12937130 +n12291959 +n11972291 +n11927215 +n12012111 +n11970586 +n11963932 +n11966215 +n11966083 +n12006930 +n12007196 +n11600372 +n11599324 +n11603246 +n11602873 +n11603835 +n11601333 +n12484784 +n12610328 +n11791569 +n11714853 +n13122364 +n11715430 +n11715678 +n12801781 +n11728099 +n11786131 +n12150028 +n12801520 +n11789066 +n11792742 +n12152532 +n12151615 +n12152722 +n11733548 +n11720353 +n12810595 +n12342299 +n13238375 +n12867826 +n12665048 +n11973341 +n12312728 +n11818069 +n12848499 +n11779300 +n12822955 +n12816508 +n12719684 +n12350758 +n12095020 +n11861641 +n11962667 +n12870891 +n12939282 +n12812478 +n12031927 +n12023108 +n12858150 +n12861892 +n12841007 +n12212361 +n12869061 +n12906214 +n12910285 +n12486574 +n12090890 +n12702948 +n12437513 +n11968931 +n11817914 +n11772408 +n12932173 +n12817694 +n11910460 +n12603449 +n12939874 +n12002428 +n12015525 +n11807108 +n12835331 +n12168565 +n12840362 +n12352287 +n11969166 +n11968704 +n12821895 +n12344283 +n11866248 +n11995092 +n12622875 +n11735053 +n12548280 +n13150894 +n12685431 +n12387633 +n12171966 +n12796022 +n12934036 +n12443323 +n12870535 +n12682668 +n12778605 +n12623077 +n12836212 +n11982115 +n12003696 +n12005656 +n12098403 +n12606545 +n11902709 +n12882945 +n12785889 +n11986511 +n12682411 +n12469517 +n12029635 +n12860365 +n12552309 +n11977303 +n11825351 +n12836337 +n12844939 +n12925179 +n11926833 +n12604228 +n11752578 +n12855042 +n11956850 +n12092262 +n12506991 +n12882779 +n11747468 +n12385429 +n12822115 +n12821505 +n12607456 +n12819728 +n12817464 +n12811027 +n12024445 +n12573474 +n12864545 +n11949402 +n11868814 +n11953038 +n12599435 +n12840749 +n13233727 +n12342498 +n12795555 +n11984542 +n12847008 +n12719944 +n11855274 +n12095647 +n12441183 +n12942572 +n12602980 +n12684379 +n12441390 +n12785724 +n11916696 +n12574320 +n12092417 +n12036939 +n11700058 +n12845413 +n11824146 +n11910271 +n11916467 +n11807525 +n12101870 +n11939180 +n12353754 +n12104501 +n12794985 +n12355760 +n12793015 +n12932966 +n12931542 +n12889713 +n12849061 +n11722466 +n11720643 +n12665857 +n12665271 +n11785668 +n11780148 +n11784497 +n11782036 +n11786539 +n11782761 +n12858871 +n12858397 +n11959632 +n11959862 +n12911673 +n12911440 +n12091213 +n12091550 +n12091377 +n12091953 +n12703557 +n12703190 +n12703383 +n12437930 +n12437769 +n12352639 +n12352844 +n12352990 +n12344700 +n12344483 +n12687957 +n12685831 +n12687698 +n12687462 +n12686274 +n12686077 +n12687044 +n12686676 +n12388989 +n12388143 +n12387839 +n12388858 +n12390099 +n12389501 +n12390314 +n12782915 +n12779603 +n12781940 +n12782530 +n11753700 +n11753355 +n11753143 +n12856680 +n12855494 +n12540250 +n12515711 +n12575322 +n12575812 +n12556307 +n12539306 +n12557681 +n12558425 +n12866162 +n12865824 +n12865037 +n12866635 +n12865562 +n12866002 +n11879054 +n11878283 +n11875691 +n11876634 +n11877193 +n11876803 +n11876432 +n11870418 +n11875938 +n11894327 +n11881742 +n11870747 +n11896722 +n11879722 +n11895092 +n11894770 +n11882074 +n11882426 +n13235503 +n13234678 +n12039317 +n12037691 +n12038406 +n12038585 +n12148757 +n12102133 +n12121610 +n12139575 +n12113195 +n12112918 +n12116429 +n12141495 +n12133462 +n12108871 +n12104238 +n12141167 +n12115180 +n12112008 +n12128071 +n12146311 +n12124627 +n12110778 +n12129134 +n12134025 +n12145477 +n12142085 +n12135898 +n12137120 +n12127030 +n12127768 +n12127460 +n12356023 +n12357485 +n12793494 +n12794135 +n12849279 +n12849416 +n12847374 +n12517642 +n11731659 +n12813189 +n11838916 +n12517445 +n12513172 +n12823859 +n12566954 +n13148208 +n12158798 +n12485981 +n13237188 +n12826516 +n13120211 +n12580654 +n11769621 +n12824053 +n11769803 +n12383402 +n12823717 +n12157769 +n13144794 +n12371439 +n12159055 +n12160490 +n12158443 +n12160303 +n12159388 +n12160857 +n12161969 +n12827270 +n12828791 +n12827537 +n11788727 +n11789589 +n12571781 +n11792029 +n12384839 +n12384227 +n12384037 +n12164363 +n12166128 +n12165170 +n12164881 +n12164656 +n13146583 +n13145040 +n12509476 +n13112664 +n13104059 +n12655869 +n12546183 +n12671651 +n12215579 +n12901724 +n12938193 +n12680864 +n12329260 +n12924623 +n12659356 +n12788201 +n12343480 +n13142504 +n11830906 +n12504783 +n12659539 +n12214789 +n11699442 +n12217453 +n12574866 +n12374418 +n12249542 +n13118707 +n12215022 +n12342852 +n12762896 +n12306717 +n11769176 +n12805146 +n12519089 +n11754893 +n12772908 +n12624381 +n12482031 +n12243109 +n12223764 +n12170585 +n12230794 +n12791329 +n12674120 +n12917901 +n12237486 +n12185859 +n12681893 +n12905412 +n12899537 +n12899752 +n12806015 +n12011620 +n12922763 +n12651229 +n12303083 +n11928352 +n11926365 +n12223569 +n12791064 +n12311579 +n11834654 +n11760785 +n12749679 +n12489815 +n12666965 +n12929403 +n12902662 +n12620196 +n12237641 +n12625383 +n12244153 +n11774513 +n12520864 +n12516828 +n12849717 +n12485653 +n12790430 +n12788854 +n11924445 +n12632335 +n11947251 +n12099342 +n11931540 +n12545635 +n11778257 +n11924849 +n12367611 +n12602262 +n12328567 +n12328398 +n12629305 +n11907689 +n11940006 +n12546962 +n11925898 +n11947629 +n11948864 +n11948264 +n12368451 +n12369309 +n12368028 +n12307240 +n12307076 +n12483427 +n12483625 +n12482893 +n12483841 +n12173664 +n12173912 +n12171316 +n12174521 +n12171098 +n12177844 +n12174311 +n12178896 +n12179122 +n12676534 +n12676703 +n12675876 +n12920204 +n12921868 +n12621410 +n12622297 +n12245319 +n12244650 +n12244819 +n12521394 +n12530818 +n12849952 +n12850336 +n12850168 +n12495146 +n12570972 +n12196129 +n13107694 +n12202936 +n13111881 +n13103877 +n12409231 +n12765115 +n12265600 +n12409470 +n12713866 +n12281241 +n11709205 +n12189429 +n12562785 +n12284821 +n12401335 +n12570394 +n11759224 +n12286988 +n12491826 +n12527738 +n12696492 +n12325234 +n12198286 +n12330891 +n11650558 +n12405714 +n12284262 +n12714755 +n13109733 +n12262553 +n12506341 +n12303462 +n12260799 +n12302071 +n12492106 +n11762433 +n12582231 +n12774299 +n13108481 +n12267411 +n11756092 +n12662772 +n13108662 +n12528549 +n12690653 +n12180885 +n13108545 +n13108323 +n12334293 +n12670758 +n12286826 +n12724942 +n12155009 +n12570703 +n12523475 +n12154773 +n12915811 +n12268246 +n13108131 +n12806732 +n12524188 +n11758799 +n12496427 +n12568186 +n12495895 +n12196527 +n12196336 +n12196694 +n12203529 +n12204175 +n12282933 +n12282527 +n12283542 +n12282737 +n12282235 +n12402051 +n12402840 +n12401684 +n12402348 +n12402596 +n11759853 +n11759404 +n12406715 +n12406488 +n12407890 +n12406902 +n12330469 +n12345899 +n11709674 +n12329473 +n12200143 +n11712282 +n12752205 +n13110915 +n12513933 +n12189987 +n12731401 +n12717224 +n12717072 +n12946849 +n12756457 +n12201580 +n11703669 +n12491017 +n12190410 +n12242409 +n07754894 +n12818346 +n12658308 +n12658118 +n12494794 +n12317296 +n12651821 +n11711764 +n11710136 +n11711537 +n11710393 +n12755225 +n12753573 +n12754648 +n12754781 +n12755727 +n12754981 +n12755387 +n12753007 +n12753245 +n12754003 +n12759273 +n12318378 +n12288823 +n12319204 +n12319414 +n12732491 +n12733647 +n12732756 +n12732009 +n12733870 +n12732966 +n12733218 +n12948495 +n12948251 +n12948053 +n12947313 +n12757303 +n12757458 +n11704093 +n11705171 +n12707781 +n12399132 +n12400720 +n12345280 +n11695599 +n12771192 +n12704343 +n12638218 +n12644902 +n12190869 +n12373100 +n12300840 +n12743352 +n12651611 +n12629666 +n12636224 +n12648045 +n12399384 +n12301180 +n12744387 +n12640839 +n12745386 +n12633638 +n12771390 +n12761284 +n12400489 +n12333530 +n12333771 +n12333053 +n12641413 +n12332030 +n12711984 +n12709901 +n12708293 +n12713063 +n12711596 +n12709103 +n12709688 +n12710415 +n12710295 +n12710693 +n12708654 +n12708941 +n12643313 +n12638753 +n12646740 +n12645174 +n12650379 +n12634429 +n12633994 +n12634211 +n12635532 +n12635955 +n12635744 +n12643473 +n12649065 +n12641931 +n12642200 +n12650556 +n12649539 +n12649317 +n12646605 +n12647560 +n12648888 +n12263987 +n12263038 +n12306089 +n12305986 +n12305293 +n12304703 +n12305475 +n12262018 +n12261808 +n12261571 +n12595699 +n12587132 +n12583126 +n12596709 +n12591351 +n12596849 +n12582665 +n12596148 +n12595964 +n12582846 +n12587803 +n12591017 +n12588320 +n12588780 +n12585629 +n12597134 +n12598027 +n12597466 +n12583401 +n12593994 +n12590232 +n11757653 +n11756669 +n11757851 +n11664418 +n13108841 +n11647703 +n11628793 +n11658331 +n11623105 +n11630017 +n11628456 +n11658544 +n11643835 +n11624531 +n11661372 +n11645914 +n11630489 +n11640132 +n11608250 +n11620673 +n11618861 +n11627168 +n11623815 +n11624192 +n11623967 +n11635152 +n11634736 +n11635433 +n11636204 +n11644462 +n11644226 +n11644046 +n11626585 +n11625632 +n11625003 +n11626826 +n11625804 +n11626152 +n11626409 +n11646694 +n11646167 +n11632167 +n11631854 +n11632619 +n11616662 +n11611561 +n11611356 +n11617631 +n11612575 +n11611758 +n11614713 +n11615387 +n11612018 +n11611087 +n11612923 +n11616486 +n11618290 +n11612349 +n11611233 +n11617090 +n11614250 +n11618525 +n11615026 +n11617272 +n11614039 +n11613459 +n11615967 +n11614420 +n11621029 +n11622184 +n11622591 +n11621281 +n11622368 +n11621950 +n11621547 +n11621727 +n11619455 +n11619227 +n11627512 +n11628087 +n11627908 +n12691661 +n12691428 +n12316572 +n12334891 +n12340755 +n12316444 +n12336727 +n12338796 +n12338454 +n12336973 +n12336092 +n12336224 +n12337617 +n12725521 +n12727101 +n12729521 +n12726670 +n12729315 +n12729729 +n12731029 +n12270741 +n12271643 +n12278650 +n12279458 +n12269241 +n12275489 +n12273114 +n12276872 +n12278371 +n12272883 +n12269652 +n12273768 +n12277800 +n12271933 +n12279772 +n12270946 +n12269406 +n12275675 +n12276628 +n12275131 +n12274358 +n12272239 +n12277578 +n12501202 +n12814643 +n12493208 +n12807773 +n12807409 +n12807251 +n11758122 +n12915568 +n12656369 +n12656685 +n12547215 +n12547503 +n11944196 +n11984144 +n11805544 +n11874081 +n11965218 +n12392549 +n11956348 +n11945514 +n11944954 +n11998888 +n11953884 +n11954345 +n11955153 +n11954161 +n12421137 +n12421467 +n12411461 +n12451915 +n12425281 +n12459629 +n12421683 +n12422129 +n12421917 +n12411922 +n12418221 +n12416073 +n12413165 +n12414932 +n12412606 +n12412355 +n12414035 +n12413880 +n12453186 +n12452836 +n12450344 +n12426248 +n12429352 +n12460697 +n12449526 +n12473840 +n12458550 +n12449296 +n12472024 +n12457091 +n12465557 +n12461466 +n12454159 +n12431434 +n12451240 +n12451399 +n12450840 +n12428076 +n12428747 +n12427566 +n12427184 +n12426623 +n12427757 +n12461109 +n12460957 +n12454705 +n12454949 +n12435777 +n12435649 +n11819509 +n11819912 +n11842204 +n11852028 +n11851258 +n11847169 +n11853813 +n11848479 +n11844892 +n11851839 +n11845557 +n11849871 +n11849983 +n11851578 +n11854479 +n11844371 +n11853356 +n11845793 +n11845913 +n11784126 +n11783920 +n12832315 +n11723770 +n11724109 +n12766869 +n12455950 +n11723227 +n12757816 +n11773987 +n12766595 +n01324610 +n02153109 +n01323599 +n01314781 +n01321579 +n01317541 +n01318894 +n01314663 +n02311060 +n01317916 +n01321230 +n01314388 +n02075612 +n02152740 +n01466257 +n01316949 +n01905661 +n01320872 +n01319467 +n01316422 +n02157206 +n10300303 +n02152881 +n01324431 +n01321854 +n01321770 +n01956344 +n01613615 +n01318279 +n02376542 +n02122948 +n01888045 +n01322343 +n01887896 +n02412440 +n01322221 +n01322604 +n01323261 +n01322685 +n02395694 +n01504344 +n01504179 +n01318381 +n02122580 +n01317813 +n02469472 +n02309337 +n02311617 +n02264232 +n02299157 +n02310585 +n02299505 +n02302620 +n02295390 +n02310717 +n02288268 +n02297442 +n02300797 +n02285801 +n02307325 +n02376791 +n02377063 +n01323355 +n01469103 +n01468712 +n01471682 +n01473806 +n01627424 +n01861778 +n09828216 +n01459791 +n02156871 +n01661091 +n01503061 +n02512053 +n01477525 +n02528163 +n02512938 +n01482071 +n02638596 +n01457852 +n01455778 +n01456756 +n02552171 +n01428580 +n02549989 +n02640857 +n02641379 +n02639087 +n02639605 +n02640242 +n02554730 +n02618827 +n02549248 +n02603317 +n01451426 +n02548247 +n02642107 +n02657368 +n02603540 +n02652668 +n02560110 +n02556846 +n02555863 +n02581957 +n02564270 +n02623445 +n02565573 +n02610664 +n02590702 +n02588286 +n02620167 +n02573704 +n02576223 +n02606384 +n02605316 +n02619550 +n02561108 +n02619165 +n02610066 +n02562315 +n02586543 +n02593019 +n02594250 +n02616851 +n02585872 +n02607862 +n02557182 +n02557318 +n02557749 +n02624167 +n02628062 +n02631475 +n02630281 +n02631041 +n02629230 +n02626762 +n02625258 +n02625612 +n02624807 +n02626265 +n02625851 +n02627292 +n02627532 +n02576575 +n02579928 +n02580336 +n02576906 +n02579303 +n02578771 +n02578928 +n02580679 +n02580830 +n02607201 +n02607470 +n02607072 +n02605703 +n02606052 +n02605936 +n02561381 +n02561661 +n02561514 +n02564720 +n02563648 +n02563182 +n02563792 +n02562796 +n02565072 +n02565324 +n02599052 +n02596381 +n02597608 +n02596067 +n02595702 +n02598573 +n02598878 +n02642644 +n02649546 +n02643112 +n02643566 +n02643836 +n02644113 +n02658531 +n02657694 +n02660208 +n02654745 +n02654425 +n02656670 +n02655020 +n02655523 +n02653145 +n02656032 +n02655848 +n02541687 +n02542432 +n02524202 +n02533834 +n02543565 +n02517442 +n01438208 +n02526121 +n02529772 +n02518324 +n02520147 +n02519686 +n02519862 +n02583567 +n01444339 +n01446589 +n01438581 +n01439121 +n01448951 +n02584449 +n02584145 +n02583890 +n01446760 +n01447331 +n01448594 +n01448291 +n01439514 +n01442972 +n01440764 +n01443831 +n01443537 +n01443243 +n01449712 +n01449374 +n02527622 +n02527057 +n02527271 +n02532602 +n02533209 +n02566834 +n02537085 +n02534734 +n02514041 +n02568959 +n02568087 +n02570164 +n02569484 +n02537716 +n02538216 +n02537525 +n02537319 +n02538010 +n02536456 +n02535537 +n02535258 +n02536864 +n02535759 +n01482330 +n01495701 +n01487506 +n01495493 +n01486838 +n01488918 +n01492357 +n01494475 +n01483522 +n01488038 +n01489501 +n01491006 +n01489709 +n01489920 +n01490112 +n01491361 +n01490670 +n01493146 +n01492569 +n01484850 +n01484097 +n01483830 +n01498041 +n01496331 +n01499396 +n01500476 +n01500091 +n01501160 +n01498989 +n01629276 +n01639765 +n01629962 +n01630284 +n01629819 +n01637615 +n01632047 +n01631663 +n01630670 +n01630901 +n01632458 +n01632777 +n01632601 +n01645776 +n01640846 +n01644900 +n01643896 +n01650167 +n01644373 +n01646648 +n01646902 +n01646292 +n01646802 +n01646388 +n01647640 +n01646555 +n01642539 +n01641206 +n01641577 +n01641391 +n01642257 +n01641739 +n01650690 +n01652026 +n01886756 +n01871265 +n01871875 +n01874434 +n01862399 +n02082791 +n01887474 +n01889074 +n02372584 +n01888411 +n02453611 +n02430559 +n01887623 +n02469914 +n02075296 +n02139199 +n02062017 +n02323449 +n02372952 +n01888181 +n02329401 +n01887787 +n02453108 +n01888264 +n02461830 +n02370806 +n01891633 +n01893825 +n02454794 +n02456962 +n02454379 +n02460009 +n02458135 +n02457945 +n02457408 +n02460451 +n02461128 +n02470238 +n02501583 +n02472293 +n02470325 +n02496913 +n02484322 +n02475669 +n02474777 +n02475078 +n02470899 +n02483092 +n02480153 +n02483708 +n02483362 +n02481823 +n02480495 +n02480855 +n02482650 +n02482474 +n02481103 +n02481366 +n02481500 +n02500267 +n02497673 +n02499316 +n02499808 +n02499022 +n02484473 +n02489589 +n02486410 +n02485536 +n02489166 +n02488702 +n02486261 +n02487347 +n02484975 +n02488291 +n02486657 +n02486908 +n02487847 +n02487547 +n02493793 +n02490219 +n02494079 +n02493509 +n02492035 +n02492660 +n02491107 +n02490811 +n02507649 +n02120997 +n02134971 +n02083346 +n02441326 +n02131653 +n02509515 +n02508213 +n02509815 +n02508021 +n02509197 +n02510455 +n02127808 +n02121620 +n02128925 +n02129604 +n02128385 +n02130308 +n02129165 +n02128757 +n02129923 +n02129837 +n01323068 +n02129463 +n01322898 +n02121808 +n02124623 +n02122878 +n02123159 +n02123045 +n02123242 +n02124484 +n02124075 +n02124313 +n02122298 +n02123478 +n02123394 +n02123917 +n02123597 +n02122510 +n02122725 +n02122430 +n02126640 +n02125494 +n02127052 +n02125311 +n02125081 +n02126139 +n02126787 +n02125010 +n02127292 +n02127482 +n02127678 +n02127381 +n02138441 +n02137015 +n02137549 +n02138647 +n02138777 +n02084071 +n02115335 +n02114100 +n02083672 +n02115096 +n02118333 +n02117135 +n02110958 +n02112826 +n02111500 +n02112706 +n02113335 +n02084861 +n02111129 +n02112497 +n02110341 +n02084732 +n02111626 +n02085374 +n02087122 +n02103406 +n02110806 +n02113978 +n02111277 +n02085272 +n02113186 +n02113023 +n02113799 +n02113624 +n02113712 +n02112018 +n02112350 +n02112137 +n02111889 +n02086346 +n02086240 +n02087046 +n02085936 +n02085782 +n02085620 +n02086079 +n02086753 +n02086646 +n02086910 +n02092468 +n02087394 +n02089468 +n02098550 +n02087551 +n02089232 +n02096437 +n02096756 +n02095412 +n02096051 +n02098286 +n02093859 +n02094114 +n02093754 +n02094433 +n02095314 +n02093647 +n02097474 +n02097658 +n02098413 +n02097298 +n02096177 +n02096585 +n02095050 +n02096294 +n02093056 +n02094258 +n02093991 +n02094562 +n02098105 +n02097209 +n02097130 +n02097047 +n02095570 +n02095727 +n02095889 +n02093256 +n02093428 +n02094721 +n02094931 +n02098906 +n02099997 +n02098806 +n02100399 +n02101108 +n02099029 +n02100583 +n02100236 +n02101006 +n02100735 +n02100877 +n02102318 +n02102605 +n02101861 +n02101388 +n02101556 +n02102480 +n02102973 +n02102040 +n02102177 +n02099267 +n02099601 +n02099429 +n02099849 +n02099712 +n02091635 +n02088466 +n02090475 +n02088238 +n02091244 +n02091467 +n02088839 +n02091831 +n02088094 +n02089078 +n02088632 +n02092002 +n02090379 +n02089555 +n02088364 +n02092339 +n02090827 +n02090622 +n02090721 +n02089973 +n02089867 +n02091134 +n02091032 +n02109047 +n02103841 +n02109961 +n02108551 +n02109811 +n02109525 +n02108915 +n02106854 +n02108672 +n02107420 +n02108422 +n02104523 +n02108089 +n02108254 +n02104029 +n02104280 +n02106966 +n02104365 +n02107142 +n02107312 +n02110627 +n02110185 +n02110063 +n02107574 +n02108000 +n02107683 +n02107908 +n02104882 +n02105412 +n02105855 +n02105505 +n02106166 +n02106030 +n02106550 +n02105641 +n02106662 +n02105251 +n02106382 +n02105056 +n02105162 +n02116738 +n02115641 +n02115913 +n02114855 +n01322508 +n02114712 +n02114548 +n02114367 +n02119022 +n02119477 +n02119789 +n02120079 +n02120505 +n02119634 +n02117900 +n02117512 +n02442845 +n02443484 +n02446206 +n02450295 +n02445394 +n02444819 +n02441942 +n02443114 +n02449350 +n02445715 +n02447366 +n02443346 +n02445004 +n02445171 +n02134084 +n02133161 +n01322983 +n02133704 +n02132136 +n02134418 +n02132580 +n02132788 +n02141306 +n02140049 +n02139671 +n02146371 +n02145424 +n02147591 +n02147947 +n02062430 +n02073250 +n02075927 +n02062744 +n02066707 +n02063224 +n02068974 +n02068541 +n02070430 +n02069412 +n02069701 +n02071636 +n02071294 +n02072798 +n02070174 +n02069974 +n02066245 +n02064338 +n02064816 +n02065407 +n02065026 +n02073831 +n02074367 +n02081571 +n02076196 +n02079389 +n02076779 +n02080415 +n02079851 +n02080146 +n02077658 +n02077152 +n02077923 +n02078574 +n02078738 +n02079005 +n02328429 +n02323902 +n02324045 +n02326432 +n02325722 +n02325366 +n02324587 +n02324850 +n02324514 +n02328150 +n02324431 +n02327842 +n02326862 +n02327028 +n02367492 +n02331046 +n02365480 +n02343320 +n02341974 +n02346627 +n02366959 +n02339376 +n02363005 +n02342885 +n02359324 +n02355227 +n02361337 +n02359556 +n02364520 +n02343772 +n02330245 +n02338145 +n02353861 +n02333546 +n02333909 +n02360282 +n02358091 +n02359915 +n02355477 +n02358890 +n02358390 +n02356381 +n02357111 +n02356977 +n02357401 +n02356798 +n02361706 +n02361587 +n02364840 +n02364673 +n02332755 +n02332156 +n02503517 +n02504458 +n02504013 +n02394477 +n02373336 +n02399000 +n02437136 +n02395003 +n02437616 +n02438580 +n02397744 +n02398521 +n02397529 +n02429456 +n02430045 +n02401031 +n02439033 +n02439398 +n02434190 +n02433925 +n02433318 +n02432983 +n02431337 +n02432511 +n02430830 +n02431122 +n02434954 +n02432291 +n02431785 +n02431976 +n02433546 +n02432704 +n02414578 +n02410509 +n02411206 +n02407959 +n02402010 +n02419796 +n02411705 +n02418064 +n02416519 +n02416104 +n02415435 +n02415253 +n02415577 +n02415829 +n02410702 +n02410900 +n02408817 +n02408429 +n02409508 +n02404573 +n02402175 +n02404906 +n02402425 +n02405302 +n02410011 +n02404186 +n02403003 +n02403325 +n02403231 +n02403740 +n02403454 +n02406174 +n02404432 +n02406647 +n02407625 +n02407071 +n02405929 +n02407276 +n02407390 +n02406533 +n02424305 +n02421136 +n02420509 +n02427724 +n02426813 +n02426481 +n02421792 +n02421449 +n02424695 +n02420828 +n02422391 +n02422699 +n02424486 +n02425887 +n02422106 +n02424085 +n02428508 +n02428349 +n02423022 +n02424909 +n02425228 +n02423218 +n02423589 +n02413131 +n02413050 +n02411999 +n02412210 +n02412080 +n02418465 +n02419336 +n02419634 +n02416964 +n02416820 +n02417914 +n02417387 +n02417070 +n02416880 +n02417534 +n02437482 +n02437312 +n02396427 +n02397096 +n02396014 +n02395406 +n02438173 +n02438272 +n02391994 +n02393580 +n02374149 +n02393940 +n02392434 +n02393161 +n02392824 +n02374451 +n02391049 +n02389346 +n02388917 +n02377603 +n02382948 +n02389128 +n02381460 +n02389261 +n02382204 +n02375302 +n02376918 +n02387722 +n02388832 +n02381609 +n02377703 +n02388735 +n02386014 +n02380464 +n02386310 +n02377480 +n02380335 +n02382437 +n02389026 +n02385214 +n02383231 +n02388276 +n02377291 +n02377181 +n02377388 +n02379430 +n02378969 +n02378541 +n02381364 +n02379329 +n02381004 +n02381261 +n02379908 +n02379183 +n02386141 +n02386224 +n02382338 +n02387254 +n02386496 +n02386853 +n02387093 +n02386968 +n02387346 +n02382039 +n02380745 +n02380583 +n02382750 +n02382635 +n02382850 +n02391234 +n02391373 +n02391508 +n02390015 +n02389779 +n02389559 +n01872401 +n01873310 +n01872772 +n01877134 +n01882714 +n01883070 +n01875313 +n01874928 +n01883513 +n01881171 +n01877606 +n01877812 +n01878929 +n01879509 +n01884834 +n01885498 +n01662622 +n01661818 +n01662784 +n01669372 +n01669191 +n01666228 +n01667778 +n01672032 +n01669654 +n01663401 +n01665932 +n01668665 +n01670092 +n01667114 +n01668892 +n01664990 +n01664065 +n01663782 +n01665541 +n01664369 +n01664674 +n01664492 +n01670802 +n01671125 +n01670535 +n01671479 +n01696633 +n01726692 +n01673282 +n01674464 +n01699831 +n01698434 +n01697178 +n01698640 +n01699040 +n01697611 +n01697457 +n01740551 +n01752165 +n01751748 +n01745125 +n01741562 +n01727646 +n01753488 +n01752736 +n01752585 +n01753032 +n01753959 +n01754533 +n01754370 +n01754876 +n01757901 +n01757677 +n01755581 +n01757115 +n01755740 +n01756089 +n01756508 +n01756291 +n01756733 +n01757343 +n01747885 +n01749939 +n01751472 +n01747589 +n01749582 +n01746359 +n01745484 +n01748264 +n01748906 +n01741943 +n01743605 +n01742821 +n01742172 +n01743086 +n01744100 +n01743936 +n01744401 +n01730960 +n01735189 +n01733757 +n01729322 +n01732244 +n01731545 +n01737021 +n01729977 +n01730812 +n01730563 +n01728572 +n01728920 +n01739381 +n01734418 +n01740131 +n01735577 +n01735439 +n01734104 +n01733957 +n01732614 +n01732789 +n01737875 +n01737472 +n01737728 +n01730185 +n01730307 +n01734808 +n01734637 +n01675722 +n01693783 +n01694709 +n01684133 +n01692333 +n01695060 +n01685808 +n01676755 +n01687665 +n01674990 +n01694178 +n01692864 +n01689411 +n01681940 +n01681653 +n01678343 +n01682714 +n01682435 +n01681328 +n01680264 +n01679626 +n01677366 +n01677747 +n01679962 +n01680655 +n01680478 +n01687978 +n01689081 +n01688243 +n01693334 +n01693175 +n01690149 +n01689811 +n01700470 +n01713764 +n01701859 +n01704323 +n01515303 +n01844917 +n01524359 +n01514668 +n01833805 +n01838038 +n01825930 +n01844551 +n01604330 +n01834918 +n01822602 +n01514752 +n01517565 +n01789386 +n01844231 +n01816887 +n01517966 +n01503976 +n01514859 +n02000954 +n01858441 +n02016358 +n02021795 +n01845132 +n02008041 +n02014237 +n02021050 +n02018795 +n02005790 +n02002075 +n02013177 +n02012849 +n02013706 +n02014524 +n02007558 +n02014941 +n02006656 +n02005399 +n02022684 +n02008497 +n02010453 +n02009229 +n02011281 +n02008643 +n02008796 +n02011460 +n02010728 +n02011016 +n02009750 +n02009508 +n02009380 +n02009912 +n02010272 +n02012185 +n02011805 +n02006063 +n02006364 +n02003204 +n02002724 +n02002556 +n02004131 +n02003839 +n02004492 +n02004855 +n02017725 +n02015357 +n02016066 +n02015554 +n02018027 +n02018368 +n02018207 +n02006985 +n02007284 +n02023341 +n02034129 +n02034295 +n02036053 +n02040266 +n02037110 +n02034661 +n02031585 +n02031934 +n02030996 +n02036711 +n02026059 +n02033779 +n02038993 +n02033561 +n02037464 +n02024479 +n02025239 +n02023992 +n02024763 +n02025043 +n02023855 +n02034971 +n02035210 +n02032222 +n02032355 +n02032480 +n02033041 +n02030287 +n02027897 +n02030837 +n02029087 +n02029378 +n02028035 +n02027075 +n02028900 +n02027492 +n02029706 +n02027357 +n02028727 +n02030035 +n02026948 +n02028175 +n02028342 +n02028451 +n02037869 +n02038466 +n01858845 +n01858906 +n01860002 +n01858281 +n01859190 +n01858780 +n01859325 +n01860187 +n01859496 +n01859689 +n01859852 +n02016956 +n02017213 +n02016816 +n02040505 +n02057731 +n02050004 +n02045369 +n02049088 +n02051474 +n02055658 +n02047614 +n02041085 +n02044178 +n02043808 +n02043333 +n02041246 +n02043063 +n02042472 +n02041678 +n02042180 +n02041875 +n02042759 +n02042046 +n02044778 +n02044517 +n02059162 +n02058221 +n02058594 +n02060411 +n02060889 +n02060133 +n02050442 +n02050313 +n02051059 +n02050586 +n02050809 +n02045864 +n02046759 +n02045596 +n02047260 +n02046939 +n02047411 +n02047045 +n02052775 +n02054036 +n02054502 +n02051845 +n02053083 +n02054711 +n02055107 +n02052204 +n02052365 +n02053425 +n02053584 +n02055803 +n02056728 +n02057035 +n02056570 +n02057330 +n02056228 +n02048115 +n02048353 +n02047975 +n01845477 +n01855672 +n01846331 +n01856890 +n01857851 +n01857079 +n01856380 +n01857512 +n01857325 +n01856072 +n01856553 +n01856155 +n01857632 +n01847253 +n01851375 +n01849676 +n01852329 +n01850192 +n01847978 +n01852400 +n01848840 +n01849157 +n01847806 +n01849466 +n01848123 +n01850553 +n01847089 +n01851895 +n01849863 +n01852142 +n01847000 +n01852671 +n01848976 +n01847407 +n01848648 +n01852861 +n01851207 +n01851038 +n01850373 +n01850873 +n01847170 +n01851573 +n01851731 +n01848555 +n01848323 +n01848453 +n01853195 +n01853870 +n01854415 +n01853498 +n01853666 +n01854838 +n01855032 +n01855476 +n01855188 +n01854700 +n01584225 +n01546506 +n01546921 +n01525720 +n01546039 +n01539573 +n01585121 +n01585715 +n01584695 +n01586374 +n01584853 +n01586020 +n01552813 +n01551711 +n01555004 +n01554448 +n01547832 +n01548301 +n01549886 +n01549430 +n01550172 +n01549641 +n01555305 +n01549053 +n01548865 +n01548492 +n01563128 +n01589718 +n01578575 +n01576695 +n01528654 +n01591697 +n01594004 +n01557185 +n01527347 +n01597022 +n01598588 +n01527617 +n01576076 +n01555809 +n01587834 +n01602630 +n01597336 +n01538955 +n01529672 +n01600657 +n01601694 +n01527194 +n01586941 +n01588002 +n01527917 +n01587526 +n01601068 +n01603600 +n01602832 +n01571904 +n01575745 +n01566645 +n01594372 +n01589286 +n01526521 +n01582856 +n01528396 +n01528845 +n01556182 +n01542786 +n01590583 +n01564914 +n01567133 +n01563746 +n01564394 +n01563449 +n01565078 +n01570676 +n01570839 +n01570267 +n01567678 +n01569060 +n01568892 +n01568294 +n01569971 +n01569262 +n01567879 +n01568720 +n01569423 +n01563945 +n01564217 +n01566207 +n01565599 +n01565930 +n01564773 +n01579410 +n01581984 +n01579578 +n01582398 +n01580077 +n01579260 +n01579028 +n01582220 +n01579149 +n01580870 +n01581166 +n01577035 +n01578180 +n01577659 +n01593028 +n01592084 +n01592694 +n01592387 +n01592540 +n01592257 +n01562265 +n01558993 +n01559477 +n01558461 +n01558307 +n01558149 +n01560105 +n01558594 +n01557962 +n01558765 +n01561732 +n01562014 +n01560280 +n01562451 +n01561452 +n01560419 +n01560636 +n01559804 +n01560793 +n01560935 +n01598988 +n01599556 +n01600085 +n01599269 +n01599159 +n01597906 +n01598074 +n01597737 +n01533651 +n01534155 +n01540233 +n01531178 +n01534762 +n01533893 +n01537134 +n01531344 +n01541386 +n01531512 +n01533481 +n01541922 +n01533000 +n01544704 +n01530575 +n01532325 +n01532511 +n01531811 +n01534582 +n01532829 +n01530439 +n01533339 +n01531971 +n01534433 +n01541102 +n01540566 +n01540832 +n01536644 +n01535469 +n01536334 +n01536186 +n01535690 +n01536780 +n01536035 +n01537544 +n01538059 +n01538630 +n01537895 +n01538200 +n01603812 +n01603953 +n01573898 +n01573074 +n01572328 +n01572782 +n01574045 +n01573240 +n01573360 +n01572654 +n01572489 +n01574560 +n01575117 +n01574390 +n01575401 +n01595450 +n01595168 +n01595624 +n01594787 +n01594968 +n01595974 +n01596273 +n01583209 +n01583495 +n01543632 +n01544389 +n01591123 +n01591005 +n01591301 +n01539925 +n01540090 +n01834540 +n01834177 +n01843065 +n01838598 +n01842235 +n01843719 +n01843383 +n01839598 +n01839330 +n01839086 +n01841102 +n01841679 +n01840775 +n01839750 +n01841441 +n01841288 +n01827403 +n01826364 +n01830915 +n01830042 +n01829413 +n01826680 +n01829869 +n01828970 +n01828556 +n01827793 +n01828096 +n01616318 +n01605630 +n01618503 +n01613294 +n01621127 +n01616764 +n01618922 +n01617766 +n01617443 +n01618082 +n01617095 +n01620414 +n01619310 +n01620735 +n01619536 +n01619835 +n01620135 +n01609751 +n01606522 +n01607812 +n01608265 +n01610955 +n01610552 +n01606809 +n01616086 +n01608432 +n01607600 +n01607962 +n01606672 +n01609956 +n01610226 +n01613177 +n01611800 +n01611472 +n01612628 +n01612476 +n01612275 +n01611969 +n01612122 +n01609391 +n01609062 +n01608814 +n01613807 +n01614343 +n01615121 +n01614925 +n01614038 +n01614556 +n01615703 +n01615458 +n01622959 +n01621635 +n01623880 +n01623425 +n01622352 +n01623615 +n01622120 +n01625562 +n01623706 +n01624115 +n01624537 +n01622483 +n01623110 +n01624833 +n01622779 +n01837072 +n01835276 +n01825278 +n01823013 +n01824575 +n01824035 +n01521399 +n01521756 +n01518878 +n01519873 +n01519563 +n01789740 +n01810700 +n01801876 +n01791463 +n01791107 +n02153203 +n01794344 +n01791954 +n01794158 +n01809106 +n01791625 +n01792429 +n01792158 +n01793435 +n01792042 +n01793715 +n01792640 +n01793249 +n01792955 +n01815601 +n01811909 +n01814370 +n01812337 +n01813088 +n01812662 +n01814921 +n01814755 +n01813532 +n01813385 +n01813948 +n01814217 +n01802721 +n01810268 +n01795088 +n01803078 +n01806567 +n01807496 +n01807105 +n01803362 +n01804163 +n01805801 +n01806297 +n01806364 +n01806143 +n01806467 +n01804478 +n01806847 +n01804653 +n01808140 +n01807828 +n01797307 +n01798484 +n01797020 +n01797886 +n01797601 +n01796729 +n01795545 +n01796340 +n01819734 +n01821203 +n01819115 +n01817346 +n01818832 +n01817953 +n01818515 +n01818299 +n01820052 +n01820348 +n01817263 +n01821869 +n01822300 +n01819313 +n01819465 +n01821076 +n01820546 +n01317089 +n01317294 +n01918744 +n01922303 +n01940736 +n02316707 +n01909422 +n01767661 +n01906749 +n01930112 +n01934440 +n01924916 +n01938454 +n01935395 +n01955084 +n01955933 +n01968315 +n01942177 +n01960459 +n01963317 +n01956481 +n01963571 +n01959985 +n01965889 +n01961985 +n01957335 +n01958038 +n01959492 +n01964441 +n01964271 +n01965529 +n01969726 +n01968897 +n01972541 +n01970164 +n01970667 +n01951274 +n01953361 +n01943899 +n01945845 +n01943087 +n01953762 +n01950731 +n01945685 +n01944390 +n01949085 +n01947396 +n01946630 +n01944812 +n01945143 +n01944955 +n02317335 +n02321170 +n02319555 +n02319095 +n02321529 +n02317781 +n01909906 +n01914163 +n01913166 +n01910747 +n01915700 +n01914609 +n01915811 +n01916925 +n01916187 +n01916481 +n01917882 +n01917289 +n01784675 +n01974773 +n01768244 +n01786646 +n01769347 +n01787835 +n02309242 +n02159955 +n01785667 +n01994910 +n01976868 +n01990007 +n01975687 +n01976146 +n01990800 +n01992773 +n01991520 +n01991028 +n01982650 +n01986806 +n01986214 +n01987545 +n01976957 +n01985128 +n01984245 +n01984695 +n01983481 +n01981276 +n01979874 +n01978455 +n01978287 +n01980166 +n01982068 +n01770393 +n01770081 +n01776192 +n01772222 +n01776313 +n01779629 +n01779148 +n01772664 +n01775370 +n01774750 +n01775062 +n01773797 +n01774384 +n01773157 +n01773549 +n02226183 +n02236896 +n02263378 +n02232951 +n02163297 +n02262449 +n02246011 +n02188699 +n02272871 +n02273392 +n02231052 +n02161457 +n02236355 +n02312427 +n02231487 +n02162561 +n02164464 +n02241569 +n02262803 +n02206270 +n02274024 +n02312640 +n02268148 +n02270623 +n02207805 +n02226429 +n02229544 +n02228341 +n02226970 +n02241426 +n02240517 +n02266050 +n02264885 +n02264363 +n02236044 +n02236241 +n02233338 +n02234355 +n02234848 +n02233943 +n02251775 +n02256656 +n02258198 +n02257284 +n02250822 +n02259212 +n02252226 +n02200198 +n02205219 +n02203152 +n02196344 +n02190166 +n02198859 +n02196119 +n02201000 +n02202006 +n02195819 +n02195526 +n02192513 +n02191773 +n02190790 +n02192252 +n02191979 +n02169974 +n02168245 +n02167151 +n02169023 +n02165456 +n02171453 +n02180875 +n02183096 +n02169497 +n02176261 +n02176439 +n02165105 +n02177972 +n02168699 +n02166567 +n02166826 +n02171869 +n02175916 +n02175569 +n02172870 +n02173373 +n02174001 +n02172182 +n02172518 +n02174659 +n02243562 +n02244797 +n02212062 +n02218371 +n02219486 +n02206856 +n02216211 +n02215770 +n02212602 +n02213107 +n02212958 +n02213543 +n02213239 +n02213788 +n02220804 +n02221083 +n02221414 +n02209354 +n02208280 +n02211627 +n02210427 +n02211444 +n02209624 +n02208498 +n02208848 +n02274259 +n02283201 +n02281787 +n02274822 +n02281406 +n02277742 +n02279972 +n02280649 +n02282257 +n02282903 +n02282385 +n02275773 +n02278210 +n02276258 +n02276902 +n02279257 +n02277094 +n02276078 +n02275560 +n02277268 +n02276355 +n02276749 +n02278024 +n02281015 +n02281136 +n02305929 +n02301452 +n02295064 +n02298541 +n02284611 +n02287004 +n02291572 +n02305085 +n02301935 +n02304432 +n02303284 +n02302969 +n02292692 +n02291748 +n02268443 +n02268853 +n01321123 +n02376679 +n01323493 +n01338685 +n01387065 +n01339083 +n01339336 +n01339801 +n01339471 +n01397114 +n01389507 +n01397871 +n01410457 +n01407798 +n01424420 +n01392380 +n01395254 +n01396048 +n11542137 +n11544015 +n11542640 +n09626238 +n09856671 +n09605289 +n09622049 +n09971273 +n09882716 +n09621232 +n09902954 +n09620794 +n09727440 +n09624168 +n09752519 +n10378026 +n10500217 +n10514429 +n09610405 +n09617867 +n10355449 +n09618957 +n10002760 +n10384496 +n09637339 +n09613191 +n09836160 +n10274815 +n09890749 +n10112591 +n10260706 +n09606527 +n09767197 +n10709529 +n09976429 +n09918554 +n10588074 +n10565667 +n09990415 +n10120330 +n09616922 +n09622302 +n09630641 +n09796809 +n09614684 +n10635788 +n09645091 +n10405694 +n09676884 +n09638875 +n09874428 +n09627906 +n09628382 +n10522759 +n10247880 +n09624980 +n10529231 +n10024362 +n09614315 +n09612848 +n09632518 +n10147935 +n09871867 +n09620078 +n09634494 +n10077593 +n10040945 +n09623038 +n10560106 +n10289039 +n10422405 +n09774783 +n10042845 +n09831962 +n10726031 +n09923673 +n09610660 +n09626031 +n10401331 +n09621545 +n10362319 +n10665698 +n09906449 +n09939313 +n10439373 +n09607630 +n09631463 +n10451450 +n10541229 +n09793141 +n10633450 +n10530959 +n09629752 +n10560637 +n10431625 +n09619168 +n09763784 +n09636339 +n10235549 +n09845401 +n10513823 +n10610465 +n09951274 +n09816771 +n10401829 +n10307234 +n10505613 +n10148035 +n09874725 +n09944022 +n10015485 +n10728624 +n10308168 +n10200781 +n10480253 +n10376523 +n09903153 +n10748620 +n10581890 +n10045713 +n10165109 +n10694258 +n10509063 +n10559996 +n10366966 +n10305802 +n10421470 +n10164492 +n10477713 +n10020890 +n10679174 +n10632576 +n10189278 +n09894445 +n10504206 +n10559288 +n09917593 +n09833441 +n10384392 +n10060352 +n09840217 +n09777012 +n10309896 +n09905185 +n10686885 +n10209731 +n10093818 +n10754189 +n10411551 +n10577284 +n10285313 +n10333439 +n10624074 +n10287213 +n09871229 +n10078719 +n09843443 +n10173771 +n10192839 +n10419785 +n10406266 +n10288964 +n10804287 +n10665587 +n10153414 +n10406765 +n10611613 +n09805324 +n09824361 +n10316360 +n10707233 +n10696508 +n09858165 +n10175248 +n09979321 +n10692482 +n10396106 +n10427764 +n10385566 +n10439851 +n09820263 +n10533013 +n09854421 +n10304914 +n10575463 +n09915651 +n10453184 +n10101634 +n10701180 +n09835230 +n10746931 +n10542888 +n10604491 +n09764381 +n09929298 +n10019406 +n09785659 +n10618342 +n10782471 +n10701644 +n10105733 +n10638922 +n09842047 +n10315561 +n09835506 +n10153594 +n09830194 +n10263411 +n10157128 +n10498816 +n10689306 +n10604380 +n10634849 +n09923561 +n09764598 +n10086568 +n10007684 +n09841696 +n10321340 +n10092488 +n10386984 +n10387196 +n10205457 +n10578021 +n10098710 +n09836519 +n09836786 +n09836343 +n09877951 +n10300154 +n10095769 +n10435988 +n09930257 +n10387324 +n10098862 +n10642596 +n10331167 +n09946814 +n10299250 +n09896170 +n10415638 +n10091450 +n10069296 +n09989502 +n10226413 +n10493685 +n09765278 +n09930876 +n10340312 +n09990777 +n09834699 +n10737103 +n10649197 +n10701962 +n10415037 +n10151760 +n10229883 +n10732010 +n10603851 +n10599806 +n10369317 +n09903501 +n10755080 +n10098245 +n10382825 +n10536416 +n10036929 +n10624310 +n09842528 +n10085869 +n09991867 +n10078131 +n10627252 +n10682953 +n10237196 +n09789566 +n10182190 +n09899671 +n10150071 +n10091651 +n10806113 +n10249459 +n10317500 +n09822830 +n10448983 +n09862621 +n10540114 +n10009276 +n10333838 +n10730728 +n10721321 +n09659188 +n09650729 +n09652149 +n09659039 +n09729530 +n09641002 +n09725653 +n09846469 +n09750770 +n10486166 +n10169147 +n09684901 +n09683757 +n09682291 +n10364198 +n10518602 +n10341573 +n10672371 +n10332861 +n10112129 +n10602470 +n10727256 +n10508141 +n10652605 +n09881265 +n09933098 +n09812338 +n09920283 +n10078806 +n10339966 +n10667477 +n10566072 +n10469874 +n10624540 +n09809925 +n09846755 +n09873899 +n09779790 +n10034614 +n10449664 +n10034201 +n09951616 +n10037385 +n09846894 +n10282672 +n10053808 +n09815790 +n10137825 +n10605985 +n10604979 +n09861946 +n10763383 +n09841188 +n10644598 +n10548681 +n10791221 +n10583790 +n09873473 +n10763620 +n10548537 +n10120671 +n10241300 +n10318293 +n10176679 +n09932508 +n10186216 +n10134178 +n10079399 +n09821831 +n09934337 +n10324560 +n10063461 +n09886403 +n09760609 +n10260800 +n10655594 +n09938449 +n10183931 +n09972458 +n09813219 +n10049363 +n10372373 +n10076604 +n09835348 +n09974648 +n10433164 +n09859152 +n10727171 +n10308732 +n09833536 +n10582746 +n10393909 +n10013927 +n10225219 +n10202624 +n09800964 +n10465831 +n09787534 +n10174445 +n10441962 +n10132035 +n09896685 +n09934774 +n10279018 +n10793570 +n10155849 +n10087434 +n09964202 +n09811852 +n10348526 +n10317007 +n10058777 +n10360747 +n09941964 +n10347446 +n09770359 +n09941787 +n09942970 +n09809749 +n09770179 +n10208950 +n10580772 +n10093475 +n10645017 +n09943239 +n09943541 +n10263790 +n10283170 +n10259348 +n10092978 +n10296176 +n09893191 +n10123844 +n10259780 +n10259997 +n10510245 +n10622053 +n10058585 +n10690648 +n10523341 +n10739391 +n10476467 +n10512372 +n10802507 +n10753442 +n09733793 +n09738708 +n09641757 +n09738400 +n09727826 +n09686536 +n09724533 +n09744834 +n09743792 +n09744161 +n09742101 +n09689435 +n09734450 +n09644152 +n09750282 +n09673495 +n09718811 +n09718217 +n09712696 +n09718936 +n10711766 +n09694771 +n09719794 +n09714694 +n09675922 +n09676247 +n10774440 +n09720256 +n09725229 +n09731571 +n09691729 +n09693982 +n09712448 +n09697401 +n09696585 +n09722658 +n09724656 +n09723067 +n09694664 +n09712324 +n09689958 +n09695979 +n10327987 +n09688804 +n09730204 +n09711435 +n09713108 +n09731343 +n09717233 +n09695620 +n09728285 +n09707289 +n09701833 +n09700964 +n09750891 +n09715427 +n09708750 +n09705784 +n09734185 +n09752023 +n09635534 +n09696456 +n09732170 +n09730824 +n09719309 +n09734535 +n09736945 +n09720842 +n09692915 +n09751895 +n09724785 +n09747495 +n09734639 +n09749386 +n09705124 +n09731436 +n10303814 +n10450303 +n10722575 +n10054657 +n10631309 +n10249270 +n09913455 +n10162991 +n09807754 +n09505153 +n10209082 +n10323634 +n10104064 +n10001481 +n10242328 +n10159045 +n09932098 +n10253995 +n10005934 +n10578471 +n09770949 +n10004718 +n10570019 +n10289462 +n10069645 +n10187990 +n09916348 +n10727458 +n10320863 +n10572706 +n10572889 +n10038409 +n10756148 +n09927451 +n10243664 +n10502329 +n09988493 +n10373390 +n10470779 +n09928136 +n10750031 +n10081204 +n09857200 +n10013811 +n09894143 +n10313239 +n10082997 +n10677713 +n09787765 +n10485883 +n10275395 +n09913593 +n09772930 +n09633969 +n10195593 +n09756049 +n10607478 +n09855433 +n10017272 +n10630188 +n10522035 +n10521662 +n10380672 +n10210911 +n10382710 +n10164747 +n09782397 +n10524076 +n10467395 +n10467179 +n10698368 +n09792969 +n10525617 +n10675010 +n09889941 +n10557854 +n09618760 +n09899929 +n10116702 +n10258786 +n10508710 +n09873348 +n09870208 +n10793168 +n10098517 +n10314517 +n10629939 +n10477077 +n10261624 +n10082687 +n10262445 +n10167152 +n10098624 +n10674713 +n09838621 +n10047459 +n10091564 +n10740868 +n09872066 +n10070711 +n10628644 +n10421016 +n09915434 +n10588357 +n10529965 +n10334009 +n10339717 +n09818022 +n10412055 +n10335931 +n09945745 +n10432441 +n10607291 +n10583387 +n10718131 +n10542761 +n10147121 +n10738111 +n10159533 +n10223177 +n10185793 +n10553235 +n10293332 +n10178216 +n10563403 +n10488656 +n10619642 +n10276477 +n10620758 +n10450161 +n10043643 +n10043491 +n10313724 +n10084295 +n10787470 +n10333601 +n10131151 +n09871681 +n09981939 +n10055410 +n10243137 +n10377021 +n10368528 +n10025635 +n09874862 +n10613996 +n10472129 +n10598181 +n10129825 +n09847543 +n10173410 +n10780284 +n09889065 +n09832456 +n10780632 +n10117851 +n09827363 +n10247358 +n10282482 +n10092794 +n10375314 +n09981278 +n10082043 +n09972010 +n10237069 +n09792555 +n10236946 +n10568358 +n10207169 +n10236304 +n10734394 +n10373998 +n10595164 +n10357613 +n09823502 +n10146104 +n10602985 +n10145239 +n10267865 +n09854218 +n10399491 +n10102800 +n10102369 +n10406391 +n10300500 +n10080869 +n10332385 +n09988063 +n10375402 +n10145774 +n10143172 +n10145590 +n10345015 +n10142747 +n10142391 +n10146002 +n10267311 +n10141590 +n10092643 +n09918248 +n10671613 +n10141732 +n10145340 +n10145902 +n10145480 +n09827683 +n10135129 +n10465451 +n10353016 +n13001930 +n13040629 +n12969131 +n12985420 +n13052670 +n13037406 +n13077295 +n12987056 +n12979829 +n12975804 +n12974987 +n12985773 +n13044778 +n12985857 +n13035241 +n13043926 +n12982468 +n13035707 +n13044375 +n12969425 +n13060190 +n13054073 +n13040303 +n13028611 +n12997654 +n12983048 +n13062421 +n13054560 +n12963628 +n12980840 +n12991184 +n12989938 +n12992177 +n12988158 +n13029326 +n13029760 +n13011595 +n13049953 +n12998815 +n12997919 +n13052931 +n13050397 +n13012253 +n13001041 +n13005984 +n13000891 +n13007417 +n13019835 +n13013764 +n13006894 +n13002750 +n13017102 +n13232779 +n13009429 +n13013534 +n13003522 +n13001366 +n13009085 +n13022210 +n13002925 +n13006171 +n13003712 +n13001206 +n13004423 +n13001529 +n13003254 +n13003061 +n13032115 +n13032381 +n13033577 +n13055577 +n13055949 +n13055423 +n05430628 +n05450617 +n05449959 +n05451384 +n05453657 +n09369169 +n09454412 +n09403211 +n13086908 +n09416076 +n09251407 +n05218119 +n09444100 +n09438940 +n09257949 +n09189157 +n09475044 +n11691857 +n13102775 +n13087625 +n13022709 +n11675842 +n13152742 +n13125117 +n13129165 +n11690254 +n11669335 +n13134947 +n11676500 +n11675025 +n11674332 +n11669786 +n13131028 +n13132338 +n13132656 +n12301445 +n13133613 +n13141415 +n13137409 +n12642090 +n12267677 +n12658481 +n12144313 +n12158031 +n13135832 +n12620546 +n11636835 +n13139055 +n12144580 +n07929351 +n13136556 +n12768682 +n11689483 +n13136316 +n07770571 +n07737081 +n07774842 +n07774596 +n07775050 +n07772788 +n07771212 +n07772147 +n07772274 +n07774719 +n07737745 +n07772935 +n15086247 +n11879895 +n12576323 +n12532564 +n07814634 +n07775197 +n07770763 +n11748002 +n12172364 +n12515925 +n12560282 +n12578916 +n12560621 +n12544539 +n12024690 +n13154494 +n11690455 +n12927013 +n11953610 +n13128365 +n13133932 +n13163991 +n13134059 +n13131618 +n13130726 +n11678010 +n12136392 +n11979964 +n12088223 +n12462805 +n12433081 +n09218494 +n09381242 +n09460046 +n09451237 +n09450163 +n01904182 +n13155095 +n09432283 +n11705387 +n09438844 +n11692265 +n05237755 +n09416890 +n01956764 +n01904806 +n01904886 +n05586759 +n05581932 +n01904029 +n05238282 +n05254795 +n02469248 +n05256862 +n05258051 +n01899894 +n05261404 +n05259914 +n05261310 +n05260240 +n05262185 +n05261566 +n05262534 +n05262422 +n05263183 +n05263448 +n11524662 +n11448153 +n09247410 +n11508382 +n11524451 diff --git a/data/9k.names b/data/9k.names new file mode 100644 index 00000000000..e81c80e79e8 --- /dev/null +++ b/data/9k.names @@ -0,0 +1,9418 @@ +thing +matter +object +atmospheric phenomenon +body part +body of water +head +hair +structure +vein +mouth +heel +watercourse +ocean +gas +solid +substance +food +tear gas +sky +ice +food +cheese +yogurt +produce +baked goods +cake mix +Emmenthal +Camembert +Brie +mozzarella +Stilton +double cream +edible fruit +vegetable +currant +custard apple +citrus +jackfruit +pomegranate +avocado +prickly pear +apple +carambola +fig +mangosteen +tangelo +plum +papaya +apricot +berry +elderberry +loquat +pear +litchi +peach +muscat +grape +banana +pitahaya +rambutan +kiwi +melon +breadfruit +pineapple +mango +date +papaw +durian +passion fruit +jujube +guava +dried fruit +cherry +quince +nectarine +cherimoya +soursop +lime +mandarin +kumquat +orange +lemon +citron +grapefruit +pomelo +clementine +tangerine +satsuma +sweet orange +bitter orange +navel orange +Valencia orange +crab apple +eating apple +Granny Smith +Delicious +McIntosh +Red Delicious +Golden Delicious +strawberry +mulberry +currant +lingonberry +blackberry +red currant +raspberry +cranberry +acerola +persimmon +blueberry +bilberry +muskmelon +watermelon +cantaloup +sour cherry +sweet cherry +bing cherry +mushroom +asparagus +plantain +pumpkin +cucumber +root vegetable +cruciferous vegetable +raw vegetable +solanaceous vegetable +artichoke +legume +leek +squash +greens +celery +cardoon +gumbo +pieplant +onion +fennel +taro +beet +yam +carrot +potato +baked potato +mashed potato +french fries +mustard +cabbage +kohlrabi +cauliflower +brussels sprouts +broccoli rabe +broccoli +radish +turnip +collards +bok choy +savoy cabbage +head cabbage +kale +pepper +tomato +eggplant +tomatillo +sweet pepper +hot pepper +bell pepper +pimento +green pepper +chili +tabasco +cayenne +jalapeno +cherry tomato +beefsteak tomato +bean +pea +chickpea +lentil +soy +common bean +black bean +kidney bean +fresh bean +green bean +shell bean +snap bean +haricot vert +string bean +fava bean +green soybean +green pea +snow pea +sugar snap pea +summer squash +winter squash +spaghetti squash +zucchini +yellow squash +butternut squash +acorn squash +chard +turnip greens +salad green +bean sprout +spinach +lamb's-quarter +cress +chicory +chicory escarole +radicchio +lettuce +leaf lettuce +crisphead lettuce +cos +green onion +shallot +purple onion +doughnut +bread +crouton +breadstick +soft pretzel +rye bread +dark bread +raisin bread +brown bread +cinnamon bread +quick bread +matzo +sour bread +bun +white bread +challah +loaf of bread +pretzel +English muffin +toast +nan +chapatti +garlic bread +Yorkshire pudding +banana bread +scone +Irish soda bread +biscuit +muffin +drop scone +cornbread +nut bread +buttermilk biscuit +hardtack +shortcake +corn muffin +popover +bran muffin +cornpone +hush puppy +johnnycake +hamburger bun +bagel +frankfurter bun +sweet roll +hard roll +brioche +crescent roll +honey bun +cinnamon roll +cross bun +Italian bread +baguet +French bread +meat loaf +French loaf +material +stucco +gravel +rock +leopard +soil +sand +loofa +paper +litter +toilet tissue +queen +comestible +foodstuff +fare +beverage +soul food +feed +nutriment +yolk +comfort food +egg +grain +carrot juice +soya milk +whole wheat flour +oatmeal +ingredient +dairy product +cocoa +concoction +Spam +juice +canned food +corn +rice +wild rice +barley +wheat +sweet corn +popcorn +white rice +paddy +flavorer +egg yolk +saffron +juniper berries +cayenne +sesame seed +sassafras +spice +condiment +sweetening +herb +paprika +garlic +nasturtium +mocha +cardamom +nutmeg +stick cinnamon +Chinese anise +clove +cinnamon +guacamole +chili sauce +olive +chutney +vinegar +dip +soy sauce +salsa +cranberry sauce +catsup +spread +green olive +sauce +wine vinegar +cider vinegar +hummus +miso +spaghetti sauce +chocolate sauce +Tabasco +hot sauce +veloute +pesto +dressing +bourguignon +hollandaise +carbonara +tomato sauce +green mayonnaise +mayonnaise +powdered sugar +honey +syrup +sorghum +grenadine +maple syrup +basil +lemon balm +sweet woodruff +clary sage +hyssop +comfrey +coriander +mint +chives +marjoram +borage +sage +tea +rosemary +parsley +bay leaf +thyme +tea bag +oolong +souchong +cream +milk +whipping cream +clotted cream +light cream +heavy cream +stuffing +batter +dough +filling +pastry +bread dough +puff paste +phyllo +chow +menu +dietary +diet +diet +dietary supplement +vegetarianism +vitamin pill +multivitamin +alcohol +fruit juice +fizz +near beer +cocoa +coffee +cider +tea +soft drink +fruit drink +ginger beer +drinking water +potion +smoothie +mixed drink +liquor +sake +wine +hooch +home brew +liqueur +hard cider +brew +neutral spirits +aperitif +highball +cocktail +spritzer +punch +pina colada +mimosa +julep +gin and tonic +Bloody Mary +martini +gimlet +gin and it +daiquiri +sidecar +Sazerac +margarita +cup +May wine +eggnog +fruit punch +vodka +firewater +aquavit +grog +schnapps +arrack +gin +rum +aqua vitae +tequila +bitters +geneva +brandy +ouzo +whiskey +eau de vie +Cognac +grappa +Armagnac +Calvados +Irish +bourbon +sour mash +Scotch +rye +corn whiskey +blended whiskey +blush wine +vintage +champagne +vin ordinaire +dessert wine +macon +sparkling wine +Cotes de Provence +varietal +Burgundy +fortified wine +Bordeaux +table wine +California wine +vermouth +red wine +Rhone wine +white wine +Montrachet +Beaujolais +Chablis +Madeira +sherry +malmsey +port +muscat +Saint Emilion +claret +dry vermouth +sweet vermouth +Medoc +Chianti +Pinot noir +Rioja +Merlot +Cabernet +zinfandel +Riesling +Sauvignon blanc +Muscadet +Yquem +Pinot blanc +Sauterne +Chenin blanc +Chardonnay +sack +Verdicchio +Canary wine +Pernod +Drambuie +sambuca +triple sec +absinth +maraschino +anisette +beer +lager +draft beer +ale +suds +Munich beer +Pilsner +light beer +malt +bock +Weissbier +porter +stout +bitter +pale ale +Guinness +Weizenbock +orange juice +cranberry juice +nectar +iced coffee +caffe latte +espresso +cappuccino +Irish coffee +chicory +cafe au lait +mocha +Turkish coffee +ice tea +cuppa +tonic +cola +orange soda +ginger ale +pop +root beer +Coca Cola +Pepsi +mineral water +bottled water +soda water +oil cake +bird feed +fodder +eatage +hay +alfalfa +broad bean +dainty +fast food +puree +finger food +dish +course +mother's milk +vitamin +kosher +meal +jello +gelatin +sweet +candied apple +confiture +candy +chewing gum +confectionery +maraschino +conserve +strawberry jam +apple butter +lemon curd +jam +jelly +peppermint +peanut brittle +chocolate kiss +nougat bar +candy bar +jelly bean +lollipop +candy cane +truffle +chocolate fudge +cough drop +sugar candy +Easter egg +kiss +gumdrop +candy corn +fondant +cotton candy +caramel +fudge +candy egg +chocolate egg +bubble gum +gum ball +poached egg +piece de resistance +side dish +stew +omelet +soup +sashimi +taco +French toast +cheese souffle +potpie +lamb curry +stuffed tomato +chow mein +croquette +gefilte fish +coq au vin +special +spaghetti and meatballs +eggs Benedict +schnitzel +buffalo wing +chicken casserole +rissole +paella +frittata +meatball +chili +porridge +tamale +stuffed tomato +couscous +deviled egg +beef Wellington +pasta +egg roll +enchilada +falafel +mushy peas +turnover +scrambled eggs +Spanish rice +teriyaki +barbecued spareribs +pilaf +kabob +tempura +samosa +fried egg +sandwich plate +chicken cacciatore +saute +fried rice +custard +sukiyaki +fish and chips +souffle +steak au poivre +pizza +fondue +biryani +stuffed peppers +mousse +shirred egg +Swedish meatball +jambalaya +Scotch egg +burrito +risotto +salad +boiled egg +curry +snack food +bouillabaisse +goulash +pottage +beef stew +hot pot +fish stew +hotchpotch +Irish stew +ratatouille +gazpacho +won ton +petite marmite +split-pea soup +consomme +chowder +potage +marmite +lentil soup +bisque +pea soup +pepper pot +chicken broth +chicken soup +broth +broth +gumbo +borsch +corn chowder +clam chowder +fish chowder +gruel +congee +macaroni and cheese +lasagna +cannelloni +spaghetti +creme caramel +creme brulee +pepperoni pizza +anchovy pizza +cheese pizza +Sicilian pizza +sausage pizza +chocolate fondue +cheese fondue +coleslaw +macaroni salad +tossed salad +salad nicoise +pasta salad +fruit salad +tabbouleh +green salad +chef's salad +hard-boiled egg +Easter egg +sandwich +corn chip +chip +bomber +cheeseburger +chicken sandwich +ham sandwich +Reuben +bacon-lettuce-tomato sandwich +chili dog +open-face sandwich +gyro +wrap +hamburger +club sandwich +hotdog +tortilla chip +nacho +entree +plate +dessert +appetizer +mousse +tiramisu +frozen dessert +pudding +pudding +trifle +flan +whip +dumpling +compote +chocolate mousse +pavlova +parfait +ice-cream cake +ice lolly +ice-cream sundae +ice-cream cone +ice cream +ice +banana split +frozen yogurt +frozen custard +vanilla ice cream +peach ice cream +chocolate ice cream +strawberry ice cream +plum pudding +chocolate pudding +shrimp cocktail +stuffed mushroom +cocktail +hors d'oeuvre +carrot stick +antipasto +water-soluble vitamin +fat-soluble vitamin +vitamin P +vitamin C +B-complex vitamin +vitamin B2 +inositol +vitamin B6 +choline +pantothenic acid +vitamin B12 +vitamin Bc +vitamin D +vitamin A1 +picnic +bite +supper +breakfast +refection +smorgasbord +buffet +brunch +continental breakfast +dinner +lunch +banquet +cookout +fish fry +barbecue +refreshment +nosh +land +location +land +fomite +part +geological formation +cobweb +whole +hail +swamp +cultivated land +region +region +pass +line +point +opening +bedside +soil horizon +extremity +boundary +nib +selvage +shoreline +benthos +resort area +geographical area +district +scrubland +bush +oilfield +field +tract +heronry +grassland +site +court +basketball court +fairground +plot +field +amusement park +veld +pasture +campsite +garbage heap +cemetery +flowerbed +garden +topiary +peach orchard +yard +grainfield +playground +garden +city +city district +eparchy +kasbah +waterfront +business district +col +defile +hemline +spoor +crest +topographic point +workplace +half-mast +intersection +bus stop +mecca +hole-in-the-wall +patisserie +bakery +farm +piggery +ranch +dairy +knothole +chasm +oxbow +floor +pinetum +plain +steppe +cigarette butt +pipefitting +handle +panhandle +stock +haft +ax handle +broomstick +pistol grip +arete +volcanic crater +spring +ice mass +natural depression +natural elevation +oceanfront +massif +cliff +shore +talus +ridge +range +lakefront +slope +cave +foreshore +beach +hot spring +geyser +icecap +iceberg +Alpine glacier +glacier +valley +lunar crater +landfill +sinkhole +basin +crater +bed +hole +arroyo +ravine +canyon +gorge +tidal basin +cirque +ocean floor +riverbed +streambed +burrow +pothole +tableland +hill +mountain +highland +ridge +promontory +anthill +butte +foothill +knoll +alp +ben +volcano +sandbar +dune +reef +bank +coral reef +atoll +sandbank +bluff +point +mull +crag +precipice +seashore +strand +lakeside +littoral +seaside +mountainside +descent +hillside +ski slope +escarpment +bank +downhill +ascent +brae +uphill +riverbank +waterside +cove +cavern +grotto +artifact +living thing +natural object +assembly +block +millstone +paving +creation +opening +plaything +surface +tramline +structure +instrumentality +padding +covering +fabric +bookmark +float +building material +decoration +way +strip +article +facility +excavation +commodity +sheet +fixture +blacktop +line +bullion +tessera +tile +anvil +representation +art +needlework +product +pieta +map +sketch +sonogram +photograph +waxwork +arthrogram +radiogram +photomicrograph +photostat +painting +triptych +nude +finger-painting +smocking +stitch +sewing stitch +knitting stitch +lockstitch +hemstitch +garter stitch +purl +book +work +jotter +newspaper +wicker +masterpiece +openwork +woodwork +lacquerware +cabinetwork +joinery +decolletage +gargoyle +aperture +hole +mouthpiece +outfall +plughole +manhole +keyhole +perforation +thumbhole +pogo stick +ball +pinata +teddy +jungle gym +bubble +hula-hoop +pinwheel +slide +sport kite +cockhorse +doll +foam +air bubble +spume +shaving foam +golliwog +kachina +horizontal surface +board +tabletop +side +platform +tarmacadam +floor +turntable +stage +dais +sumo ring +hurricane deck +flatbed +parquet +backgammon board +pegboard +facade +ceiling +body +floor +bridge +corner +conformation +superstructure +airdock +cross +house of cards +hull +gun enclosure +lookout +building complex +shelter +honeycomb +column +altar +arch +tower +transept +mound +fountain +obelisk +fan vaulting +arcade +loggia +coil +billboard +partition +masonry +skein +colonnade +obstruction +building +sail +projection +peristyle +door +stadium +drinking fountain +area +balcony +porch +dock +high altar +housing +supporting structure +balance +defensive structure +entablature +memorial +establishment +signboard +bodywork +fuselage +ground floor +mezzanine +loft +basement +footbridge +drawbridge +cantilever bridge +rope bridge +overpass +truss bridge +viaduct +steel arch bridge +covered bridge +gangplank +suspension bridge +trestle bridge +plant +college +winery +factory +distillery +oil refinery +refinery +rolling mill +foundry +steel mill +lumbermill +stamp mill +quartz battery +battery +harbor +Nissen hut +hovel +tent +hut +igloo +dugout +mountain tent +pup tent +pavilion +backpacking tent +fly tent +canvas tent +field tent +wall tent +circus tent +Gothic arch +round arch +pointed arch +triumphal arch +broken arch +Moorish arch +Roman arch +campanile +turret +clock tower +shot tower +church tower +minaret +pylon +silo +watchtower +trestle +pylon +steeple +fire tower +high-rise +supporting tower +control tower +bell tower +beacon +burial mound +snowbank +rampart +fraise +battlement +altarpiece +wall +gable +wainscoting +attic +pediment +bell gable +brickwork +stonework +barrier +obstacle +plug +lever +grate +safety rail +movable barrier +bannister +breakwater +grille +weir +railing +hurdle +starting gate +fence +dam +gate +door +lychgate +portcullis +turnstile +French window +car door +screen door +French door +double door +interior door +sliding door +revolving door +barn door +hatchback +storm door +wall +retaining wall +rail fence +chainlink fence +dry wall +hedge +worm fence +picket fence +stone wall +water jump +bunker +earplug +cork +tap +presbytery +hotel +tenement +abattoir +apartment building +aviary +hall +house +Roman building +rest house +outbuilding +funeral home +medical building +hotel-casino +library +casino +farm building +place of worship +restaurant +ministry +rotunda +observatory +office building +temple +signal box +government building +greenhouse +rink +planetarium +public house +bowling alley +house +ruin +architecture +skyscraper +gazebo +school +chapterhouse +theater +hall of residence +conservatory +center +resort hotel +resort +motel +dude ranch +Ritz +ski lodge +hostel +motor hotel +city hall +guildhall +lyceum +field house +oast house +courthouse +shed +garage +carport +outhouse +coach house +boathouse +woodshed +apiary +maternity hospital +dispensary +stable +chicken coop +cowbarn +barn +pantheon +church +temple +shrine +stupa +masjid +synagogue +mosque +chapel +kirk +abbey +cathedral +cathedral +minster +cafe +rotisserie +automat +brasserie +cafeteria +diner +capitol +embassy +town hall +chancellery +customhouse +Statehouse +courthouse +ice rink +ice hockey rink +alehouse +free house +solar house +bungalow +row house +cabin +duplex house +mansion +lodging house +gatehouse +log cabin +saltbox +country house +dollhouse +ranch house +boarding house +detached house +villa +chalet +residence +farmhouse +terraced house +brownstone +palace +stately home +manor +summer house +dacha +villa +chateau +manse +religious residence +glebe house +parsonage +palace +monastery +abbey +abbey +day school +conservatory +music school +opera +music hall +cinema +little theater +home theater +control center +settlement house +call center +cornice +cog +knob +bill +flange +brim +tine +eaves +tooth +pinhead +football stadium +hippodrome +dome +ballpark +bullring +amphitheater +patio +corner +baggage claim +hideaway +choir +breakfast area +quad +chancel +auditorium +court +dining area +room +assembly hall +enclosure +nave +aisle +storage space +goalmouth +food court +atrium +cloister +forecourt +toilet +sun parlor +engineering +surgery +rotunda +classroom +gallery +manor hall +cell +lounge +sauna +dressing room +billiard room +belfry +kitchen +library +storeroom +workroom +sewing room +anechoic chamber +dining room +recreation room +hospital room +reading room +booth +conference room +bedroom +clean room +living room +door +hall +reception room +boardroom +study +locker room +cocktail lounge +television room +compartment +court +poolroom +bathroom +control room +anteroom +water closet +men's room +washroom +public toilet +home room +lecture room +study hall +pantry +stockroom +vault +refectory +dining-hall +canteen +family room +rumpus room +emergency room +recovery room +operating room +telephone booth +voting booth +confessional +shower stall +master bedroom +motel room +guestroom +hotel room +dormitory +nursery +day nursery +great hall +concert hall +palace +exhibition hall +parlor +drawing room +press box +command module +cabin +pilothouse +cab +luggage compartment +cabinet +cockpit +stateroom +car +cable car +stall +drawing room +terrarium +cage +playpen +pen +vivarium +pound +lock +chicken yard +chamber +recess +birdcage +rabbit hutch +hutch +cow pen +rodeo +fold +sounding board +burial chamber +firing chamber +resonator +furnace +bomb shelter +hyperbaric chamber +repository +mausoleum +kiln +blast furnace +oast +gas oven +incinerator +mihrab +columbarium +fire +fireplace +apse +cellar +cupboard +stacks +gallery +amphitheater +organ loft +stoop +sun deck +front porch +veranda +deck +back porch +portico +marina +dry dock +block +dwelling +tennis camp +living quarters +mobile home +condominium +apartment +ward +cellblock +condominium +yurt +lodge +vacation home +hearth +fixer-upper +cliff dwelling +homestead +semi-detached house +wigwam +tepee +accommodation +first class +cabin class +bedsitting room +flatlet +chassis +support +framework +pedestal +buttress +flying buttress +abutment +ribbing +bustle +window frame +frame +gantry +honeycomb +truss +lattice +cornice +picture frame +window +climbing frame +trellis +airframe +grate +grape arbor +walker +casing +tambour +arbor +rack +mounting +sash +casement +oriel +bay window +stained-glass window +skylight +display window +rose window +porthole +transom +clerestory +dormer +dormer window +lancet window +fanlight +plate rack +barbecue +bicycle rack +luggage rack +dish rack +towel rack +passe-partout +pave +mount +stronghold +fortress +fortification +bastion +keep +kremlin +acropolis +alcazar +martello tower +fieldwork +bastion +escarpment +palisade +castle +cenotaph +megalith +Seven Wonders of the Ancient World +brass +national monument +pantheon +dolmen +menhir +place of business +institution +university +mercantile establishment +office +cabaret +health spa +plaza +country store +department store +shop +marketplace +boutique +salon +shoe shop +bookshop +package store +thriftshop +junk shop +toyshop +cleaners +bazaar +gift shop +florist +drugstore +garage +delicatessen +small stores +barbershop +stall +tobacco shop +newsstand +butcher shop +pizzeria +confectionery +convenience store +bazaar +agora +grocery store +open-air market +supermarket +hypermarket +greengrocery +souk +farmer's market +flea market +newsroom +box office +headquarters +correctional institution +orphanage +jail +penitentiary +prison +toiletry +weaponry +equipment +connection +implement +furnishing +device +ceramic +system +container +conveyance +medium +deodorant +bath oil +cream +lotion +shaving cream +hair spray +mousse +perfume +hairdressing +antiperspirant +powder +cosmetic +bath salts +hand cream +cold cream +sunscreen +lanolin +body lotion +toner +hand lotion +after-shave +potpourri +patchouli +perfumery +cologne +toilet water +pomade +brilliantine +toilet powder +talcum +depilatory +highlighter +makeup +face powder +lip-gloss +eyeshadow +mascara +lipstick +rouge +eyeliner +eyebrow pencil +armament +defense system +bomb +ammunition +naval weaponry +bazooka +artillery +launcher +cannon +field artillery +mortar +basilisk +hydrogen bomb +atom bomb +round +shotgun shell +recorder +sports equipment +photographic equipment +naval equipment +parasail +gear +satellite +game equipment +parachute +electronic equipment +apparatus +automation +material +baggage +tape recorder +cassette recorder +Dictaphone +videocassette recorder +baseball equipment +croquet mallet +clay pigeon +skate +wrestling mat +cricket equipment +basketball equipment +javelin +shuttlecock +golf equipment +spike +stick +boxing equipment +boxing glove +gymnastic apparatus +weight +baseball glove +batting cage +batting glove +base +batting helmet +baseball bat +home plate +first base +third base +second base +in-line skate +Rollerblade +roller skate +ice skate +hockey skate +speed skate +figure skate +cricket bat +wicket +golfcart +golf glove +tee +golf club +wood +iron +driver +spoon +wedge +midiron +putter +niblick +pitching wedge +sand wedge +hockey stick +polo mallet +horizontal bar +horse +uneven parallel bars +parallel bars +trampoline +balance beam +vaulting horse +pommel horse +dumbbell +barbell +enlarger +camera +clapperboard +film +light meter +box camera +flash camera +Polaroid camera +point-and-shoot camera +webcam +motion-picture camera +digital camera +portrait camera +reflex camera +X-ray film +reel +negative +regalia +kit +rig +fishing gear +stable gear +rigging +crown +crown jewels +sewing kit +first-aid kit +carpenter's kit +layette +drill rig +drilling platform +harness +snaffle +headgear +saddle blanket +halter +bridle +sputnik +space station +backboard +ball +puzzle +pool table +bowling pin +man +chip +roulette wheel +goal +volleyball net +pinball machine +soccer ball +pool ball +bowling ball +softball +field hockey ball +punching bag +billiard ball +croquet ball +cricket ball +tennis ball +golf ball +rugby ball +cue ball +medicine ball +basketball +eight ball +ping-pong ball +handball +baseball +racquetball +bocce ball +volleyball +jigsaw puzzle +crossword puzzle +chessman +white +pawn +basket +net +electronic fetal monitor +monitor +monitor +television monitor +telephone +oscilloscope +peripheral +booster +cassette player +CD player +receiver +audio system +lens +playback +television equipment +circuitry +cassette deck +central processing unit +mixer +scanner +tape player +detector +modem +equalizer +tape deck +amplifier +cellular telephone +speakerphone +desk phone +pay-phone +handset +dial telephone +radiotelephone +television receiver +radio receiver +satellite receiver +heterodyne receiver +clock radio +reproducer +hi-fi +stereo +iPod +Walkman +video iPod +ghetto blaster +camcorder +television camera +pendulum +purifier +sequencer +reformer +duplicator +heat pump +semaphore +tomograph +ultracentrifuge +generator +incubator +burner +Foucault pendulum +clock pendulum +metronome +Photostat +photocopier +Xerox +facsimile +mimeograph +positron emission tomography scanner +computerized axial tomography scanner +gas burner +blowtorch +bunsen burner +gas ring +packaging +blister pack +roofing +temporary hookup +slip ring +telephone line +ligament +junction +hot line +digital subscriber line +land line +binder +wire +chain +concertina +barbed wire +paper chain +anchor chain +fob +bicycle chain +tire chain +chatelaine +joint +contact +dovetail +welt +hinge +scarf joint +weld +seam +mortise joint +butt hinge +strap hinge +distributor point +tread +wiper +bar +tool +utensil +rubber eraser +needle +eraser +stick +brush +hook +sharpener +sports implement +leather strip +swatter +fire iron +oar +stick +cleaning implement +rod +writing implement +shovel +split rail +fret +bolt +rotor +towel rail +lever +track +handlebar +crowbar +stick +key +tappet +pedal +rocker arm +gun trigger +space bar +backspace key +shift key +telegraph key +accelerator +sustaining pedal +hand tool +jack +pestle +garden tool +plow +comb +drill +cutting implement +tamp +garden rake +rake +stamp +locking pliers +pestle +plunger +pincer +pliers +soldering iron +spade +hammer +pipe cutter +wrench +screwdriver +trowel +saw +opener +scraper +shovel +brick trowel +spatula +carpenter's hammer +gavel +mallet +maul +torque wrench +pipe wrench +adjustable wrench +open-end wrench +Allen wrench +box wrench +hacksaw +folding saw +handsaw +pruner +pruning saw +corkscrew +bottle opener +can opener +hedge trimmer +lawn mower +power mower +riding mower +power drill +electric drill +cutter +twist bit +bit +blade +knife blade +bolt cutter +cigar cutter +edge tool +scissors +knife +ax +razor +wire cutter +chisel +plane +shears +snips +pruning shears +secateurs +carving knife +Bowie knife +pocketknife +cleaver +hunting knife +case knife +parer +letter opener +switchblade +penknife +battle-ax +hatchet +shaver +straight razor +safety razor +cold chisel +wood chisel +jointer +smooth plane +spokeshave +kitchen utensil +ceramic ware +funnel +rolling pin +reamer +masher +kitchenware +squeezer +mixer +cookie cutter +cooking utensil +grater +mincer +eggbeater +whisk +blender +pan +Crock Pot +chafing dish +spatula +griddle +enamelware +steamer +cookie sheet +cooker +turner +omelet pan +stewing pan +frying pan +roaster +wok +saucepan +graniteware +cloisonne +porcelain +earthenware +stoneware +pottery +Spode +china +bone china +majolica +faience +knitting needle +crochet needle +walking stick +matchstick +club +fiddlestick +spindle +stob +staff +drumstick +mallet +cane +sword cane +bat +table-tennis racquet +truncheon +alpenstock +flagpole +crutch +electric toothbrush +toothbrush +sable +scrub brush +hairbrush +bristle brush +shaving brush +pencil sharpener +steel +cue +racket +squash racket +tennis racket +badminton racket +thong +strap +cheekpiece +rein +noseband +leading rein +scull +paddle +besom +scouring pad +dustmop +squeegee +broom +swab +rotating shaft +wand +shaft +piston rod +kickstand +axle +pole +fishing rod +connecting rod +tie rod +driveshaft +crankshaft +transmission shaft +spindle +camshaft +boom +stilt +ski pole +clothes tree +caber +spar +mast +mast +bowsprit +yard +mizzenmast +royal mast +mainmast +foremast +fly rod +spinning rod +pencil +pen +highlighter +chalk +crayon +lead pencil +ballpoint +Sharpie +quill +fountain pen +felt-tip pen +furniture +office furniture +dining-room furniture +wardrobe +bedroom furniture +table +table +wall unit +lamp +dining-room table +washstand +buffet +cabinet +baby bed +bedstead +lawn furniture +credenza +bookcase +entertainment center +etagere +seat +sectional +chest of drawers +file +Rolodex +card index +vertical file +clothes closet +armoire +bed +berth +platform bed +hospital bed +bunk +trundle bed +four-poster +couch +bunk bed +twin bed +sleigh bed +single bed +hammock +Murphy bed +double bed +gaming table +gueridon +table-tennis table +counter +altar +breakfast table +stand +conference table +pedestal table +kitchen table +operating table +tea table +lectern +worktable +gateleg table +dressing table +desk +drop-leaf table +coffee table +trestle table +console table +checkout +bar +meat counter +reception desk +salad bar +snack bar +drafting table +lab bench +writing desk +secretary +davenport +dining table +dinner table +refectory table +floor lamp +table lamp +reading lamp +dresser +china cabinet +medicine chest +bassinet +crib +carrycot +cradle +chair +toilet seat +stool +sofa +ottoman +bench +lawn chair +chaise longue +rocking chair +swivel chair +throne +straight chair +ladder-back +highchair +armchair +Windsor chair +folding chair +wheelchair +motorized wheelchair +barber chair +easy chair +recliner +Morris chair +wing chair +deck chair +camp chair +music stool +taboret +footstool +settee +daybed +convertible +love seat +chesterfield +studio couch +park bench +flat bench +pew +settle +window seat +chiffonier +highboy +bird feeder +heater +lighter +signal +converter +crusher +drive +knocker +peeler +musical instrument +shoehorn +shock absorber +machine +conductor +bait +stabilizer +filter +mechanism +acoustic device +trap +charger +airfoil +router +pick +energizer +fan +hydrofoil +dental appliance +adapter +toy +support +optical device +straightener +tongs +phonograph needle +instrument +comb +remote control +exercise device +comforter +washboard +shredder +water ski +blower +ventilator +breathing device +applicator +skeleton key +guitar pick +restraint +keyboard +electrical device +appliance +fire extinguisher +corrective +reflector +alarm +electronic device +snowshoe +holding device +memory device +key +noisemaker +source of illumination +indicator +detector +breathalyzer +imprint +afterburner +horn +elastic device +ski +lifting device +solar heater +electric heater +radiator +gas heater +convector +space heater +stove +cigar lighter +match +cairn +sign +street sign +traffic light +electrical converter +catalytic converter +inverter +synchronous converter +external drive +CD-ROM drive +internal drive +stringed instrument +electronic instrument +keyboard instrument +wind instrument +bass +percussion instrument +dulcimer +chordophone +banjo +zither +samisen +guitar +bowed stringed instrument +sitar +lute +mandola +mandolin +harp +acoustic guitar +Hawaiian guitar +uke +electric guitar +viol +violin +cello +viola +viola da gamba +Stradavarius +theremin +electric organ +synthesizer +piano +clavier +organ +accordion +grand piano +upright +spinet +mechanical piano +baby grand +concert grand +harpsichord +spinet +ocarina +woodwind +brass +organ pipe +free-reed instrument +whistle +pipe +kazoo +flute +beating-reed instrument +double-reed instrument +single-reed instrument +bassoon +oboe +clarinet +sax +baritone +bugle +flugelhorn +French horn +trombone +cornet +harmonium +harmonica +concertina +chanter +panpipe +bagpipe +fipple flute +pennywhistle +drone +bass fiddle +bass horn +bass guitar +euphonium +handbell +bones +gong +vibraphone +steel drum +marimba +glockenspiel +chime +kettle +maraca +drum +cymbal +bongo +bass drum +tambourine +snare drum +tenor drum +slot machine +power shovel +press +backhoe +printer +machine tool +motor +snow thrower +cash machine +farm machine +computer +Zamboni +mill +staple gun +power tool +concrete mixer +stapler +slicer +textile machine +record player +calculator +vending machine +slot +automat +garlic press +bench press +hydraulic press +punch press +character printer +impact printer +printer +drum printer +line printer +laser printer +Linotype +thermal printer +portable +typewriter +bar printer +wire matrix printer +dot matrix printer +bubble jet printer +ink-jet printer +shaper +drill press +grinder +lathe +miller +engine +electric motor +heat engine +jet engine +automobile engine +aircraft engine +generator +steam engine +internal-combustion engine +wind turbine +gasoline engine +diesel +outboard motor +radial engine +rocket +fanjet +booster +space rocket +alternator +windmill +starter +kick starter +cultivator +haymaker +combine +thresher +harvester +disk harrow +harrow +slide rule +web site +home computer +server +digital computer +supercomputer +workstation +personal computer +portable computer +desktop computer +notebook +planner +laptop +hand-held computer +pepper mill +water mill +meat grinder +coffee mill +treadmill +windmill +electric hammer +power saw +buffer +circular saw +chain saw +table saw +saber saw +bandsaw +spinning wheel +loom +jukebox +gramophone +abacus +adding machine +hand calculator +semiconductor device +wire +cord +heat sink +cable +microprocessor +transistor +light-emitting diode +chip +filament +jumper cable +telephone wire +patchcord +telephone cord +power cord +extension cord +ethernet cable +electrical cable +printer cable +power line +fisherman's lure +fly +dry fly +wet fly +streamer fly +outrigger +vane +strainer +air filter +oil filter +sieve +tea-strainer +colander +fusee drive +android +radiator +mechanical device +rotating mechanism +rotor head +carriage +control +power steering +automaton +action +cooling system +gear +tape drive +film advance +sprinkler +propeller +anchor +golf-club head +weathervane +machine +seeder +pump +gearshift +ride +bumper +hook +ski binding +coupling +record changer +swing +windshield wiper +winder +winder +diaphragm +shutter +escapement +broadcaster +curler +splint +compressor +air compressor +carburetor +dildo +cartridge holder +trapeze +gearing +stator +airplane propeller +screw +pulley +wheel +idle pulley +lever +inclined plane +millwheel +waterwheel +roller +bicycle wheel +caster +grinding wheel +rowel +fifth wheel +wagon wheel +waterwheel +car wheel +sprocket +pinwheel +potter's wheel +gear +driving wheel +paddlewheel +roulette +spur gear +bevel gear +pinion +ramp +ax head +screw +grease-gun +gas pump +bicycle pump +sump pump +hand pump +centrifugal pump +Ferris wheel +roller coaster +carousel +universal joint +clutch +freewheel +disk clutch +bobbin +reel +shuttle +blade +gyroscope +circle +rotor +paddle +impeller +fan blade +disk +puck +brake disk +token +Frisbee +planchet +tail rotor +main rotor +valve +steering wheel +governor +joystick +regulator +switch +ball valve +butterfly valve +timer +flywheel +faucet +thermostat +aperture +mixing faucet +stopcock +toggle switch +push button +dial +horn button +mouse button +doorbell +bell push +flintlock +movement +gunlock +cooling tower +evaporative cooler +air conditioner +gearset +four-wheel drive +whistle +silencer +megaphone +hearing aid +bell +cowbell +church bell +dinner bell +spider web +mousetrap +lobster pot +web +net +landing net +fishnet +vertical stabilizer +spoiler +spoiler +rotor blade +flap +rudder +horizontal stabilizer +wing +exhaust fan +electric fan +brace +denture +backboard +stirrup +pier +pier +back +shelf +landing gear +baluster +spoke +base +step +brace +pillow block +bearing +rocker +coat hanger +harp +rest +bracket +tailstock +bookend +structural member +headstock +seat +thrust bearing +hanger +rack +harness +cantle +ladder-back +bookshelf +mantel +neck brace +knee brace +ankle brace +back brace +arm +headrest +chin rest +armrest +sconce +corbel +shelf bracket +sill +riser +upright +brace +tread +beam +windowsill +doorsill +stile +jamb +column +post +support column +caryatid +goalpost +newel post +bollard +lamppost +telephone pole +maypole +timber +rundle +tie +rafter +girder +timber +floor joist +joist +car seat +pillion +plane seat +saddle +chair +bicycle seat +bucket seat +backseat +stock saddle +English saddle +tripod +spice rack +magazine rack +music stand +camera tripod +easel +autofocus +projector +finder +laser +lens +objective +condenser +camera lens +anastigmat +contact +sunglass +eyepiece +field lens +Fresnel lens +portrait lens +closeup lens +telephoto lens +wide-angle lens +plotter +scientific instrument +measuring instrument +weapon +guillotine +drafting instrument +analyzer +navigational instrument +optical instrument +medical instrument +instrument of punishment +catapult +extractor +theodolite +riding crop +tachymeter +collider +microtome +accelerator +stroboscope +magnifier +console +telescope +microscope +astronomical telescope +equatorial +optical telescope +radio telescope +refracting telescope +field glass +reflecting telescope +Cassegrainian telescope +Newtonian telescope +Schmidt telescope +Maksutov telescope +electron microscope +field-emission microscope +light microscope +binocular microscope +hand glass +operating microscope +compound microscope +loupe +oximeter +dropper +refractometer +rangefinder +barometer +pedometer +thermometer +astrolabe +measuring stick +gauge +timepiece +aneroid barometer +caliper +potentiometer +tachometer +scale +tape +meter +hygrometer +sextant +rule +altazimuth +pyrometer +meat thermometer +water gauge +vacuum gauge +anemometer +gasoline gauge +pressure gauge +manometer +sphygmomanometer +atomic clock +clock +watch +sundial +timer +hourglass +grandfather clock +digital clock +alarm clock +wall clock +analog clock +pendulum clock +cuckoo clock +digital watch +analog watch +pocket watch +wristwatch +stopwatch +parking meter +chronograph +vernier caliper +micrometer +balance +analytical balance +electronic balance +electric meter +odometer +ammeter +speedometer +ohmmeter +water meter +voltmeter +magnetometer +tomahawk +gun +bow +bow and arrow +brass knucks +knife +sword +stun gun +projectile +antiaircraft +firearm +set gun +air gun +gas gun +paintball gun +cannon +autoloader +pistol +twenty-two +Mauser +muzzle loader +rifle +repeating firearm +semiautomatic firearm +automatic firearm +Garand rifle +Luger +semiautomatic pistol +automatic rifle +assault rifle +automatic pistol +machine gun +submachine gun +burp gun +Uzi +Kalashnikov +Tommy gun +Colt +derringer +revolver +gat +flintlock +musket +sniper rifle +Winchester +carbine +crossbow +longbow +khukuri +bayonet +machete +dagger +rapier +fencing sword +broadsword +cavalry sword +saber +epee +foil +bullet +cannonball +compass +protractor +artificial horizon +depth finder +magnetic compass +compass +binoculars +spectacles +projector +telescopic sight +goggles +sunglasses +slide projector +front projector +movie projector +overhead projector +hypodermic syringe +cardiograph +syringe +stethoscope +laryngoscope +otoscope +surgical instrument +retractor +hemostat +pillory +rattan +exercise bike +treadmill +respirator +snorkel +oxygen mask +aqualung +paintbrush +spray gun +brake +handcuff +fastener +seat belt +leash +safety belt +brake system +muzzle +chain +bolt +buckle +knot +cleat +clothespin +catch +pin +dowel +screw +slide fastener +button +seal +paper fastener +lock +thumbtack +locker +clasp +clip +carabiner +nail +toggle +nut and bolt +bowline +bow +latch +hasp +rivet +hairpin +skewer +hatpin +brochette +bobby pin +barrette +safety pin +shirt button +coat button +washer +gasket +head gasket +O ring +padlock +sash fastener +latch +combination lock +doorlock +paper clip +bulldog clip +hair slide +hydraulic brake +disk brake +drum brake +typewriter keyboard +QWERTY keyboard +computer keyboard +piano keyboard +circuit +Segway +jack +control panel +telephone jack +circuit breaker +plug +electrolytic +dashboard +transducer +solar cell +antenna +capacitor +spark plug +relay +surge suppressor +solar array +battery +Tesla coil +closed circuit +wiring +computer circuit +integrated circuit +module +printed circuit +interface +CPU board +circuit board +mosaic +electro-acoustic transducer +earphone +microphone +loudspeaker +telephone receiver +headset +condenser microphone +cardioid microphone +tweeter +bullhorn +tannoy +woofer +subwoofer +omnidirectional antenna +directional antenna +radio antenna +television antenna +dish +scanner +yagi +voltaic battery +flashlight battery +lead-acid battery +pack +prosthesis +solar dish +mirror +hand glass +car mirror +rearview mirror +outside mirror +burglar alarm +automobile horn +shofar +fire alarm +readout +scanner +tube +display +personal digital assistant +dongle +trackball +mouse +answering machine +hearing aid +beeper +triode +pentode +computer monitor +monitor +screen +digital display +liquid crystal display +flat panel display +window +dialog box +caller ID +computer screen +background +C-clamp +chuck +collet +holder +vise +candlestick +cigarette holder +candelabrum +menorah +Menorah +cache +optical disk +magnetic disk +memory +magnetic tape +recording +auxiliary storage +compact disk +videodisk +CD-ROM +CD-R +audio CD +hard disc +diskette +flash memory +random-access memory +videotape +cassette tape +tape +phonograph record +LP +seventy-eight +lamp +light +flash +lantern +candle +neon lamp +vigil light +taillight +gas lamp +oil lamp +hurricane lamp +fluorescent lamp +streetlight +spotlight +electric lamp +jack-o'-lantern +Chinese lantern +flashlight +light bulb +penlight +headlight +room light +strip lighting +fairy light +sconce +searchlight +night-light +blinker +torch +flood +fuel gauge +gnomon +dial +vernier scale +pointer +light pen +hand +sweep hand +minute hand +second hand +hour hand +spring +rubber band +coil spring +box spring +hoist +winch +elevator +crane +wheel and axle +derrick +maze +communication system +network +Global Positioning System +resonator +exhaust +mechanical system +computer system +scaffolding +reticle +walkie-talkie +radio +telecommunication system +telephone system +intercommunication system +interphone +television +satellite television +surveillance system +color television +local area network +superhighway +ethernet +wireless local area network +production line +linkage +suspension +fuel injection +planter +trophy case +wastepaper basket +dish +bread-bin +dispenser +pot +bunker +reliquary +cup +bag +cassette +Dumpster +bag +measuring cup +glass +paintball +measure +envelope +shaker +piggy bank +basket +sewing basket +savings bank +powder horn +can +wheeled vehicle +workbasket +bin +canister +mold +cargo container +videocassette +case +case +vessel +drawer +receptacle +package +watering can +box +cocotte +Petri dish +gravy boat +serving dish +tureen +sugar bowl +bowl +casserole +ramekin +butter dish +salad bowl +mixing bowl +porringer +cereal bowl +soup bowl +punch bowl +roll-on +aerosol +soap dispenser +atomizer +inhaler +demitasse +beaker +kylix +coffee cup +chalice +teacup +Dixie cup +evening bag +shoulder bag +clutch bag +reticule +backpack +sachet +beanbag +sandbag +carryall +pannier +duffel bag +book bag +tool bag +mailbag +purse +drawstring bag +envelope +saddlebag +sack +pouch +shopping bag +toilet bag +gamebag +kitbag +plastic bag +golf bag +sleeping bag +gunnysack +grocery bag +sporran +pocket +waist pack +fanny pack +hip pocket +patch pocket +flute +tumbler +water glass +bumper +liqueur glass +snifter +shot glass +beer glass +rummer +goblet +wineglass +cocktail shaker +saltshaker +pepper shaker +pannier +clothes hamper +hamper +breadbasket +shopping basket +wicker basket +milk can +beer can +soda can +pedicab +camper trailer +rolling stock +motor scooter +self-propelled vehicle +unicycle +wagon +bassinet +handcart +baby buggy +bicycle +horse-drawn vehicle +trailer +car +tricycle +armored vehicle +recreational vehicle +tracked vehicle +snowmobile +bulldozer +locomotive +streetcar +motor vehicle +tractor +forklift +armored personnel carrier +armored car +dune buggy +camper +van +shunter +diesel locomotive +electric locomotive +tank engine +traction engine +steam locomotive +diesel-electric locomotive +diesel-hydraulic locomotive +hearse +truck +amphibian +four-wheel drive +motorcycle +go-kart +car +snowplow +fire engine +van +trailer truck +transporter +garbage truck +ladder truck +tow truck +dump truck +tractor +pickup +delivery truck +moving van +passenger van +police van +bookmobile +trail bike +moped +beach wagon +loaner +Model T +electric +minivan +convertible +compact +cab +shooting brake +racer +hatchback +roadster +berlin +sport utility +sedan +jeep +limousine +cruiser +ambulance +used-car +stock car +subcompact +pace car +hot rod +sports car +coupe +covered wagon +cart +horse cart +dumpcart +jinrikisha +pony cart +oxcart +tea cart +laundry cart +serving cart +barrow +shopping cart +hand truck +bicycle-built-for-two +safety bicycle +push-bike +mountain bike +carriage +gharry +buggy +stagecoach +four-wheeler +baggage car +freight car +passenger car +cabin car +boxcar +tank car +nonsmoker +Pullman +dining car +smoker +recycling bin +ashcan +litterbin +sandbox +pig bed +briefcase +compact +dispatch case +kit +wallet +cardcase +portfolio +ditty bag +cigarette case +shoe +gun case +attache case +locket +writing desk +watch case +baggage +glasses case +hand luggage +satchel +bag +trunk +hatbox +garment bag +weekender +carpetbag +portmanteau +overnighter +valise +boiler +flagon +bowl +ladle +bottle +bottle +pot +pitcher +bathtub +mortar +bucket +drinking vessel +cream pitcher +wine bucket +pressure cooker +tub +inkwell +tin +basin +monstrance +autoclave +churn +barrel +tank +jar +censer +toilet bowl +fishbowl +scoop +soup ladle +smelling bottle +pop bottle +water bottle +jug +catsup bottle +gourd +pill bottle +carboy +flask +beer bottle +ink bottle +demijohn +whiskey bottle +cruet +wine bottle +carafe +phial +whiskey jug +water jug +hipflask +Erlenmeyer flask +thermos +canteen +vacuum flask +magnum +jeroboam +saucepot +teapot +Dutch oven +urn +stockpot +kettle +caldron +percolator +teakettle +coffeepot +coffee urn +samovar +tea urn +sitz bath +hot tub +footbath +mug +loving cup +tankard +coffee mug +toby +beer mug +bidet +birdbath +washbasin +baptismal font +beer barrel +wine cask +keg +gas tank +water heater +septic tank +aquarium +reservoir +water tower +rain barrel +canopic jar +amphora +cookie jar +beaker +urn +Mason jar +vase +crock +jampot +plate +tray +cat box +dustpan +chamberpot +salver +garbage +in-basket +hot-water bottle +ossuary +socket +ashtray +packet +bundle +deck +bale +hay bale +pack +ballot box +carton +coffin +shoebox +snuffbox +pencil box +crate +bandbox +window box +chest +strongbox +cereal box +mailbox +casket +bier +packing box +toolbox +toy box +coffer +hope chest +treasure chest +cedar chest +cash register +safe-deposit +cashbox +safe +tramway +chairlift +sidecar +public transport +semitrailer +horsebox +vehicle +ski tow +roll-on roll-off +trailer +shipping +litter +express +shuttle bus +train +bus +local +freight liner +passenger train +subway train +mail train +freight train +commuter +bullet train +trolleybus +minibus +school bus +steamroller +bumper car +rocket +military vehicle +missile +craft +sled +half track +tank +panzer +personnel carrier +Humvee +aircraft +vessel +spacecraft +hovercraft +heavier-than-air craft +stealth aircraft +lighter-than-air craft +hang glider +glider +helicopter +warplane +airplane +autogiro +bomber +amphibian +propeller plane +airliner +biplane +floatplane +jet +fighter +stealth bomber +seaplane +airbus +widebody aircraft +jumbojet +jetliner +stealth fighter +interceptor +airship +blimp +balloon +hot-air balloon +boat +trawler +yacht +ship +sailing vessel +bareboat +lifeboat +police boat +gondola +sea boat +barge +river boat +tugboat +punt +pilot boat +small boat +ferry +tender +canal boat +fireboat +motorboat +dredger +pontoon +houseboat +skiff +canoe +dinghy +racing boat +coracle +yawl +gig +jolly boat +rowing boat +kayak +outrigger canoe +dugout canoe +racing gig +racing skiff +speedboat +outboard motorboat +cabin cruiser +hydrofoil +shipwreck +wreck +passenger ship +pirate +lightship +hospital ship +steamer +cargo ship +sister ship +warship +liner +luxury liner +cargo liner +cruise ship +paddle steamer +sternwheeler +bottom +container ship +banana boat +oil tanker +submarine +guided missile cruiser +frigate +battleship +guided missile frigate +aircraft carrier +man-of-war +destroyer +attack submarine +nautilus +yawl +clipper +felucca +sloop +ketch +dhow +sailboat +bark +schooner +windjammer +trimaran +catamaran +catboat +space shuttle +space capsule +dogsled +bobsled +bobsled +stretcher +covered couch +telecommunication +vehicle +print media +broadcasting +telephone +radiotelephone +television +reception +radio +cable television +high-definition television +three-way calling +call +voice mail +press +journalism +magazine +newspaper +pulp +slick +comic book +news magazine +tabloid +daily +gazette +Fleet Street +yellow journalism +pillow +pad +sanitary napkin +beer mat +futon +carpet pad +range hood +screen +top +footwear +protective covering +cloak +wrapping +upholstery +cloth covering +mask +finger +floor cover +coating +canopy +flap +domino +folder +planking +earmuff +camouflage +shoji +cap +manhole cover +lid +radiator cap +bottlecap +nipple +clog +shoe +arctic +boot +flats +slipper +overshoe +sabot +slingback +chukka +saddle oxford +spectator pump +brogan +wing tip +walker +blucher +anklet +cleats +gaiter +Loafer +running shoe +oxford +bowling shoe +plimsoll +pump +sandal +chopine +pusher +talaria +flip-flop +espadrille +jodhpur +buskin +ski boot +hip boot +riding boot +rubber boot +Hessian boot +waders +cowboy boot +mule +bootee +cold frame +cloche +washboard +toecap +mulch +shield +bracer +screen +sheathing +bell jar +shade +shelter +splashboard +testudo +roof +faceplate +hood +sheath +cap +mask +facing +crystal +calash +armor +binder +binding +housing +blind +lining +plate +horseshoe +armor plate +breastplate +helmet +cannon +knee piece +pickelhaube +sallet +window screen +fire screen +windshield +mosquito net +lampshade +parasol +lean-to +bell cote +sentry box +birdhouse +canopy +kennel +awning +umbrella +gamp +gable roof +sunroof +mansard +dome +hip roof +tile roof +housetop +vault +slate roof +gambrel +thatch +cupola +geodesic dome +onion dome +barrel vault +ribbed vault +holster +scabbard +shoulder holster +hubcap +thimble +distributor cap +lens cap +gasmask +face mask +ski mask +catcher's mask +body armor +shield +chain mail +bulletproof vest +corselet +cuirass +cabinet +radome +boot +window blind +jalousie +curtain +shutter +Venetian blind +window shade +roller blind +theater curtain +shower curtain +bushing +brake lining +gift wrapping +envelope +cellophane +book jacket +jacket +plastic wrap +shoulder +pant leg +leg +back +cosy +bandage +bosom +slipcover +bedclothes +sleeve +blindfold +eyepatch +skirt +seat +Band Aid +swathe +cast +elastic bandage +quilt +afghan +blanket +bedspread +mattress cover +patchwork +eiderdown +crazy quilt +coverlet +quilted bedspread +raglan sleeve +long sleeve +rug +doormat +mat +scatter rug +shag rug +prayer rug +broadloom +stair-carpet +red carpet +Brussels carpet +fixative +gold plate +verdigris +paint +nail polish +gilt +couch +enamel +veneer +finger paint +enamel +encaustic +oil paint +water-base paint +latex paint +whitewash +earflap +pocket flap +lapel +tongue +revers +tent-fly +file folder +matchbook +plush +muslin +tarpaulin +velvet +batik +khaki +belting +sacking +diaper +voile +duffel +chenille +cotton flannel +toweling +crinoline +panting +chintz +felt +cotton +velveteen +satin +knit +sateen +print +flannel +webbing +gabardine +camouflage +worsted +cashmere +tartan +mohair +brocade +velour +shirttail +boucle +madras +net +paisley +yoke +percale +piece of cloth +moquette +terry +rayon +acetate rayon +cord +permanent press +chiffon +burlap +ticking +basket weave +lace +sheeting +georgette +poplin +denim +flannelette +shantung +camel's hair +nylon +drapery +gauze +organza +foulard +gingham +wool +suede cloth +taffeta +leatherette +tweed +organdy +canopy +etamine +damask +oilcloth +tapestry +broadcloth +pique +homespun +tricot +double knit +jersey +gauze +tulle +chicken wire +handkerchief +groundsheet +dustcloth +dishrag +towel +bandanna +gusset +bib +sail +patch +hand towel +paper towel +dishtowel +fore-and-aft sail +foresail +spinnaker +headsail +topsail +mainsail +balloon sail +jib +mizzen +gaff topsail +lugsail +staysail +lateen +flash +shoulder patch +narrow wale +Bedford cord +macrame +pillow lace +raft +life preserver +life buoy +Mae West +life jacket +stone +brick +lumber +bricks and mortar +tile +concrete +quoin +millstone +stele +hone +grindstone +curbstone +gravestone +firebrick +mud brick +clinker +adobe +strip +chipboard +slat +fingerboard +toothpick +hip tile +pantile +cornice +embellishment +graffito +epergne +necklet +marquetry +brass +garnish +arabesque +design +adornment +frieze +lambrequin +tattoo +mihrab +emblem +swastika +herringbone +spot +flag +banner +totem pole +crucifix +fleur-de-lis +macule +parhelion +jewelry +frill +lavaliere +peplum +bangle +cigar band +aigrette +bracelet +bling +pendant earring +necklace +ghat +path +road +passage +sidewalk +towpath +pedestrian crossing +highway +carriageway +thoroughfare +trail +divided highway +expressway +arterial road +autostrada +autobahn +street +street +piste +horse-trail +adit +conduit +passageway +tube +sluice +snorkel +waterspout +catheter +barrel +pipe +hookah +tailpipe +drain +culvert +soil pipe +tunnel +stairwell +gangway +catacomb +railroad tunnel +tape +band +inkle +adhesive tape +plaster +cellulose tape +headstall +girdle +tire +armlet +radial +car tire +tableware +riband +cutlery +glass +hollowware +platter +spoon +table knife +fork +Spork +soupspoon +teaspoon +sugar spoon +wooden spoon +iced-tea spoon +tablespoon +dessert spoon +case knife +butter knife +steak knife +tablefork +carving fork +airfield +telpherage +air terminal +airport +menagerie +storehouse +station +warehouse +granary +crib +mineshaft +ditch +irrigation ditch +furrow +consumer goods +linen +clothing +appliance +leisure wear +grey +blue +nightwear +protective garment +outerwear +neckpiece +knitwear +loungewear +apparel +collar +military uniform +headdress +pajama +garment +array +woman's clothing +overall +glove +accessory +black +footwear +attire +ready-to-wear +beachwear +man's clothing +street clothes +slip-on +shin guard +overall +pressure suit +arm guard +foul-weather gear +diving suit +apron +shoulder pad +coverall +chest protector +elbow pad +spacesuit +knee pad +gown +vestment +chasuble +academic gown +battle dress +fatigues +dress uniform +khakis +helmet +hood +turban +hat +cap +cowl +tiara +football helmet +hard hat +crash helmet +sunhat +fur hat +cowboy hat +bearskin +boater +snap-brim hat +fedora +cavalier hat +sombrero +tricorn +beaver +porkpie +bonnet +pith hat +bowler hat +millinery +cloche +pillbox +baseball cap +coonskin cap +shower cap +kepi +balaclava +fez +tam +beret +skullcap +cloth cap +ski cap +watch cap +bathing cap +mortarboard +yarmulke +beanie +head covering +scarf +romper +diaper +wraparound +robe +wet suit +legging +skirt +undergarment +separate +vest +shirt +overgarment +hose +burqa +trouser +trouser +straitjacket +fur +neckwear +sweat suit +leotard +swimsuit +hand-me-down +raglan +suit +sweater +gown +face veil +niqab +chador +mantilla +muffler +headscarf +tudung +feather boa +stole +hijab +khimar +dressing gown +kimono +abaya +bathrobe +gaiter +spat +overskirt +grass skirt +miniskirt +kilt +maxi +ballet skirt +dirndl +sarong +hoopskirt +petticoat +brassiere +foundation garment +singlet +garter belt +crinoline +underwear +body stocking +camisole +uplift +chemise +underpants +corset +panty girdle +roll-on +lingerie +long johns +BVD +undies +nightgown +bloomers +thong +bikini pants +briefs +pantie +drawers +work-shirt +kurta +jersey +dashiki +polo shirt +coat +cloak +snowsuit +surcoat +duffel coat +sheepskin coat +frock coat +lab coat +greatcoat +jacket +raincoat +capote +sack coat +fur coat +mess jacket +single-breasted jacket +bomber jacket +pea jacket +swallow-tailed coat +doublet +bolero +parka +oilskin +trench coat +mink +sable coat +poncho +toga virilis +toga +kameez +serape +tunic +shawl +caftan +short pants +pajama +sweat pants +salwar +breeches +chino +slacks +jodhpurs +pedal pusher +long trousers +jean +cords +Levi's +stretch pants +bellbottom trousers +buckskins +hot pants +Bermuda shorts +lederhosen +necktie +cravat +bolo tie +Windsor tie +bow tie +black tie +maillot +swimming trunks +bikini +double-breasted suit +pinstripe +single-breasted suit +pants suit +business suit +three-piece suit +two-piece +turtleneck +cardigan +sweatshirt +pullover +top +G-string +camisole +dress +bodice +blouse +halter +cocktail dress +sari +caftan +sundress +chemise +strapless +gown +jumper +dirndl +bridal gown +tea gown +ball gown +gauntlet +mitten +kid glove +belt +furnishing +money belt +holster +cartridge belt +hosiery +tights +sock +stocking +pantyhose +maillot +athletic sock +tabi +knee-high +argyle +nylons +Christmas stocking +formalwear +ensemble +outfit +ao dai +costume +fancy dress +costume +frock +sportswear +academic costume +disguise +hairpiece +dinner jacket +balldress +dinner dress +dress suit +Afro-wig +toupee +wig +dress hat +brace +athletic supporter +home appliance +dryer +vacuum +iron +trouser press +curling iron +white goods +sewing machine +serger +kitchen appliance +Hoover +travel iron +steam iron +dishwasher +refrigerator +washer +cooler +electric refrigerator +ice machine +deep-freeze +toaster +microwave +toaster oven +coffee maker +hot plate +waffle iron +disposal +espresso maker +stove +oven +food processor +ice maker +cookstove +electric range +gas range +Primus stove +broiler +rotisserie +Dutch oven +gas oven +hand blower +clothes dryer +spin dryer +tumble-dryer +wringer +bath towel +doily +Turkish towel +bed linen +pillow sham +sheet +tinfoil +plywood +doorplate +board +drumhead +panel +laminate +blackboard +snowboard +Sheetrock +surfboard +skateboard +sideboard +scoreboard +wainscot +headboard +chandelier +plumbing fixture +soap dish +toilet +shower +water faucet +flush toilet +potty seat +rope +cord +lasso +bungee +spun yarn +cordage +thread +bootlace +wick +lanyard +floss +woof +worsted +organism +cell +mistletoe +plant +animal +microorganism +bryophyte +person +fungus +benthos +flowering maple +vascular plant +strangler +aquatic +annual +houseplant +poisonous plant +agave +pteridophyte +spermatophyte +aquatic plant +herb +vine +woody plant +weed +cultivar +bulbous plant +succulent +American agave +maguey +maguey +sansevieria +dracaena +mother-in-law's tongue +fern ally +fern +club moss +scouring rush +ground pine +ground cedar +ground fir +flowering fern +lady fern +Boston fern +flowering fern +royal fern +tree fern +oak fern +common polypody +mountain fern +shield fern +deer fern +wood fern +American maidenhair fern +hart's-tongue +soft shield fern +holly fern +maidenhair +holly fern +water clover +sensitive fern +Christmas fern +angiopteris +soft tree fern +male fern +marginal wood fern +angiosperm +gymnosperm +barbados cherry +dicot +flower +wildflower +commelina +woodland star +nigella +black-eyed Susan +mistflower +calceolaria +toadflax +zinnia +centaury +Easter daisy +African violet +brompton stock +verbena +blue daisy +pink calla +Mexican sunflower +bloomer +achimenes +lychnis +painted daisy +treasure flower +globe amaranth +common valerian +rose moss +tidytips +common daisy +composite +ice plant +gentian +soapwort +anemone +veronica +larkspur +spring beauty +gazania +damask violet +Barberton daisy +bush violet +baby's breath +corydalis +calendula +sunflower +scabious +valerian +rue anemone +sandwort +candytuft +horn poppy +sandwort +poppy +stokes' aster +dahlia +Virginia spring beauty +petunia +orchid +hybrid petunia +African daisy +pink +African daisy +African daisy +daisy +common ageratum +oxeye daisy +columbine +calla lily +sweet alyssum +spathiphyllum +four o'clock +common marigold +cornflower +strawflower +silene +tuberose +common four-o'clock +rocket larkspur +bellwort +begonia +streptocarpus +Swan River daisy +wallflower +peony +love-in-a-mist +wallflower +cineraria +chrysanthemum +stock +sandwort +Malcolm stock +mountain sandwort +coneflower +ageratum +coneflower +sowbread +scorpionweed +cyclamen +delphinium +marigold +aster +cosmos +Mediterranean snapdragon +mullein pink +ragged robin +mayweed +tansy +dusty miller +corn chamomile +shasta daisy +everlasting +wingstem +rosinweed +oxeye daisy +strawflower +strawflower +cudweed +pearly everlasting +gentianella +agueweed +closed gentian +closed gentian +great yellow gentian +fringed gentian +marsh gentian +snowdrop anemone +wood anemone +wood anemone +germander speedwell +common speedwell +common sunflower +prairie sunflower +giant sunflower +Jerusalem artichoke +sweet scabious +field scabious +Iceland poppy +wind poppy +Iceland poppy +celandine +oriental poppy +opium poppy +celandine poppy +prickly poppy +California poppy +corn poppy +blue poppy +aerides +coelogyne +lady's slipper +Venus' slipper +cymbid +sobralia +spider orchid +spider orchid +Psychopsis papilio +liparis +butterfly orchid +butterfly orchid +butterfly orchid +oncidium +twayblade +twayblade +grass pink +brassavola +fragrant orchid +fly orchid +frog orchid +coral root +cattleya +lesser butterfly orchid +vanilla +short-spurred fragrant orchid +common spotted orchid +bog rose +ladies' tresses +odontoglossum +orchis +vanda +pansy orchid +Bletilla striata +rattlesnake plantain +marsh orchid +stanhopea +laelia +phaius +lizard orchid +caladenia +calypso +moth orchid +blue orchid +bee orchid +early spider orchid +masdevallia +bog rein orchid +European ladies' tresses +fen orchid +pogonia +fringed orchis +dendrobium +fly orchid +helleborine +helleborine +stelis +greater butterfly orchid +yellow lady's slipper +large yellow lady's slipper +common lady's-slipper +moccasin flower +butterfly orchid +male orchis +ragged orchid +purple-fringed orchid +stream orchid +Epipactis helleborine +sweet William +china pink +Japanese pink +carnation +cottage pink +maiden pink +meeting house +granny's bonnets +blue columbine +fire pink +white campion +bladder campion +red campion +wild pink +moss campion +wax begonia +hybrid tuberous begonia +rex begonia +crown daisy +corn marigold +florist's chrysanthemum +African marigold +French marigold +New England aster +bushy aster +Michaelmas daisy +Indian paintbrush +goldenrod +sand verbena +bitterroot +Indian pipe +heliopsis +meadow goldenrod +pasqueflower +fleabane +blazing star +edelweiss +coneflower +balloon flower +wild carrot +prairie gentian +desert sunflower +Arnica montana +butterweed +gaillardia +brittlebush +orange daisy +daisy fleabane +Mexican hat +long-head coneflower +cycad +welwitschia +encephalartos +dioon +macrozamia +false sago +water shamrock +water hyacinth +pistia +water lily +marsh plant +water nymph +European white lily +bog star +marsh marigold +wild calla +sedge +parnassia +skunk cabbage +skunk cabbage +cotton grass +nutgrass +common cotton grass +winter aconite +buttercup +phlox +willowherb +stapelia +skullcap +bedstraw +gumweed +kangaroo paw +common chickweed +hyssop +arum +common comfrey +borage +nasturtium +canna +loosestrife +toad lily +globe thistle +wild thyme +common fennel +bear's breech +ironweed +feverfew +monarda +physostegia +creeping bugle +vegetable +hedge nettle +plum tomato +ground cherry +flax +primrose +oxalis +kniphofia +boneset +chickweed +periwinkle +garden angelica +bugloss +Dutchman's breeches +pie plant +cow parsnip +butterbur +milk thistle +mouse-ear chickweed +yellow bells +lobelia +anise hyssop +banana +Joe-Pye weed +Joe-Pye weed +garden forget-me-not +evening primrose +spiderflower +sweet false chamomile +agrimonia +hepatica +medic +peperomia +geranium +viola +okra +bergenia +astrantia +aspidistra +thyme +common teasel +carnivorous plant +harvest-lice +nemophila +hawkweed +hawkweed +fleabane +plumbago +spiderwort +prickly poppy +common foxglove +stonecrop +garden lettuce +teasel +herb Paris +coltsfoot +basil +sainfoin +sneezeweed +cockscomb +baby blue-eyes +coleus +spurge nettle +arnica +sour dock +clover +mint +coreopsis +pimpernel +kidney vetch +foxglove +legume +reseda +forget-me-not +Virginia bluebell +pineapple +blueweed +anchusa +moss pink +common dandelion +false lupine +sage +chamomile +crucifer +chicory +broad-leaved plantain +bugle +milkweed +fireweed +spirea +inula +hemp nettle +garden nasturtium +pokeweed +moneywort +asparagus +Italian parsley +rhubarb +jewelweed +asparagus fern +sedum +yarrow +bird's foot trefoil +scarlet pimpernel +campanula +mayapple +painted nettle +pigweed +bleeding heart +achillea +snow-in-summer +gramineous plant +balsamroot +Abyssinian banana +herbage +astilbe +ginger +saxifrage +cow parsley +dill +common mullein +dead nettle +creeping buttercup +meadow buttercup +yellow bedstraw +sweet woodruff +caladium +cuckoopint +jack-in-the-pulpit +alocasia +taro +amorphophallus +bee balm +bee balm +artichoke +cardoon +tomatillo +tomatillo +English primrose +oxlip +cowslip +polyanthus +creeping oxalis +common wood sorrel +Bermuda buttercup +red-hot poker +poker plant +dwarf banana +Japanese banana +plantain +sundrops +common evening primrose +ivy geranium +cranesbill +fish geranium +rose geranium +meadow cranesbill +wild geranium +dove's foot geranium +herb robert +horned violet +field pansy +violet +dog violet +pale violet +bird's-foot violet +hedge violet +Venus's flytrap +pitcher plant +tropical pitcher plant +sundew +white clover +red clover +crimson clover +pennyroyal +water-mint +beach pea +chickpea +vetch +tufted vetch +bean +wild pea +scarlet runner +sieva bean +clary +common sage +clary sage +wild sage +purple sage +meadow clary +bok choy +mustard +cabbage +cauliflower +collard +broccoli +brussels sprout +garlic mustard +head cabbage +radish plant +bittercress +alyssum +field mustard +rape +radish +radish +lady's smock +crinkleroot +butterfly weed +swamp milkweed +tussock bellflower +Canterbury bell +clustered bellflower +peach bells +giant bamboo +grass +fescue +cordgrass +feather reed grass +reed grass +orchard grass +cereal +broom beard grass +tall oat grass +tallgrass +St. Augustine grass +pampas grass +grama +dallisgrass +zoysia +rye grass +brome +fountain grass +rye +popcorn +wheat +millet +sorghum +panic grass +goose grass +switch grass +common ginger +shellflower +meadow saxifrage +purple saxifrage +white dead nettle +henbit +ground ivy +blue pea +purple clematis +black-eyed Susan +bougainvillea +butterfly pea +butterfly pea +bindweed +kudzu +Boston ivy +squash +yellow jasmine +wax plant +morning glory +liana +Japanese wistaria +allamanda +field bindweed +common allamanda +passionflower +convolvulus +gourd +grape +Chinese gooseberry +summer squash +winter squash +pumpkin +spaghetti squash +yellow squash +acorn squash +winter crookneck +cypress vine +Japanese morning glory +moonflower +golden pothos +ceriman +jade vine +pothos +love-in-a-mist +maypop +granadilla +sweet melon +bottle gourd +net melon +winter melon +cantaloupe +Sauvignon grape +fox grape +wild indigo +shrub +tree +raspberry +lupine +abelia +banksia +bird pepper +sea holly +guelder rose +crape myrtle +castor-oil plant +spirea +hydrangea +fuchsia +redberry +saltbush +false indigo +bridal wreath +protea +Oregon grape +grevillea +gorse +rockrose +cowberry +subshrub +honeypot +California fuchsia +sumac +jasmine +impala lily +currant +axseed +mimosa +southern buckthorn +flowering quince +yucca +purple heather +waratah +mallow +strawberry tree +mock orange +honeysuckle +spurge +kalmia +bush hibiscus +weigela +Christmasberry +angel's trumpet +angel's trumpet +gooseberry +dusty miller +croton +Pyracantha +forsythia +artemisia +silversword +waratah +philadelphus +common lilac +saltwort +calliandra +wahoo +bird of paradise +cape jasmine +camellia +night jasmine +rose +mountain laurel +cotoneaster +rhododendron +frangipani +broom +desert pea +lavender +butterfly bush +deutzia +hortensia +burdock +prairie smoke +centaury +sea lavender +common mugwort +bird's foot trefoil +large periwinkle +great burdock +St John's wort +eriogonum +purple loosestrife +loosestrife +mountain avens +matilija poppy +bur marigold +wild lupine +marguerite +dusty miller +great knapweed +knapweed +creeping St John's wort +klammath weed +common St John's wort +common jasmine +winter jasmine +Adam's needle +bear grass +Joshua tree +Spanish dagger +hollyhock +rose mallow +common mallow +marsh mallow +musk mallow +hibiscus +althea +rose mallow +cotton rose +woodbine +trumpet honeysuckle +Japanese honeysuckle +poinsettia +crown of thorns +damask rose +musk rose +azalea +rosebay +swamp azalea +common broom +woodwaxen +English lavender +spike lavender +French lavender +locust tree +kowhai +bottle-tree +timber tree +linden +bonsai +snag +hackberry +pepper tree +Japanese oak +European hackberry +cork tree +birch +star anise +red silk-cotton tree +roble +common alder +fig tree +Japanese pagoda tree +albizzia +European hornbeam +cassia +coral tree +neem +white mangrove +Chinese parasol tree +bayberry +yellowwood +elm +alder +prickly ash +angiospermous tree +chestnut +cabbage bark +ash +beech +fringe tree +golden shower tree +lead tree +palm +balata +sapling +black beech +acacia +coffee +gymnospermous tree +ceibo +incense tree +lacebark +shade tree +pollard +gum tree +wild medlar +hornbeam +willow +textile screw pine +mescal bean +Brazilian rosewood +pandanus +white mangrove +oak +bean tree +plane tree +blackwood +coralwood +Kentucky coffee tree +black locust +honey locust +flame tree +flame tree +kurrajong +American basswood +silver lime +black birch +silver birch +swamp birch +downy birch +grey birch +golden fig +India-rubber tree +fig +banyan +pipal +rain tree +silk tree +smooth-leaved elm +American elm +English elm +cedar elm +myrtle +mangrove +magnolia +Queen's crape myrtle +looking-glass plant +tulip tree +maple +nut tree +redbud +baobab +poplar +tree of heaven +ailanthus +dogwood +holly +cacao +laurel +mountain ebony +kapok +sorrel tree +cacao bean +Spanish elm +rowan +mountain ash +royal poinciana +iron tree +fruit tree +sweet bay +southern magnolia +star magnolia +umbrella tree +box elder +red maple +hedge maple +Norway maple +Japanese maple +sycamore +California box elder +silver maple +sugar maple +Oregon maple +cashew +walnut +hazelnut +black walnut +English walnut +black poplar +aspen +cottonwood +white poplar +quaking aspen +Eastern cottonwood +black cottonwood +cornelian cherry +bunchberry +common European dogwood +common white dogwood +bearberry +inkberry +true laurel +cassia +citrus +mulberry +jackfruit +pomegranate +pawpaw +persimmon +carambola +plum +almond tree +durian +papaya +olive tree +longan +pear +loquat +medlar +peach +white mulberry +olive +litchi +Japanese apricot +rambutan +apple tree +Japanese persimmon +mango +breadfruit +guava +guava +jaboticaba +cherry +Surinam cherry +lime +mandarin +orange +kumquat +lemon +pomelo +grapefruit +clementine +tangerine +sweet orange +sour orange +bergamot +cherry plum +Allegheny plum +flowering almond +almond +flowering almond +crab apple +apple +wild apple +Southern crab apple +Bechtel crab +Iowa crab +sour cherry +flowering cherry +wild cherry +sweet cherry +chokecherry +Japanese flowering cherry +oriental cherry +fuji +hagberry tree +black cherry +Ozark chinkapin +American chestnut +pumpkin ash +mountain ash +manna ash +European ash +red ash +weeping beech +American beech +copper beech +bamboo palm +wine palm +fan palm +royal palm +cabbage palm +cabbage palm +sago palm +miniature fan palm +lady palm +feather palm +coconut +cabbage palm +carnauba +caranday +palmyra +cabbage palmetto +key palm +saw palmetto +palmetto +date palm +oil palm +silver wattle +wattle +huisache +ginkgo +conifer +kauri +green douglas fir +miro +cedar +cedar +douglas fir +matai +arborvitae +spruce +yew +araucaria +cypress +metasequoia +pine +fir +larch +hemlock +cedar of Lebanon +Atlas cedar +deodar +southern white cedar +incense cedar +Oregon cedar +Japanese cedar +Oriental arborvitae +American arborvitae +western red cedar +Colorado spruce +white spruce +Norway spruce +red spruce +black spruce +Sitka spruce +oriental spruce +bunya bunya +monkey puzzle +Monterey cypress +Arizona cypress +Italian cypress +Scotch pine +pond pine +pitch pine +table-mountain pine +ancient pine +stone pine +Jeffrey pine +loblolly pine +Swiss pine +spruce pine +white pine +red pine +Japanese black pine +Swiss mountain pine +black pine +Monterey pine +yellow pine +Torrey pine +shore pine +bristlecone pine +whitebark pine +western white pine +longleaf pine +ponderosa +silver fir +Fraser fir +Alpine fir +amabilis fir +lowland fir +balsam fir +European silver fir +white fir +western larch +American larch +eastern hemlock +western hemlock +mountain hemlock +gumbo-limbo +elephant tree +sweet gum +eucalyptus +sour gum +liquidambar +snow gum +mountain ash +black mallee +alpine ash +red gum +red gum +blue gum +osier +pussy willow +bay willow +weeping willow +swamp willow +purple willow +common osier +European turkey oak +red oak +cork oak +black oak +live oak +chestnut oak +bluejack oak +pin oak +post oak +shingle oak +white oak +laurel oak +northern red oak +southern red oak +southern live oak +canyon oak +coast live oak +chinquapin oak +basket oak +swamp chestnut oak +bur oak +Oregon white oak +common oak +tamarind +catalpa +carob +California sycamore +American sycamore +London plane +lightwood +black mangrove +wild raspberry +black raspberry +bluebonnet +Texas bluebonnet +thistle +cat's-ear +corn cockle +yellow rocket +fireweed +stinging nettle +horseweed +stemless carline thistle +musk thistle +cotton thistle +plume thistle +field thistle +bull thistle +Canada thistle +hippeastrum +narcissus +iridaceous plant +fritillary +liliaceous plant +star-of-Bethlehem +daffodil +jonquil +jonquil +iris +blue-eyed grass +blackberry-lily +dwarf iris +dwarf iris +beardless iris +bearded iris +Japanese iris +German iris +snake's head fritillary +crown imperial +dogtooth violet +lily +African lily +grape hyacinth +common camas +false lily of the valley +common hyacinth +camas +clintonia +lemon lily +squaw grass +scilla +tulip +alliaceous plant +fawn lily +glacier lily +yellow adder's tongue +Turk's-cap +Turk's-cap +tiger lily +tiger lily +mountain lily +Easter lily +tassel hyacinth +common grape hyacinth +Tulipa gesneriana +Darwin tulip +garlic chive +wild garlic +Hottentot fig +livingstone daisy +cactus +nopal +nopal +barrel cactus +night-blooming cereus +night-blooming cereus +night-blooming cereus +cholla +echinocactus +mammillaria +feather ball +prickly pear +crab cactus +saguaro +Christmas cactus +hedgehog cactus +golden barrel cactus +flamingo flower +anthurium +gloxinia +baneberry +red baneberry +poison ivy +gloriosa +monkshood +American holly +oleander +poison ash +herbivore +big game +thoroughbred +creepy-crawly +young +domestic animal +pet +critter +larva +feeder +male +pest +omnivore +predator +chordate +work animal +invertebrate +female +marine animal +scavenger +hexapod +mate +prey +carnivore +young mammal +orphan +spat +young bird +hatchling +foal +kitten +calf +pup +calf +lamb +baby +puppy +suckling +cub +piglet +nestling +fledgling +head +stray +feeder +tadpole +caterpillar +nymph +doodlebug +tobacco hornworm +cabbageworm +tomato hornworm +silkworm +cutworm +woolly bear +measuring worm +armyworm +silkworm +tussock caterpillar +tent caterpillar +colt +ridgeling +sire +sea squirt +ascidian +vertebrate +aquatic vertebrate +amphibian +mammal +baby +fetus +quadruped +reptile +bird +fish +lamprey +teleost fish +food fish +elasmobranch +ganoid +trumpetfish +pipefish +seahorse +spiny-finned fish +soft-finned fish +needlefish +beluga +gar +bowfin +paddlefish +sturgeon +percoid fish +dragonet +frogfish +barracuda +soldierfish +goosefish +scorpaenoid +flatfish +great barracuda +plectognath +snook +perch +perch +dolphinfish +freshwater bass +scombroid +bass +parrotfish +sea bream +grunt +flathead +bluefish +carangid fish +damselfish +butterfly fish +mudskipper +pike +goby +tautog +sunfish +snapper +snapper +sciaenid fish +wolffish +cichlid +wrasse +yellow perch +European perch +walleye +mackerel +skipjack +black marlin +sailfish +marlin +bonito +tuna +wahoo +Spanish mackerel +Spanish mackerel +cero +king mackerel +bluefin +yellowfin +jack +permit +scad +crevalle jack +kingfish +amberjack +yellowtail +horse mackerel +horse mackerel +clown anemone fish +sergeant major +anemone fish +chaetodon +rock beauty +angelfish +northern pike +pickerel +muskellunge +black bass +pumpkinseed +freshwater bream +bluegill +crappie +smallmouth +largemouth +sea trout +croaker +kingfish +mulloway +red drum +white croaker +white croaker +scorpaenid +flathead +scorpionfish +lionfish +stonefish +rockfish +plaice +flounder +halibut +cowfish +boxfish +ocean sunfish +puffer +spiny puffer +triggerfish +balloonfish +porcupinefish +tarpon +bonefish +pollack +anchovy +lizardfish +catfish +cypriniform fish +eel +clupeid fish +European catfish +flathead catfish +channel catfish +blue catfish +characin +electric eel +cyprinodont +loach +cyprinid +topminnow +piranha +cardinal tetra +tetra +killifish +striped killifish +guppy +swordtail +carp +minnow +tench +crucian carp +goldfish +gudgeon +platy +mosquitofish +conger +tuna +moray +sardine +pilchard +sea bass +trout +salmon +barracouta +grouper +striped bass +jewfish +hind +sea trout +brook trout +rainbow trout +brown trout +lake trout +chinook +Atlantic salmon +redfish +coho +landlocked salmon +shark +ray +sand tiger +angel shark +nurse shark +requiem shark +smooth dogfish +hammerhead +mackerel shark +whale shark +bull shark +blue shark +sandbar shark +blacktip shark +whitetip shark +tiger shark +lemon shark +whitetip shark +smoothhound +great white shark +mako +porbeagle +stingray +electric ray +spotted eagle ray +Atlantic manta +manta +skate +eagle ray +salamander +frog +spotted salamander +newt +European fire salamander +slender salamander +ambystomid +eft +common newt +red eft +spotted salamander +axolotl +tiger salamander +true toad +true frog +tailed frog +crapaud +tree toad +tree frog +natterjack +Eurasian green toad +bufo +American toad +agua +western toad +European toad +grass frog +wood-frog +bullfrog +leopard frog +pickerel frog +green frog +spring peeper +chorus frog +placental +tusker +monotreme +marsupial +female mammal +aardvark +livestock +insectivore +hyrax +doe +edentate +stag +bull +primate +carnivore +bat +aquatic mammal +lagomorph +rock hyrax +yearling +rodent +cow +pachyderm +buck +pangolin +ungulate +shrew +hedgehog +peba +sloth +armadillo +anteater +two-toed sloth +two-toed sloth +three-toed sloth +ant bear +tamandua +simian +tarsier +homo +ape +lemur +monkey +Homo sapiens sapiens +Homo sapiens +Neandertal man +anthropoid ape +lesser ape +great ape +siamang +gibbon +chimpanzee +orangutan +gorilla +pygmy chimpanzee +central chimpanzee +western lowland gorilla +mountain gorilla +silverback +indri +Madagascar cat +potto +galago +slow loris +Old World monkey +New World monkey +baboon +vervet +proboscis monkey +colobus +patas +macaque +guenon +langur +chacma +mandrill +Barbary ape +rhesus +spider monkey +marmoset +squirrel monkey +titi +capuchin +howler monkey +tamarin +pygmy marmoset +procyonid +feline +viverrine +canine +musteline mammal +bear +coati +common raccoon +lesser panda +raccoon +kinkajou +giant panda +big cat +cat +jaguar +tiger +leopard +cheetah +lion +snow leopard +tigress +Bengal tiger +tiger cub +lioness +lion cub +domestic cat +wildcat +tabby +tiger cat +tabby +tortoiseshell +Manx +Egyptian cat +Abyssinian +kitty +Angora +Persian cat +Burmese cat +Siamese cat +alley cat +tom +mouser +margay +ocelot +lynx +cougar +European wildcat +serval +manul +sand cat +common lynx +bobcat +caracal +Canada lynx +meerkat +genet +mongoose +slender-tailed meerkat +suricate +dog +wild dog +wolf +bitch +jackal +fox +hyena +pug +corgi +Great Pyrenees +Brabancon griffon +poodle +cur +Leonberg +griffon +dalmatian +pooch +spitz +toy dog +hunting dog +working dog +basenji +Mexican hairless +Newfoundland +lapdog +Cardigan +Pembroke +standard poodle +toy poodle +miniature poodle +Pomeranian +keeshond +chow +Samoyed +toy spaniel +Shih-Tzu +toy terrier +Maltese dog +Japanese spaniel +Chihuahua +Pekinese +King Charles spaniel +Blenheim spaniel +papillon +terrier +Rhodesian ridgeback +sausage dog +sporting dog +hound +dachshund +Dandie Dinmont +schnauzer +wirehair +Airedale +West Highland white terrier +Kerry blue terrier +Norfolk terrier +Border terrier +Yorkshire terrier +wire-haired fox terrier +Bedlington terrier +Tibetan terrier +silky terrier +Lhasa +Scotch terrier +cairn +Boston bull +fox terrier +Australian terrier +bullterrier +Norwich terrier +Irish terrier +rat terrier +soft-coated wheaten terrier +standard schnauzer +giant schnauzer +miniature schnauzer +Lakeland terrier +Welsh terrier +Sealyham terrier +Staffordshire bullterrier +American Staffordshire terrier +Manchester terrier +toy Manchester +water dog +pointer +bird dog +setter +spaniel +retriever +vizsla +German short-haired pointer +Gordon setter +English setter +Irish setter +cocker spaniel +water spaniel +springer spaniel +Brittany spaniel +clumber +Sussex spaniel +Irish water spaniel +English springer +Welsh springer spaniel +flat-coated retriever +golden retriever +curly-coated retriever +Chesapeake Bay retriever +Labrador retriever +otterhound +bloodhound +wolfhound +basset +Ibizan hound +Norwegian elkhound +coonhound +Saluki +Afghan hound +black-and-tan coonhound +bluetick +Scottish deerhound +redbone +foxhound +beagle +Weimaraner +greyhound +borzoi +Irish wolfhound +English foxhound +Walker hound +whippet +Italian greyhound +Great Dane +watchdog +Eskimo dog +Tibetan mastiff +sled dog +Saint Bernard +French bulldog +police dog +bulldog +Sennenhunde +bull mastiff +shepherd dog +boxer +mastiff +kuvasz +housedog +pinscher +schipperke +Doberman +miniature pinscher +affenpinscher +Siberian husky +malamute +Greater Swiss Mountain dog +EntleBucher +Bernese mountain dog +Appenzeller +Belgian sheepdog +kelpie +Shetland sheepdog +komondor +Border collie +collie +Rottweiler +Old English sheepdog +German shepherd +briard +Bouvier des Flandres +groenendael +malinois +African hunting dog +dingo +dhole +coyote +wolf pup +red wolf +white wolf +timber wolf +red fox +red fox +kit fox +Arctic fox +grey fox +kit fox +spotted hyena +striped hyena +mink +black-footed ferret +striped skunk +pine marten +sea otter +otter +weasel +polecat +glutton +skunk +badger +ferret +river otter +Eurasian otter +ice bear +American black bear +bear cub +Asiatic black bear +brown bear +sloth bear +grizzly +Alaskan brown bear +carnivorous bat +flying fox +fruit bat +brown bat +vespertilian bat +pallid bat +pipistrelle +cetacean +sea cow +pinniped mammal +whale +toothed whale +baleen whale +dolphin +bottle-nosed whale +porpoise +common dolphin +bottlenose dolphin +pilot whale +killer whale +white whale +Pacific bottlenose dolphin +Atlantic bottlenose dolphin +grey whale +rorqual +blue whale +lesser rorqual +finback +manatee +dugong +walrus +seal +earless seal +eared seal +elephant seal +harbor seal +harp seal +fur seal +fur seal +sea lion +California sea lion +Australian sea lion +Steller sea lion +pika +leporid +rabbit +hare +eastern cottontail +wood rabbit +bunny +European rabbit +lapin +Angora +rabbit ears +snowshoe hare +European hare +jackrabbit +chinchilla +rat +capybara +golden hamster +water vole +porcupine +coypu +vole +beaver +hamster +prairie dog +squirrel +marmot +blacktail prairie dog +cavy +gerbil +mouse +muskrat +gopher +brown rat +black rat +chipmunk +ground squirrel +eastern chipmunk +tree squirrel +rock squirrel +mantled ground squirrel +eastern grey squirrel +red squirrel +black squirrel +American red squirrel +fox squirrel +hoary marmot +groundhog +aperea +guinea pig +field mouse +house mouse +elephant +African elephant +Indian elephant +even-toed ungulate +odd-toed ungulate +ruminant +camel +swine +llama +vicuna +collared peccary +hippopotamus +peccary +pronghorn +deer +bovid +giraffe +okapi +woodland caribou +caribou +fallow deer +elk +hart +mule deer +fawn +red deer +muntjac +Virginia deer +wapiti +Japanese deer +roe deer +black-tailed deer +wild sheep +bison +musk ox +Old World buffalo +bovine +antelope +sheep +goat antelope +goat +aoudad +mountain sheep +Dall sheep +bighorn +mouflon +American bison +wisent +carabao +water buffalo +Cape buffalo +Brahman +ox +zebu +cattle +yak +gaur +beef +ox +bull +bullock +heifer +cow +dairy cattle +longhorn +Charolais +Hereford +Durham +Aberdeen Angus +Galloway +Friesian +Brown Swiss +kudu +addax +blackbuck +waterbuck +eland +steenbok +dik-dik +gnu +harnessed antelope +gerenuk +sassaby +impala +greater kudu +sable antelope +hartebeest +bongo +gemsbok +oryx +gazelle +nyala +bushbuck +Thomson's gazelle +springbok antelope +domestic sheep +black sheep +ewe +wether +ram +mountain goat +chamois +takin +nanny +kid +ibex +Angora +domestic goat +billy +wild goat +Bactrian camel +Arabian camel +wild boar +warthog +boar +hog +guanaco +alpaca +rhinoceros +tapir +equine +Malayan tapir +Indian rhinoceros +black rhinoceros +white rhinoceros +horse +zebra +ass +bay +broodmare +racehorse +palomino +wild horse +pinto +hack +roan +male horse +post horse +liver chestnut +tarpan +saddle horse +chestnut +harness horse +polo pony +workhorse +mare +pony +pony +sorrel +yearling +thoroughbred +trotting horse +stud +stallion +gelding +Tennessee walker +hack +cavalry horse +grey +Morgan +buckskin +dun +Arabian +quarter horse +cob +hackney +plow horse +farm horse +draft horse +carthorse +Percheron +Clydesdale +shire +cayuse +bronco +mustang +Welsh pony +Shetland pony +Exmoor +common zebra +mountain zebra +grevy's zebra +jennet +burro +domestic ass +echidna +platypus +echidna +kangaroo +koala +wombat +common opossum +opossum +dasyurid marsupial +phalanger +giant kangaroo +wallaby +rock wallaby +tree wallaby +Tasmanian devil +numbat +chelonian +diapsid +turtle +Western box turtle +box turtle +common snapping turtle +terrapin +soft-shelled turtle +painted turtle +sea turtle +snapping turtle +slider +tortoise +mud turtle +cooter +hawksbill turtle +loggerhead +green turtle +leatherback turtle +ridley +Pacific ridley +Atlantic ridley +giant tortoise +gopher tortoise +European tortoise +desert tortoise +crocodilian reptile +snake +tuatara +lizard +dinosaur +alligator +crocodile +American alligator +caiman +Asian crocodile +African crocodile +blind snake +viper +sea snake +elapid +constrictor +colubrid snake +horned viper +asp +adder +puff adder +pit viper +water moccasin +copperhead +rattlesnake +ground rattler +massasauga +diamondback +Mojave rattlesnake +timber rattlesnake +prairie rattlesnake +Western diamondback +sidewinder +rock rattlesnake +speckled rattlesnake +cobra +green mamba +taipan +copperhead +mamba +coral snake +coral snake +Indian cobra +hamadryad +boa +python +rosy boa +boa constrictor +anaconda +reticulated python +carpet snake +rock python +blacksnake +garter snake +bull snake +hognose snake +rat snake +whip-snake +water snake +green snake +racer +green snake +thunder snake +ringneck snake +vine snake +king snake +night snake +ribbon snake +common garter snake +pine snake +gopher snake +corn snake +black rat snake +grass snake +common water snake +water moccasin +smooth green snake +rough green snake +milk snake +common kingsnake +banded gecko +chameleon +monitor +skink +Gila monster +Komodo dragon +whiptail +iguanid +agamid +gecko +African chameleon +lacertid lizard +anguid lizard +horned lizard +tree lizard +chuckwalla +American chameleon +basilisk +side-blotched lizard +spiny lizard +collared lizard +common iguana +marine iguana +leopard lizard +western fence lizard +fence lizard +agama +mountain devil +frilled lizard +green lizard +sand lizard +blindworm +alligator lizard +ornithischian +tyrannosaur +stegosaur +triceratops +bird of passage +aquatic bird +passerine +cock +hummingbird +piciform bird +coraciiform bird +quetzal +bird of prey +caprimulgiform bird +cuculiform bird +gamecock +ratite +gallinaceous bird +trogon +parrot +carinate +dickeybird +hen +wading bird +swan +gallinule +seabird +waterfowl +heron +crested cariama +trumpeter +bustard +ibis +stork +whooping crane +crane +limpkin +chunga +flamingo +rail +spoonbill +shoebill +shorebird +great blue heron +night heron +little blue heron +boatbill +great white heron +egret +bittern +black-crowned night heron +yellow-crowned night heron +great white heron +little egret +snowy egret +American egret +cattle egret +least bittern +American bittern +wood ibis +sacred ibis +marabou +black stork +white stork +saddlebill +jabiru +policeman bird +wood ibis +notornis +weka +spotted crake +crake +coot +Old World coot +American coot +common spoonbill +roseate spoonbill +plover +godwit +Hudsonian godwit +stilt +stone curlew +oystercatcher +stilt +American woodcock +snipe +woodcock +avocet +sandpiper +European curlew +pratincole +curlew +phalarope +golden plover +ruddy turnstone +killdeer +lapwing +turnstone +piping plover +black-necked stilt +black-winged stilt +whole snipe +Wilson's snipe +great snipe +dowitcher +tattler +greenshank +willet +curlew sandpiper +sanderling +redshank +spotted sandpiper +knot +red-backed sandpiper +upland sandpiper +least sandpiper +pectoral sandpiper +ruff +European sandpiper +yellowlegs +greater yellowlegs +lesser yellowlegs +red phalarope +Wilson's phalarope +pen +cygnet +trumpeter +coscoroba +mute swan +cob +whooper +black swan +tundra swan +whistling swan +Bewick's swan +purple gallinule +European gallinule +moorhen +coastal diving bird +pelagic bird +grebe +auk +loon +pelecaniform seabird +sphenisciform seabird +puffin +larid +jaeger +skimmer +sea swallow +gull +tern +ivory gull +mew +laughing gull +black-backed gull +kittiwake +herring gull +skua +parasitic jaeger +petrel +albatross +wandering albatross +shearwater +storm petrel +fulmar +red-necked grebe +great crested grebe +pied-billed grebe +black-necked grebe +dabchick +razorbill +guillemot +auklet +murre +black guillemot +common murre +pigeon guillemot +frigate bird +cormorant +snakebird +pelican +gannet +water turkey +tropic bird +white pelican +Old world white pelican +solan +booby +penguin +emperor penguin +jackass penguin +king penguin +rock hopper +Adelie +horned puffin +tufted puffin +Atlantic puffin +anseriform bird +goose +duck +blue goose +barnacle goose +snow goose +Chinese goose +common brant goose +brant +gosling +greylag +gander +honker +diving duck +scaup +shelduck +wood drake +bufflehead +black duck +mandarin duck +American widgeon +pintail +mallard +sheldrake +teal +Barrow's goldeneye +quack-quack +wild duck +ruddy duck +wood duck +drake +muscovy duck +shoveler +dabbling duck +widgeon +sea duck +redhead +pochard +goldeneye +canvasback +duckling +greater scaup +lesser scaup +garganey +greenwing +bluewing +eider +old squaw +merganser +scoter +common scoter +American merganser +red-breasted merganser +hooded merganser +smew +goosander +wren +broadbill +tyrannid +oscine +scrubbird +sparrow +marsh wren +rock wren +winter wren +cactus wren +house wren +Carolina wren +ovenbird +manakin +pitta +woodhewer +New World flycatcher +kingbird +phoebe +pewee +vermillion flycatcher +western wood pewee +scissortail +grey kingbird +eastern kingbird +Arkansas kingbird +warbler +brown creeper +corvine bird +starling +pipit +titmouse +fairy bluebird +thrush +hedge sparrow +wood swallow +shrike +lark +golden oriole +Old World flycatcher +thrasher +vireo +tanager +honeycreeper +finch +bowerbird +water ouzel +accentor +mockingbird +brown thrasher +skylark +catbird +satin bowerbird +waxwing +red-eyed vireo +New World oriole +Old World oriole +babbler +swallow +creeper +songbird +Australian magpie +wagtail +meadow pipit +spotted flycatcher +weaver +nuthatch +greater whitethroat +New World warbler +kinglet +Old World warbler +gnatcatcher +lesser whitethroat +yellowthroat +common yellowthroat +ovenbird +parula warbler +Blackburn +yellow warbler +American redstart +yellow-breasted chat +Audubon's warbler +Wilson's warbler +Cape May warbler +myrtle warbler +goldcrest +ruby-crowned kinglet +tailorbird +sedge warbler +wren warbler +blackcap +rook +Clark's nutcracker +jackdaw +European magpie +jay +raven +crow +magpie +American crow +blue jay +Canada jay +common starling +hill myna +myna +bushtit +chickadee +blue tit +tufted titmouse +Carolina chickadee +black-capped chickadee +robin +robin +hermit thrush +redwing +fieldfare +song thrush +nightingale +blackbird +missel thrush +ring ouzel +wheatear +bluebird +thrush nightingale +bluethroat +redstart +bulbul +Old World chat +wood thrush +stonechat +whinchat +butcherbird +loggerhead shrike +bush shrike +northern shrike +European shrike +western tanager +summer tanager +scarlet tanager +serin +bullfinch +grosbeak +goldfinch +New World sparrow +crossbill +bunting +linnet +cardinal +siskin +common canary +towhee +purple finch +honeycreeper +brambling +New World goldfinch +pine siskin +redpoll +dark-eyed junco +house finch +chaffinch +canary +redpoll +junco +pine grosbeak +evening grosbeak +hawfinch +song sparrow +white-throated sparrow +tree sparrow +field sparrow +white-crowned sparrow +swamp sparrow +chipping sparrow +indigo bunting +reed bunting +snow bunting +ortolan +yellowhammer +cedar waxwing +Bohemian waxwing +bobolink +meadowlark +northern oriole +orchard oriole +New World blackbird +eastern meadowlark +western meadowlark +Bullock's oriole +Baltimore oriole +purple grackle +cowbird +grackle +red-winged blackbird +white-bellied swallow +tree swallow +martin +barn swallow +cliff swallow +house martin +bank martin +butcherbird +currawong +Java sparrow +zebra finch +red-breasted nuthatch +European nuthatch +white-breasted nuthatch +English sparrow +tree sparrow +thornbill +Archilochus colubris +jacamar +woodpecker +barbet +toucanet +toucan +flicker +downy woodpecker +green woodpecker +sapsucker +wryneck +redheaded woodpecker +yellow-shafted flicker +red-breasted sapsucker +yellow-bellied sapsucker +kingfisher +roller +motmot +Euopean hoopoe +hornbill +European roller +hoopoe +bee eater +kookaburra +Eurasian kingfisher +belted kingfisher +vulture +hawk +secretary bird +eagle +owl +Old World vulture +New World vulture +Egyptian vulture +bearded vulture +black vulture +griffon vulture +black vulture +buzzard +king vulture +condor +Andean condor +California condor +harrier +goshawk +red-shouldered hawk +honey buzzard +falcon +harrier eagle +Cooper's hawk +osprey +kite +rough-legged hawk +buzzard +sparrow hawk +marsh harrier +marsh hawk +carancha +gyrfalcon +peregrine +caracara +hobby +pigeon hawk +kestrel +sparrow hawk +white-tailed kite +swallow-tailed kite +black kite +eaglet +golden eagle +sea eagle +bald eagle +harpy +tawny eagle +fishing eagle +ern +tawny owl +owlet +spotted owl +screech owl +horned owl +screech owl +little owl +barn owl +scops owl +Old World scops owl +hawk owl +great horned owl +barred owl +long-eared owl +great grey owl +frogmouth +goatsucker +touraco +cuckoo +coucal +roadrunner +rhea +rhea +ostrich +emu +cassowary +domestic fowl +columbiform bird +brush turkey +red jungle fowl +jungle fowl +game bird +turkey cock +bantam +turkey +guinea fowl +chicken +cockerel +cock +Rhode Island red +chick +Orpington +hen +pullet +brood hen +sandgrouse +pigeon +domestic pigeon +dove +wood pigeon +rock dove +homing pigeon +roller +Streptopelia turtur +turtledove +Australian turtledove +mourning dove +phasianid +tinamou +grouse +pheasant +quail +partridge +tragopan +ring-necked pheasant +golden pheasant +peafowl +peahen +blue peafowl +peacock +green peafowl +bobwhite +California quail +northern bobwhite +red-legged partridge +Hungarian partridge +spruce grouse +prairie chicken +capercaillie +ruffed grouse +sage grouse +moorhen +black grouse +ptarmigan +cockateel +parakeet +cockatoo +poll +kea +African grey +macaw +amazon +lovebird +lory +popinjay +budgerigar +ring-necked parakeet +sulphur-crested cockatoo +pink cockatoo +rainbow lorikeet +lorikeet +beast of burden +draft animal +ctenophore +worm +mollusk +echinoderm +coelenterate +arthropod +sponge +nematode +annelid +flatworm +medicinal leech +earthworm +chiton +bivalve +cephalopod +gastropod +oyster +ark shell +clam +mussel +cockle +scallop +pearl oyster +soft-shell clam +quahog +giant clam +freshwater mussel +edible mussel +zebra mussel +octopod +chambered nautilus +cuttlefish +octopus +paper nautilus +sea hare +cowrie +conch +seasnail +ormer +tiger cowrie +sea slug +slug +snail +common limpet +whelk +nerita +edible snail +brown snail +garden snail +starfish +feather star +sand dollar +sea urchin +sea cucumber +brittle star +polyp +anthozoan +Portuguese man-of-war +jellyfish +sea pen +sea anemone +coral +stony coral +gorgonian +sea fan +mushroom coral +brain coral +centipede +crustacean +trilobite +millipede +arachnid +horseshoe crab +instar +insect +house centipede +daphnia +brachyuran +mantis shrimp +malacostracan crustacean +decapod crustacean +isopod +amphipod +pill bug +woodlouse +lobster +shrimp +hermit crab +prawn +crab +crayfish +Norway lobster +spiny lobster +American lobster +king crab +blue crab +rock crab +Dungeness crab +fiddler crab +European spider crab +scorpion +harvestman +acarine +spider +tick +mite +wood tick +orb-weaving spider +European wolf spider +tarantula +wolf spider +garden spider +black widow +black and gold garden spider +barn spider +orthopterous insect +hemipterous insect +neuropteron +dictyopterous insect +collembolan +mayfly +homopterous insect +dipterous insect +earwig +common European earwig +phasmid +pollinator +bug +pupa +walking stick +scorpion fly +beetle +heteropterous insect +stonefly +hymenopterous insect +lepidopterous insect +chrysalis +odonate +silverfish +worker bee +grasshopper +cricket +katydid +locust +true bug +bedbug +dobson +green lacewing +lacewing +mantis +praying mantis +cockroach +American cockroach +German cockroach +oriental cockroach +plant louse +cicada +meadow spittlebug +seventeen-year locust +mealybug +leafhopper +aphid +mosquito +crane fly +midge +fruit fly +fly +horse tick +robber fly +Asian tiger mosquito +common mosquito +bee fly +horsefly +flesh fly +blowfly +housefly +greenbottle +bluebottle +Colorado potato beetle +firefly +ground beetle +sawyer +ladybug +lamellicorn beetle +rove beetle +Asian longhorned beetle +leaf beetle +elaterid beetle +click beetle +tiger beetle +weevil +long-horned beetle +Hippodamia convergens +vedalia +scarabaeid beetle +stag beetle +rose chafer +June beetle +Japanese beetle +rhinoceros beetle +dung beetle +scarab +cockchafer +water strider +wheel bug +wasp +ichneumon fly +ant +bee +cicada killer +digger wasp +vespid +hornet +paper wasp +common wasp +giant hornet +yellow jacket +carpenter ant +fire ant +wood ant +carpenter bee +honeybee +mason bee +andrena +leaf-cutting bee +bumblebee +Africanized bee +black bee +butterfly +moth +lycaenid +nymphalid +sulphur butterfly +ringlet +monarch +cabbage butterfly +blue +hairstreak +copper +tortoiseshell +fritillary +admiral +banded purple +peacock +red-spotted purple +painted beauty +mourning cloak +viceroy +red admiral +white admiral +comma +small white +large white +cinnabar +saturniid +noctuid moth +hawkmoth +tea tortrix +geometrid +tineid +atlas moth +emperor +polyphemus moth +cecropia +luna moth +carpet moth +clothes moth +dragonfly +damselfly +hen +filly +dam +herpes +protoctist +herpes simplex +herpes zoster +cytomegalovirus +herpes varicella zoster +alga +protozoan +seagrass +pond scum +green algae +plasmodium +ameba +ciliate +paramecium +sphagnum +hepatica +liverwort +peer +birth +adult +juvenile +countrywoman +businessperson +native +celebrant +native +Filipino +male +Gemini +onlooker +queen +referee +commoner +expert +newcomer +face +demonstrator +orphan +Black woman +contestant +bullfighter +lowerclassman +candidate +friend +life +anomaly +actor +thrower +creature +child +sheep +scuba diver +dancer +garbage man +entertainer +lover +unfortunate +anti +defender +sphinx +Indian +patient +Slav +White +brick +recipient +religious person +rescuer +Latin +money handler +rich person +domestic partner +creator +consumer +worker +groom +boy scout +inhabitant +African +fan +eager beaver +leader +schoolmate +man +philatelist +advocate +eccentric +bad person +transvestite +citizen +communicator +nonworker +parrot +intellectual +nonsmoker +student +chameleon +combatant +platinum blond +appointee +unpleasant person +politician +ruler +ancient +spectator +right-hander +traveler +scientist +picker +female +acquaintance +Black +relative +beard +redhead +sleeper +computer user +associate +participant +member +raiser +groom +bride +commissioner +director +tribesman +board member +important person +professional +oldster +celebrity +very important person +serjeant-at-law +educator +health professional +teacher +reading teacher +schoolmaster +nurse +medical practitioner +pharmacist +head nurse +probationer +doctor +surgeon +specialist +house physician +cardiologist +radiologist +schoolchild +child +bairn +orphan +entrepreneur +baron +agent +merchant +certified public accountant +syndic +insurance broker +fishmonger +vintner +peddler +seller +male child +mother's boy +son +man +cub +farm boy +bat boy +Herr +hunk +Peter Pan +patriarch +adonis +young buck +stud +guy +patriarch +sleuth +archer +authority +military attache +therapist +technician +black belt +high priest +critic +taster +panelist +physical therapist +osteopath +player +athlete +rival +billiard player +medalist +seeded player +chess master +pool player +football player +tennis player +ball hawk +vaulter +runner +skater +acrobat +climber +diver +alpinist +soccer player +winger +tennis pro +forward +sport +basketball player +miler +ballplayer +gymnast +back +lineman +halfback +quarterback +tailback +skateboarder +speedskater +circus acrobat +aerialist +fielder +designated hitter +base runner +minor leaguer +first baseman +outfielder +right fielder +infielder +semifinalist +foe +matador +picador +banderillero +buddy +mate +flatmate +pitcher +closer +right-handed pitcher +folk dancer +square dancer +morris dancer +compere +master of ceremonies +caricaturist +performer +fire-eater +executant +dancer +juggler +puppeteer +actor +clown +musician +dancing-master +ballet dancer +understudy +starlet +tenor saxophonist +percussionist +guitarist +keyboardist +trumpeter +sitar player +singer +oboist +cellist +violist +flutist +organist +rock star +drummer +songster +bass +fiance +darling +fancier +soul mate +sweetheart +kisser +amputee +homeless +casualty +guard +fireman +zoo keeper +lawman +military policeman +attorney general +policeman +bobby +Mountie +detective +motorcycle cop +trooper +traffic cop +Kiliwa +Biloxi +Chickasaw +Kickapoo +Arab +white man +Omani +Bedouin +Yemeni +protegee +heiress +swami +Buddhist +Muslim +novitiate +religious +Muslimah +Sufi +mother +monk +Sister +treasurer +ratepayer +state treasurer +bursar +cobbler +artist +choreographer +farmer +musician +stylist +sculptor +press photographer +songwriter +arranger +beekeeper +breeder +agriculturist +drinker +policyholder +drinker +concert-goer +drunkard +beer drinker +maid +employee +assistant +gondolier +skilled worker +skidder +boatman +waiter +bartender +staff member +salesperson +workman +settler +breadwinner +waitress +salesman +gardener +laborer +mill-hand +hired hand +coal miner +horse wrangler +goat herder +farmhand +attendant +cog +model +escort +caddie +companion +lifeguard +steward +color guard +honor guard +cover girl +artist's model +electrician +official +falconer +balloonist +craftsman +pilot +blacksmith +trawler +mender +baker +serviceman +painter +diplomat +judge +incumbent +appointee +presbyter +ambassador +high commissioner +plenipotentiary +glassblower +carpenter +coiffeur +machinist +wright +hairdresser +fighter pilot +copilot +artilleryman +Navy SEAL +military officer +enlisted person +noncommissioned officer +commanding officer +naval commander +adjutant general +commander in chief +commissioned officer +army officer +adjutant +inspector general +sergeant +first sergeant +staff sergeant +commissioned military officer +commissioned naval officer +line officer +major +lieutenant +first lieutenant +marshal +captain +general +lieutenant colonel +lieutenant commander +rear admiral +soldier +enlisted man +tanker +reservist +Unknown Soldier +private +recruit +yard bird +villager +Tahitian +American +Asian +American +Polynesian +European +New Zealander +North Carolinian +Minnesotan +Nebraskan +Floridian +Afghan +Tibetan +Mongol +Papuan +Indian +Jordanian +Japanese +Malay +Korean +Timorese +Bornean +Lao +Iraqi +Gujarati +Punjabi +West Indian +Latin American +North American +South American +Bahamian +Barbadian +Haitian +Central American +Canadian +Mexican +Nicaraguan +Mexican-American +Bolivian +Guyanese +Albanian +Byelorussian +Monegasque +Frank +Scandinavian +Laconian +Netherlander +Slovene +Sabine +Bulgarian +Romanian +Lithuanian +Englishwoman +Britisher +Yugoslav +Dubliner +Parisian +Eritrean +Tanzanian +Zulu +Black African +Cameroonian +Sudanese +Senegalese +Kenyan +Togolese +Ugandan +Liberian +Herero +Zimbabwean +Nigerian +Gambian +Tuareg +Guinean +Ethiopian +South African +mayor +politician +trainer +employer +Speaker +lawgiver +cheerleader +head +aristocrat +spiritual leader +instigator +mistress +boss +demagogue +Labourite +animal trainer +pitching coach +legislator +deputy +senator +administrator +department head +secretary +manageress +executive +hotelier +chief executive officer +Treasury +minister +Secretary of State +Secretary of the Interior +duchess +viscount +clergyman +lama +rabbi +Dalai Lama +officiant +priest +cleric +vicar +Father +bishop +diocesan +cardinal +metropolitan +federalist +supporter +ambassador +protectionist +loyalist +cheerleader +adulteress +wrongdoer +hypocrite +abettor +skinhead +biographer +disk jockey +speaker +representative +reporter +orator +interlocutor +organ-grinder +head of state +alderman +resident commissioner +President of the United States +president +television reporter +anchor +retiree +sunbather +camper +scholar +exponent +casuist +futurist +licentiate +reader +brawler +boxer +wrestler +flyweight +middleweight +sparring partner +prizefighter +light heavyweight +featherweight +lightweight +heavyweight +flyweight +sumo wrestler +bantamweight +egotist +fire-eater +upstart +bragger +exhibitionist +sovereign +Pharaoh +Cheops +sheik +rider +motorcyclist +musher +astronaut +pedestrian +mover +commuter +pilgrim +skin-diver +settler +tourist +runner +gringo +unicyclist +hang glider +jockey +horseman +saunterer +marcher +hitter +scrambler +psycholinguist +social scientist +lumper +sociologist +political scientist +economist +econometrician +microeconomist +female child +woman +mother's daughter +girl wonder +Boy Scout +Cub Scout +enchantress +lady +old woman +nymph +donna +bridesmaid +smasher +primigravida +signorina +girl +beldam +heroine +widow +call girl +baggage +wife +gal +baby +lass +maid +first lady +old lady +crown princess +father-in-law +cousin +kinswoman +ancestor +kinsman +second cousin +in-law +kin +twin +offspring +sibling +niece +aunt +great-niece +sister +great-aunt +little sister +big sister +parent +forefather +forebear +patriarch +mater +father +mother +dad +old man +great grandparent +grandparent +great grandmother +nan +grandma +grandfather +great-nephew +little brother +grandchild +firstborn +child +successor +granddaughter +great grandchild +great grandson +great granddaughter +baby +godson +premature baby +neonate +shiitake +common stinkhorn +earthball +truffle +hen-of-the-woods +gyromitra +mildew +lichen +white fungus +true slime mold +slime mold +club fungus +earthstar +coral fungus +false morel +puffball +pythium +helvella +giant puffball +Scleroderma citrinum +jelly fungus +agaric +stinkhorn +discomycete +basidiomycete +Phytophthora infestans +Jew's-ear +bolete +powdery mildew +downy mildew +reindeer moss +beard lichen +Iceland moss +lecanora +Sarcoscypha coccinea +Aleuria aurantia +gill fungus +polypore +agaric +mushroom +Polyporus squamosus +bracket fungus +Entoloma lividum +mushroom +inky cap +mushroom +oyster mushroom +deer mushroom +parasol mushroom +fairy-ring mushroom +royal agaric +blewits +honey mushroom +Pholiota squarrosa +lepiota +blushing mushroom +horse mushroom +nameko +winter mushroom +false deathcap +shaggymane +destroying angel +toadstool +chanterelle +meadow mushroom +death cap +fly agaric +morel +common morel +black morel +Boletus edulis +Boletus luridus +Boletus chrysenteron +somatic cell +histiocyte +leukocyte +lymphocyte +neutrophil +nest +tangle +radiator +plant part +rock +comet +cadaver +star +snowdrift +covering +aerie +wasp's nest +lip +tendril +plant organ +mycelium +reproductive structure +leaf +root +stalk +hypanthium +flower +fruit +pistil +rosebud +inflorescence +floret +umbel +flower cluster +panicle +olive +ear +buckthorn berry +berry +wild cherry +acorn +rowanberry +mealie +gourd +seed +hip +juniper berry +pod +corn +coffee bean +nut +buckeye +oilseed +bean +edible seed +edible nut +pine nut +macadamia nut +pistachio +hazelnut +walnut +cashew +chestnut +pecan +peanut +coconut +linseed +rapeseed +broad bean +soy +cumin +sunflower seed +pumpkin seed +legume +okra +chickpea +pea +cowpea +garden pea +lentil +dandelion green +frond +petal +cassava +chicory +tuber +spadix +branchlet +bulb +petiole +scape +cornstalk +rattan +Jerusalem artichoke +yam +squill +onion +belay +outcrop +tor +supernova +sun +shell +bracteole +shell +cassia bark +snowcap +perianth +body covering +roof +seashell +scallop shell +oyster shell +exoskeleton +cuticle +plastron +skin +hair +scapular +hairdo +forelock +encolure +facial hair +pigtail +thatch +pompadour +mustache +beard +mustachio +soup-strainer +stubble +soul patch +weather +dust storm +cloud +snow +wave diff --git a/data/coco9k.map b/data/coco9k.map new file mode 100644 index 00000000000..5155b652358 --- /dev/null +++ b/data/coco9k.map @@ -0,0 +1,80 @@ +5177 +3768 +3802 +3800 +4107 +4072 +4071 +3797 +4097 +2645 +5150 +2644 +3257 +2523 +6527 +6866 +6912 +7342 +7255 +7271 +7217 +6858 +7343 +7233 +3704 +4374 +3641 +5001 +3899 +2999 +2631 +5141 +2015 +1133 +1935 +1930 +5144 +5143 +2371 +3916 +3745 +3640 +4749 +4736 +4735 +3678 +58 +42 +771 +81 +152 +141 +786 +700 +218 +791 +2518 +2521 +3637 +2458 +2505 +2519 +3499 +2837 +3503 +2597 +3430 +2080 +5103 +5111 +5102 +3013 +5096 +1102 +3218 +4010 +2266 +1127 +5122 +2360 diff --git a/data/inet9k.map b/data/inet9k.map new file mode 100644 index 00000000000..c91b3c15acc --- /dev/null +++ b/data/inet9k.map @@ -0,0 +1,200 @@ +2687 +4107 +8407 +7254 +42 +6797 +127 +2268 +2442 +3704 +260 +1970 +58 +4443 +2661 +2043 +2039 +4858 +4007 +6858 +8408 +166 +2523 +3768 +4347 +6527 +2446 +5005 +3274 +3678 +4918 +709 +4072 +8428 +7223 +2251 +3802 +3848 +7271 +2677 +8267 +2849 +2518 +2738 +3746 +5105 +3430 +3503 +2249 +1841 +2032 +2358 +122 +3984 +4865 +3246 +5095 +6912 +6878 +8467 +2741 +1973 +3057 +7217 +1872 +44 +2452 +3637 +2704 +6917 +2715 +6734 +2325 +6864 +6677 +2035 +1949 +338 +2664 +5122 +1844 +784 +2223 +7188 +2719 +2670 +4830 +158 +4818 +7228 +1965 +7342 +786 +2095 +8281 +8258 +7406 +3915 +8382 +2437 +2837 +82 +6871 +1876 +7447 +8285 +5007 +2740 +3463 +5103 +3755 +4910 +6809 +3800 +118 +3396 +3092 +2709 +81 +7105 +4036 +2366 +1846 +5177 +2684 +64 +2041 +3919 +700 +3724 +1742 +39 +807 +7184 +2256 +235 +2778 +2996 +2030 +3714 +7167 +2369 +6705 +6861 +5096 +2597 +2166 +2036 +3228 +3747 +2711 +8300 +2226 +7153 +7255 +2631 +7109 +8242 +7445 +3776 +3803 +3690 +2025 +2521 +2316 +7190 +8249 +3352 +2639 +2887 +100 +4219 +3344 +5008 +7224 +3351 +2434 +2074 +2034 +8304 +5004 +6868 +5102 +2645 +4071 +2716 +2717 +7420 +3499 +3763 +5084 +2676 +2046 +5107 +5097 +3944 +4097 +7132 +3956 +7343 diff --git a/src/box.c b/src/box.c index 9568599168e..39dea067dfc 100644 --- a/src/box.c +++ b/src/box.c @@ -246,6 +246,34 @@ int nms_comparator(const void *pa, const void *pb) return 0; } +void do_nms_obj(box *boxes, float **probs, int total, int classes, float thresh) +{ + int i, j, k; + sortable_bbox *s = calloc(total, sizeof(sortable_bbox)); + + for(i = 0; i < total; ++i){ + s[i].index = i; + s[i].class = classes; + s[i].probs = probs; + } + + qsort(s, total, sizeof(sortable_bbox), nms_comparator); + for(i = 0; i < total; ++i){ + if(probs[s[i].index][classes] == 0) continue; + box a = boxes[s[i].index]; + for(j = i+1; j < total; ++j){ + box b = boxes[s[j].index]; + if (box_iou(a, b) > thresh){ + for(k = 0; k < classes+1; ++k){ + probs[s[j].index][k] = 0; + } + } + } + } + free(s); +} + + void do_nms_sort(box *boxes, float **probs, int total, int classes, float thresh) { int i, j, k; diff --git a/src/box.h b/src/box.h index a5f8cee3cb0..c65589b919d 100644 --- a/src/box.h +++ b/src/box.h @@ -15,6 +15,7 @@ float box_rmse(box a, box b); dbox diou(box a, box b); void do_nms(box *boxes, float **probs, int total, int classes, float thresh); void do_nms_sort(box *boxes, float **probs, int total, int classes, float thresh); +void do_nms_obj(box *boxes, float **probs, int total, int classes, float thresh); box decode_box(box b, box anchor); box encode_box(box b, box anchor); diff --git a/src/coco.c b/src/coco.c index f684feea772..8f3c96821a3 100644 --- a/src/coco.c +++ b/src/coco.c @@ -384,5 +384,5 @@ void run_coco(int argc, char **argv) else if(0==strcmp(argv[2], "train")) train_coco(cfg, weights); else if(0==strcmp(argv[2], "valid")) validate_coco(cfg, weights); else if(0==strcmp(argv[2], "recall")) validate_coco_recall(cfg, weights); - else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix); + else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, .5); } diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index ae9df8f0fdc..fcaea0313b4 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -127,6 +127,7 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network_state state) void backward_convolutional_layer_gpu(convolutional_layer l, network_state state) { + //constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.n, l.out_w*l.out_h); diff --git a/src/cpu_gemm.c b/src/cpu_gemm.c deleted file mode 100644 index 29c9ff37757..00000000000 --- a/src/cpu_gemm.c +++ /dev/null @@ -1,91 +0,0 @@ -#include "mini_blas.h" - -void cpu_gemm_nn(int TA, int TB, int M, int N, int K, float ALPHA, - float *A, int lda, - float *B, int ldb, - float BETA, - float *C, int ldc) -{ - int i,j,k; - for(i = 0; i < M; ++i){ - for(k = 0; k < K; ++k){ - register float A_PART = ALPHA*A[i*lda+k]; - for(j = 0; j < N; ++j){ - C[i*ldc+j] += A_PART*B[k*ldb+j]; - } - } - } -} - -void cpu_gemm_nt(int TA, int TB, int M, int N, int K, float ALPHA, - float *A, int lda, - float *B, int ldb, - float BETA, - float *C, int ldc) -{ - int i,j,k; - for(i = 0; i < M; ++i){ - for(j = 0; j < N; ++j){ - register float sum = 0; - for(k = 0; k < K; ++k){ - sum += ALPHA*A[i*lda+k]*B[k+j*ldb]; - } - C[i*ldc+j] += sum; - } - } -} - -void cpu_gemm_tn(int TA, int TB, int M, int N, int K, float ALPHA, - float *A, int lda, - float *B, int ldb, - float BETA, - float *C, int ldc) -{ - int i,j,k; - for(i = 0; i < M; ++i){ - for(k = 0; k < K; ++k){ - register float A_PART = ALPHA*A[k*lda+i]; - for(j = 0; j < N; ++j){ - C[i*ldc+j] += A_PART*B[k*ldb+j]; - } - } - } -} -void cpu_gemm_tt(int TA, int TB, int M, int N, int K, float ALPHA, - float *A, int lda, - float *B, int ldb, - float BETA, - float *C, int ldc) -{ - int i,j,k; - for(i = 0; i < M; ++i){ - for(j = 0; j < N; ++j){ - for(k = 0; k < K; ++k){ - C[i*ldc+j] += ALPHA*A[i+k*lda]*B[k+j*ldb]; - } - } - } -} - - -void cpu_gemm(int TA, int TB, int M, int N, int K, float ALPHA, - float *A, int lda, - float *B, int ldb, - float BETA, - float *C, int ldc) -{ - int i, j; - for(i = 0; i < M; ++i){ - for(j = 0; j < N; ++j){ - C[i*ldc + j] *= BETA; - } - } - if(!TA && !TB) - cpu_gemm_nn( TA, TB, M, N, K, ALPHA,A,lda, B, ldb,BETA,C,ldc); - else if(TA && !TB) - cpu_gemm_tn( TA, TB, M, N, K, ALPHA,A,lda, B, ldb,BETA,C,ldc); - else if(!TA && TB) - cpu_gemm_nt( TA, TB, M, N, K, ALPHA,A,lda, B, ldb,BETA,C,ldc); - else - cpu_gemm_tt( TA, TB, M, N, K, ALPHA,A,lda, B, ldb,BETA,C,ldc); -} diff --git a/src/darknet.c b/src/darknet.c index 627b6dbdf62..6e56072808c 100644 --- a/src/darknet.c +++ b/src/darknet.c @@ -13,7 +13,7 @@ #endif extern void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top); -extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh); +extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh); extern void run_voxel(int argc, char **argv); extern void run_yolo(int argc, char **argv); extern void run_detector(int argc, char **argv); @@ -129,7 +129,9 @@ void oneoff(char *cfgfile, char *weightfile, char *outfile) network net = parse_network_cfg(cfgfile); int oldn = net.layers[net.n - 2].n; int c = net.layers[net.n - 2].c; - net.layers[net.n - 2].n = 9372; + scal_cpu(oldn*c, .1, net.layers[net.n - 2].weights, 1); + scal_cpu(oldn, 0, net.layers[net.n - 2].biases, 1); + net.layers[net.n - 2].n = 9418; net.layers[net.n - 2].biases += 5; net.layers[net.n - 2].weights += 5*c; if(weightfile){ @@ -383,7 +385,7 @@ int main(int argc, char **argv) } else if (0 == strcmp(argv[1], "detect")){ float thresh = find_float_arg(argc, argv, "-thresh", .24); char *filename = (argc > 4) ? argv[4]: 0; - test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh); + test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5); } else if (0 == strcmp(argv[1], "cifar")){ run_cifar(argc, argv); } else if (0 == strcmp(argv[1], "go")){ diff --git a/src/data.c b/src/data.c index 8fb1a258190..05e5a91b5f1 100644 --- a/src/data.c +++ b/src/data.c @@ -267,7 +267,7 @@ void fill_truth_region(char *path, float *truth, int classes, int num_boxes, int h = boxes[i].h; id = boxes[i].id; - if (w < .01 || h < .01) continue; + if (w < .005 || h < .005) continue; int col = (int)(x*num_boxes); int row = (int)(y*num_boxes); @@ -317,7 +317,7 @@ void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, h = boxes[i].h; id = boxes[i].id; - if ((w < .01 || h < .01)) continue; + if ((w < .005 || h < .005)) continue; truth[i*5+0] = x; truth[i*5+1] = y; diff --git a/src/demo.c b/src/demo.c index 19eaee1704e..7818bc3b40a 100644 --- a/src/demo.c +++ b/src/demo.c @@ -31,6 +31,7 @@ static image disp = {0}; static CvCapture * cap; static float fps = 0; static float demo_thresh = 0; +static float demo_hier_thresh = .5; static float *predictions[FRAMES]; static int demo_index = 0; @@ -63,7 +64,7 @@ void *detect_in_thread(void *ptr) if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else if (l.type == REGION){ - get_region_boxes(l, 1, 1, demo_thresh, probs, boxes, 0, 0); + get_region_boxes(l, 1, 1, demo_thresh, probs, boxes, 0, 0, demo_hier_thresh); } else { error("Last layer must produce detections\n"); } @@ -91,7 +92,7 @@ double get_wall_time() return (double)time.tv_sec + (double)time.tv_usec * .000001; } -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix) +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh) { //skip = frame_skip; image **alphabet = load_alphabet(); @@ -100,6 +101,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch demo_alphabet = alphabet; demo_classes = classes; demo_thresh = thresh; + demo_hier_thresh = hier_thresh; printf("Demo\n"); net = parse_network_cfg(cfgfile); if(weightfile){ @@ -127,7 +129,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box)); probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes, sizeof(float)); pthread_t fetch_thread; pthread_t detect_thread; @@ -213,7 +215,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch } } #else -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix) +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh) { fprintf(stderr, "Demo needs OpenCV for webcam images.\n"); } diff --git a/src/demo.h b/src/demo.h index 5f922717157..c3d6a61ac6e 100644 --- a/src/demo.h +++ b/src/demo.h @@ -2,6 +2,6 @@ #define DEMO #include "image.h" -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix); +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh); #endif diff --git a/src/detector.c b/src/detector.c index a389407a849..1416c050987 100644 --- a/src/detector.c +++ b/src/detector.c @@ -81,7 +81,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i if(l.random && count++%10 == 0){ printf("Resizing\n"); int dim = (rand() % 10 + 10) * 32; - if (get_current_batch(net)+100 > net.max_batches) dim = 544; + if (get_current_batch(net)+200 > net.max_batches) dim = 608; //int dim = (rand() % 4 + 16) * 32; printf("%d\n", dim); args.w = dim; @@ -231,7 +231,7 @@ void print_imagenet_detections(FILE *fp, int id, box *boxes, float **probs, int } } -void validate_detector(char *datacfg, char *cfgfile, char *weightfile) +void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *outfile) { int j; list *options = read_data_cfg(datacfg); @@ -251,7 +251,6 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile) fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); srand(time(0)); - char *base = "comp4_det_test_"; list *plist = get_paths(valid_images); char **paths = (char **)list_to_array(plist); @@ -265,19 +264,22 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile) int coco = 0; int imagenet = 0; if(0==strcmp(type, "coco")){ - snprintf(buff, 1024, "%s/coco_results.json", prefix); + if(!outfile) outfile = "coco_results"; + snprintf(buff, 1024, "%s/%s.json", prefix, outfile); fp = fopen(buff, "w"); fprintf(fp, "[\n"); coco = 1; } else if(0==strcmp(type, "imagenet")){ - snprintf(buff, 1024, "%s/imagenet-detection.txt", prefix); + if(!outfile) outfile = "imagenet-detection"; + snprintf(buff, 1024, "%s/%s.txt", prefix, outfile); fp = fopen(buff, "w"); imagenet = 1; classes = 200; } else { + if(!outfile) outfile = "comp4_det_test_"; fps = calloc(classes, sizeof(FILE *)); for(j = 0; j < classes; ++j){ - snprintf(buff, 1024, "%s/%s%s.txt", prefix, base, names[j]); + snprintf(buff, 1024, "%s/%s%s.txt", prefix, outfile, names[j]); fps[j] = fopen(buff, "w"); } } @@ -333,7 +335,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile) network_predict(net, X); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, thresh, probs, boxes, 0, map); + get_region_boxes(l, w, h, thresh, probs, boxes, 0, map, .5); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -397,7 +399,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) image sized = resize_image(orig, net.w, net.h); char *id = basecfg(path); network_predict(net, sized.data); - get_region_boxes(l, 1, 1, thresh, probs, boxes, 1, 0); + get_region_boxes(l, 1, 1, thresh, probs, boxes, 1, 0, .5); if (nms) do_nms(boxes, probs, l.w*l.h*l.n, 1, nms); char labelpath[4096]; @@ -436,7 +438,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) } } -void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh) +void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh) { list *options = read_data_cfg(datacfg); char *name_list = option_find_str(options, "names", "data/names.list"); @@ -470,14 +472,15 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(l.classes, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(l.classes + 1, sizeof(float *)); float *X = sized.data; time=clock(); network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - get_region_boxes(l, 1, 1, thresh, probs, boxes, 0, 0); - if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); + get_region_boxes(l, 1, 1, thresh, probs, boxes, 0, 0, hier_thresh); + if (l.softmax_tree && nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); + else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); save_image(im, "predictions"); show_image(im, "predictions"); @@ -498,6 +501,7 @@ void run_detector(int argc, char **argv) { char *prefix = find_char_arg(argc, argv, "-prefix", 0); float thresh = find_float_arg(argc, argv, "-thresh", .24); + float hier_thresh = find_float_arg(argc, argv, "-hier", .5); int cam_index = find_int_arg(argc, argv, "-c", 0); int frame_skip = find_int_arg(argc, argv, "-s", 0); if(argc < 4){ @@ -505,6 +509,7 @@ void run_detector(int argc, char **argv) return; } char *gpu_list = find_char_arg(argc, argv, "-gpus", 0); + char *outfile = find_char_arg(argc, argv, "-out", 0); int *gpus = 0; int gpu = 0; int ngpus = 0; @@ -533,15 +538,15 @@ void run_detector(int argc, char **argv) char *cfg = argv[4]; char *weights = (argc > 5) ? argv[5] : 0; char *filename = (argc > 6) ? argv[6]: 0; - if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh); + if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh); else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear); - else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights); + else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile); else if(0==strcmp(argv[2], "recall")) validate_detector_recall(cfg, weights); else if(0==strcmp(argv[2], "demo")) { list *options = read_data_cfg(datacfg); int classes = option_find_int(options, "classes", 20); char *name_list = option_find_str(options, "names", "data/names.list"); char **names = get_labels(name_list); - demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix); + demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, hier_thresh); } } diff --git a/src/layer.c b/src/layer.c index ccd0daf0277..622cf268c16 100644 --- a/src/layer.c +++ b/src/layer.c @@ -11,34 +11,88 @@ void free_layer(layer l) #endif return; } - if(l.indexes) free(l.indexes); - if(l.rand) free(l.rand); - if(l.cost) free(l.cost); - if(l.biases) free(l.biases); - if(l.bias_updates) free(l.bias_updates); - if(l.weights) free(l.weights); - if(l.weight_updates) free(l.weight_updates); - if(l.col_image) free(l.col_image); - if(l.input_layers) free(l.input_layers); - if(l.input_sizes) free(l.input_sizes); - if(l.delta) free(l.delta); - if(l.output) free(l.output); - if(l.squared) free(l.squared); - if(l.norms) free(l.norms); + if(l.cweights) free(l.cweights); + if(l.indexes) free(l.indexes); + if(l.input_layers) free(l.input_layers); + if(l.input_sizes) free(l.input_sizes); + if(l.map) free(l.map); + if(l.rand) free(l.rand); + if(l.cost) free(l.cost); + if(l.state) free(l.state); + if(l.prev_state) free(l.prev_state); + if(l.forgot_state) free(l.forgot_state); + if(l.forgot_delta) free(l.forgot_delta); + if(l.state_delta) free(l.state_delta); + if(l.concat) free(l.concat); + if(l.concat_delta) free(l.concat_delta); + if(l.binary_weights) free(l.binary_weights); + if(l.biases) free(l.biases); + if(l.bias_updates) free(l.bias_updates); + if(l.scales) free(l.scales); + if(l.scale_updates) free(l.scale_updates); + if(l.weights) free(l.weights); + if(l.weight_updates) free(l.weight_updates); + if(l.col_image) free(l.col_image); + if(l.delta) free(l.delta); + if(l.output) free(l.output); + if(l.squared) free(l.squared); + if(l.norms) free(l.norms); + if(l.spatial_mean) free(l.spatial_mean); + if(l.mean) free(l.mean); + if(l.variance) free(l.variance); + if(l.mean_delta) free(l.mean_delta); + if(l.variance_delta) free(l.variance_delta); + if(l.rolling_mean) free(l.rolling_mean); + if(l.rolling_variance) free(l.rolling_variance); + if(l.x) free(l.x); + if(l.x_norm) free(l.x_norm); + if(l.m) free(l.m); + if(l.v) free(l.v); + if(l.z_cpu) free(l.z_cpu); + if(l.r_cpu) free(l.r_cpu); + if(l.h_cpu) free(l.h_cpu); + if(l.binary_input) free(l.binary_input); #ifdef GPU - if(l.indexes_gpu) cuda_free((float *)l.indexes_gpu); - if(l.weights_gpu) cuda_free(l.weights_gpu); - if(l.weight_updates_gpu) cuda_free(l.weight_updates_gpu); - if(l.col_image_gpu) cuda_free(l.col_image_gpu); - if(l.weights_gpu) cuda_free(l.weights_gpu); - if(l.biases_gpu) cuda_free(l.biases_gpu); - if(l.weight_updates_gpu) cuda_free(l.weight_updates_gpu); - if(l.bias_updates_gpu) cuda_free(l.bias_updates_gpu); - if(l.output_gpu) cuda_free(l.output_gpu); - if(l.delta_gpu) cuda_free(l.delta_gpu); - if(l.rand_gpu) cuda_free(l.rand_gpu); - if(l.squared_gpu) cuda_free(l.squared_gpu); - if(l.norms_gpu) cuda_free(l.norms_gpu); + if(l.indexes_gpu) cuda_free((float *)l.indexes_gpu); + + if(l.z_gpu) cuda_free(l.z_gpu); + if(l.r_gpu) cuda_free(l.r_gpu); + if(l.h_gpu) cuda_free(l.h_gpu); + if(l.m_gpu) cuda_free(l.m_gpu); + if(l.v_gpu) cuda_free(l.v_gpu); + if(l.prev_state_gpu) cuda_free(l.prev_state_gpu); + if(l.forgot_state_gpu) cuda_free(l.forgot_state_gpu); + if(l.forgot_delta_gpu) cuda_free(l.forgot_delta_gpu); + if(l.state_gpu) cuda_free(l.state_gpu); + if(l.state_delta_gpu) cuda_free(l.state_delta_gpu); + if(l.gate_gpu) cuda_free(l.gate_gpu); + if(l.gate_delta_gpu) cuda_free(l.gate_delta_gpu); + if(l.save_gpu) cuda_free(l.save_gpu); + if(l.save_delta_gpu) cuda_free(l.save_delta_gpu); + if(l.concat_gpu) cuda_free(l.concat_gpu); + if(l.concat_delta_gpu) cuda_free(l.concat_delta_gpu); + if(l.binary_input_gpu) cuda_free(l.binary_input_gpu); + if(l.binary_weights_gpu) cuda_free(l.binary_weights_gpu); + if(l.mean_gpu) cuda_free(l.mean_gpu); + if(l.variance_gpu) cuda_free(l.variance_gpu); + if(l.rolling_mean_gpu) cuda_free(l.rolling_mean_gpu); + if(l.rolling_variance_gpu) cuda_free(l.rolling_variance_gpu); + if(l.variance_delta_gpu) cuda_free(l.variance_delta_gpu); + if(l.mean_delta_gpu) cuda_free(l.mean_delta_gpu); + if(l.col_image_gpu) cuda_free(l.col_image_gpu); + if(l.x_gpu) cuda_free(l.x_gpu); + if(l.x_norm_gpu) cuda_free(l.x_norm_gpu); + if(l.weights_gpu) cuda_free(l.weights_gpu); + if(l.weight_updates_gpu) cuda_free(l.weight_updates_gpu); + if(l.biases_gpu) cuda_free(l.biases_gpu); + if(l.bias_updates_gpu) cuda_free(l.bias_updates_gpu); + if(l.scales_gpu) cuda_free(l.scales_gpu); + if(l.scale_updates_gpu) cuda_free(l.scale_updates_gpu); + if(l.output_gpu) cuda_free(l.output_gpu); + if(l.delta_gpu) cuda_free(l.delta_gpu); + if(l.rand_gpu) cuda_free(l.rand_gpu); + if(l.squared_gpu) cuda_free(l.squared_gpu); + if(l.norms_gpu) cuda_free(l.norms_gpu); #endif } diff --git a/src/layer.h b/src/layer.h index eb480c00cd6..806542bbb48 100644 --- a/src/layer.h +++ b/src/layer.h @@ -99,14 +99,7 @@ struct layer{ float B1; float B2; float eps; - float *m_gpu; - float *v_gpu; int t; - float *m; - float *v; - - tree *softmax_tree; - int *map; float alpha; float beta; @@ -129,33 +122,34 @@ struct layer{ float probability; float scale; - int *indexes; - float *rand; - float *cost; - char *cweights; - float *state; - float *prev_state; - float *forgot_state; - float *forgot_delta; - float *state_delta; + char * cweights; + int * indexes; + int * input_layers; + int * input_sizes; + int * map; + float * rand; + float * cost; + float * state; + float * prev_state; + float * forgot_state; + float * forgot_delta; + float * state_delta; - float *concat; - float *concat_delta; + float * concat; + float * concat_delta; - float *binary_weights; + float * binary_weights; - float *biases; - float *bias_updates; + float * biases; + float * bias_updates; - float *scales; - float *scale_updates; + float * scales; + float * scale_updates; - float *weights; - float *weight_updates; + float * weights; + float * weight_updates; - float *col_image; - int * input_layers; - int * input_sizes; + float * col_image; float * delta; float * output; float * squared; @@ -174,6 +168,15 @@ struct layer{ float * x; float * x_norm; + float * m; + float * v; + + float * z_cpu; + float * r_cpu; + float * h_cpu; + + float * binary_input; + struct layer *input_layer; struct layer *self_layer; struct layer *output_layer; @@ -194,20 +197,20 @@ struct layer{ struct layer *input_h_layer; struct layer *state_h_layer; - float *z_cpu; - float *r_cpu; - float *h_cpu; - - float *binary_input; + tree *softmax_tree; size_t workspace_size; #ifdef GPU + int *indexes_gpu; + float *z_gpu; float *r_gpu; float *h_gpu; - int *indexes_gpu; + float *m_gpu; + float *v_gpu; + float * prev_state_gpu; float * forgot_state_gpu; float * forgot_delta_gpu; diff --git a/src/parser.c b/src/parser.c index 87a64919d73..3f39a13838b 100644 --- a/src/parser.c +++ b/src/parser.c @@ -826,7 +826,7 @@ void save_weights_upto(network net, char *filename, int cutoff) } #endif fprintf(stderr, "Saving weights to %s\n", filename); - FILE *fp = fopen(filename, "w"); + FILE *fp = fopen(filename, "wb"); if(!fp) file_error(filename); int major = 0; diff --git a/src/region_layer.c b/src/region_layer.c index 9095b3ce2fd..f5522c3f10b 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -9,11 +9,9 @@ #include #include -#define DOABS 1 - -region_layer make_region_layer(int batch, int w, int h, int n, int classes, int coords) +layer make_region_layer(int batch, int w, int h, int n, int classes, int coords) { - region_layer l = {0}; + layer l = {0}; l.type = REGION; l.n = n; @@ -75,12 +73,8 @@ box get_region_box(float *x, float *biases, int n, int index, int i, int j, int box b; b.x = (i + logistic_activate(x[index + 0])) / w; b.y = (j + logistic_activate(x[index + 1])) / h; - b.w = exp(x[index + 2]) * biases[2*n]; - b.h = exp(x[index + 3]) * biases[2*n+1]; - if(DOABS){ - b.w = exp(x[index + 2]) * biases[2*n] / w; - b.h = exp(x[index + 3]) * biases[2*n+1] / h; - } + b.w = exp(x[index + 2]) * biases[2*n] / w; + b.h = exp(x[index + 3]) * biases[2*n+1] / h; return b; } @@ -91,12 +85,8 @@ float delta_region_box(box truth, float *x, float *biases, int n, int index, int float tx = (truth.x*w - i); float ty = (truth.y*h - j); - float tw = log(truth.w / biases[2*n]); - float th = log(truth.h / biases[2*n + 1]); - if(DOABS){ - tw = log(truth.w*w / biases[2*n]); - th = log(truth.h*h / biases[2*n + 1]); - } + float tw = log(truth.w*w / biases[2*n]); + float th = log(truth.h*h / biases[2*n + 1]); delta[index + 0] = scale * (tx - logistic_activate(x[index + 0])) * logistic_gradient(logistic_activate(x[index + 0])); delta[index + 1] = scale * (ty - logistic_activate(x[index + 1])) * logistic_gradient(logistic_activate(x[index + 1])); @@ -141,14 +131,14 @@ float tisnan(float x) } void softmax_tree(float *input, int batch, int inputs, float temp, tree *hierarchy, float *output); -void forward_region_layer(const region_layer l, network_state state) +void forward_region_layer(const layer l, network_state state) { int i,j,b,t,n; int size = l.coords + l.classes + 1; memcpy(l.output, state.input, l.outputs*l.batch*sizeof(float)); - #ifndef GPU +#ifndef GPU flatten(l.output, l.w*l.h, size*l.n, l.batch, 1); - #endif +#endif for (b = 0; b < l.batch; ++b){ for(i = 0; i < l.h*l.w*l.n; ++i){ int index = size*i + b*l.outputs; @@ -197,6 +187,7 @@ void forward_region_layer(const region_layer l, network_state state) for(n = 0; n < l.n*l.w*l.h; ++n){ int index = size*n + b*l.outputs + 5; float scale = l.output[index-1]; + l.delta[index - 1] = l.noobject_scale * ((0 - l.output[index - 1]) * logistic_gradient(l.output[index - 1])); float p = scale*get_hierarchy_probability(l.output + index, l.softmax_tree, class); if(p > maxp){ maxp = p; @@ -205,6 +196,8 @@ void forward_region_layer(const region_layer l, network_state state) } int index = size*maxi + b*l.outputs + 5; delta_region_class(l.output, l.delta, index, class, l.classes, l.softmax_tree, l.class_scale, &avg_cat); + if(l.output[index - 1] < .3) l.delta[index - 1] = l.object_scale * ((.3 - l.output[index - 1]) * logistic_gradient(l.output[index - 1])); + else l.delta[index - 1] = 0; ++class_count; onlyclass = 1; break; @@ -218,39 +211,26 @@ void forward_region_layer(const region_layer l, network_state state) int index = size*(j*l.w*l.n + i*l.n + n) + b*l.outputs; box pred = get_region_box(l.output, l.biases, n, index, i, j, l.w, l.h); float best_iou = 0; - int best_class = -1; for(t = 0; t < 30; ++t){ box truth = float_to_box(state.truth + t*5 + b*l.truths); if(!truth.x) break; float iou = box_iou(pred, truth); if (iou > best_iou) { - best_class = state.truth[t*5 + b*l.truths + 4]; best_iou = iou; } } avg_anyobj += l.output[index + 4]; l.delta[index + 4] = l.noobject_scale * ((0 - l.output[index + 4]) * logistic_gradient(l.output[index + 4])); - if(l.classfix == -1) l.delta[index + 4] = l.noobject_scale * ((best_iou - l.output[index + 4]) * logistic_gradient(l.output[index + 4])); - else{ - if (best_iou > l.thresh) { - l.delta[index + 4] = 0; - if(l.classfix > 0){ - delta_region_class(l.output, l.delta, index + 5, best_class, l.classes, l.softmax_tree, l.class_scale*(l.classfix == 2 ? l.output[index + 4] : 1), &avg_cat); - ++class_count; - } - } + if (best_iou > l.thresh) { + l.delta[index + 4] = 0; } if(*(state.net.seen) < 12800){ box truth = {0}; truth.x = (i + .5)/l.w; truth.y = (j + .5)/l.h; - truth.w = l.biases[2*n]; - truth.h = l.biases[2*n+1]; - if(DOABS){ - truth.w = l.biases[2*n]/l.w; - truth.h = l.biases[2*n+1]/l.h; - } + truth.w = l.biases[2*n]/l.w; + truth.h = l.biases[2*n+1]/l.h; delta_region_box(truth, l.output, l.biases, n, index, i, j, l.w, l.h, l.delta, .01); } } @@ -274,12 +254,8 @@ void forward_region_layer(const region_layer l, network_state state) int index = size*(j*l.w*l.n + i*l.n + n) + b*l.outputs; box pred = get_region_box(l.output, l.biases, n, index, i, j, l.w, l.h); if(l.bias_match){ - pred.w = l.biases[2*n]; - pred.h = l.biases[2*n+1]; - if(DOABS){ - pred.w = l.biases[2*n]/l.w; - pred.h = l.biases[2*n+1]/l.h; - } + pred.w = l.biases[2*n]/l.w; + pred.h = l.biases[2*n+1]/l.h; } //printf("pred: (%f, %f) %f x %f\n", pred.x, pred.y, pred.w, pred.h); pred.x = 0; @@ -313,19 +289,19 @@ void forward_region_layer(const region_layer l, network_state state) } } //printf("\n"); - #ifndef GPU +#ifndef GPU flatten(l.delta, l.w*l.h, size*l.n, l.batch, 0); - #endif +#endif *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2); printf("Region Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\n", avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, count); } -void backward_region_layer(const region_layer l, network_state state) +void backward_region_layer(const layer l, network_state state) { axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, state.delta, 1); } -void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map) +void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh) { int i,j,n; float *predictions = l.output; @@ -336,7 +312,6 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b int index = i*l.n + n; int p_index = index * (l.classes + 5) + 4; float scale = predictions[p_index]; - if(l.classfix == -1 && scale < .5) scale = 0; int box_index = index * (l.classes + 5); boxes[index] = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h); boxes[index].x *= w; @@ -348,22 +323,15 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b if(l.softmax_tree){ hierarchy_predictions(predictions + class_index, l.classes, l.softmax_tree, 0); - int found = 0; if(map){ for(j = 0; j < 200; ++j){ float prob = scale*predictions[class_index+map[j]]; probs[index][j] = (prob > thresh) ? prob : 0; } } else { - for(j = l.classes - 1; j >= 0; --j){ - if(!found && predictions[class_index + j] > .5){ - found = 1; - } else { - predictions[class_index + j] = 0; - } - float prob = predictions[class_index+j]; - probs[index][j] = (scale > thresh) ? prob : 0; - } + int j = hierarchy_top_prediction(predictions + class_index, l.softmax_tree, tree_thresh); + probs[index][j] = (scale > thresh) ? scale : 0; + probs[index][l.classes] = scale; } } else { for(j = 0; j < l.classes; ++j){ @@ -380,7 +348,7 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b #ifdef GPU -void forward_region_layer_gpu(const region_layer l, network_state state) +void forward_region_layer_gpu(const layer l, network_state state) { /* if(!state.train){ @@ -421,7 +389,7 @@ void forward_region_layer_gpu(const region_layer l, network_state state) if(cpu_state.truth) free(cpu_state.truth); } -void backward_region_layer_gpu(region_layer l, network_state state) +void backward_region_layer_gpu(layer l, network_state state) { flatten_ongpu(l.delta_gpu, l.h*l.w, l.n*(l.coords + l.classes + 1), l.batch, 0, state.delta); } diff --git a/src/region_layer.h b/src/region_layer.h index a8cdd9307f9..9a3b7cd3f57 100644 --- a/src/region_layer.h +++ b/src/region_layer.h @@ -4,17 +4,15 @@ #include "layer.h" #include "network.h" -typedef layer region_layer; - -region_layer make_region_layer(int batch, int h, int w, int n, int classes, int coords); -void forward_region_layer(const region_layer l, network_state state); -void backward_region_layer(const region_layer l, network_state state); -void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map); +layer make_region_layer(int batch, int h, int w, int n, int classes, int coords); +void forward_region_layer(const layer l, network_state state); +void backward_region_layer(const layer l, network_state state); +void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh); void resize_region_layer(layer *l, int w, int h); #ifdef GPU -void forward_region_layer_gpu(const region_layer l, network_state state); -void backward_region_layer_gpu(region_layer l, network_state state); +void forward_region_layer_gpu(const layer l, network_state state); +void backward_region_layer_gpu(layer l, network_state state); #endif #endif diff --git a/src/server.c b/src/server.c deleted file mode 100644 index 6e5105e8b39..00000000000 --- a/src/server.c +++ /dev/null @@ -1,205 +0,0 @@ -#include /* needed for sockaddr_in */ -#include /* needed for sockaddr_in */ -#include -#include -#include -#include /* needed for sockaddr_in */ -#include -#include -#include - -#include "mini_blas.h" -#include "utils.h" -#include "parser.h" -#include "server.h" -#include "connected_layer.h" -#include "convolutional_layer.h" - -#define SERVER_PORT 9423 -#define STR(x) #x - -int socket_setup(int server) -{ - int fd = 0; /* our socket */ - struct sockaddr_in me; /* our address */ - - /* create a UDP socket */ - - if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - error("cannot create socket"); - } - - /* bind the socket to any valid IP address and a specific port */ - if (server == 1){ - bzero((char *) &me, sizeof(me)); - me.sin_family = AF_INET; - me.sin_addr.s_addr = htonl(INADDR_ANY); - me.sin_port = htons(SERVER_PORT); - - if (bind(fd, (struct sockaddr *)&me, sizeof(me)) < 0) { - error("bind failed"); - } - } - - return fd; -} - -typedef struct{ - int fd; - int counter; - network net; -} connection_info; - -void read_and_add_into(int fd, float *a, int n) -{ - float *buff = calloc(n, sizeof(float)); - read_all(fd, (char*) buff, n*sizeof(float)); - axpy_cpu(n, 1, buff, 1, a, 1); - free(buff); -} - -void handle_connection(void *pointer) -{ - connection_info info = *(connection_info *) pointer; - free(pointer); - //printf("New Connection\n"); - if(info.counter%100==0){ - char buff[256]; - sprintf(buff, "unikitty/net_%d.part", info.counter); - save_network(info.net, buff); - } - int fd = info.fd; - network net = info.net; - int i; - for(i = 0; i < net.n; ++i){ - if(net.types[i] == CONVOLUTIONAL){ - convolutional_layer layer = *(convolutional_layer *) net.layers[i]; - - read_and_add_into(fd, layer.bias_updates, layer.n); - int num = layer.n*layer.c*layer.size*layer.size; - read_and_add_into(fd, layer.filter_updates, num); - } - if(net.types[i] == CONNECTED){ - connected_layer layer = *(connected_layer *) net.layers[i]; - - read_and_add_into(fd, layer.bias_updates, layer.outputs); - read_and_add_into(fd, layer.weight_updates, layer.inputs*layer.outputs); - } - } - for(i = 0; i < net.n; ++i){ - if(net.types[i] == CONVOLUTIONAL){ - convolutional_layer layer = *(convolutional_layer *) net.layers[i]; - update_convolutional_layer(layer); - - write_all(fd, (char*) layer.biases, layer.n*sizeof(float)); - int num = layer.n*layer.c*layer.size*layer.size; - write_all(fd, (char*) layer.filters, num*sizeof(float)); - } - if(net.types[i] == CONNECTED){ - connected_layer layer = *(connected_layer *) net.layers[i]; - update_connected_layer(layer); - write_all(fd, (char *)layer.biases, layer.outputs*sizeof(float)); - write_all(fd, (char *)layer.weights, layer.outputs*layer.inputs*sizeof(float)); - } - } - //printf("Received updates\n"); - close(fd); -} - -void server_update(network net) -{ - int fd = socket_setup(1); - int counter = 18000; - listen(fd, 64); - struct sockaddr_in client; /* remote address */ - socklen_t client_size = sizeof(client); /* length of addresses */ - time_t t=0; - while(1){ - connection_info *info = calloc(1, sizeof(connection_info)); - info->net = net; - info->counter = counter; - pthread_t worker; - int connection = accept(fd, (struct sockaddr *) &client, &client_size); - if(!t) t=time(0); - info->fd = connection; - pthread_create(&worker, NULL, (void *) &handle_connection, info); - ++counter; - printf("%d\n", counter); - //if(counter == 1024) break; - } - close(fd); -} - -void client_update(network net, char *address) -{ - int fd = socket_setup(0); - - struct hostent *hp; /* host information */ - struct sockaddr_in server; /* server address */ - - /* fill in the server's address and data */ - bzero((char*)&server, sizeof(server)); - server.sin_family = AF_INET; - server.sin_port = htons(SERVER_PORT); - - /* look up the address of the server given its name */ - hp = gethostbyname(address); - if (!hp) { - perror("no such host"); - fprintf(stderr, "could not obtain address of %s\n", "localhost"); - } - - /* put the host's address into the server address structure */ - memcpy((void *)&server.sin_addr, hp->h_addr_list[0], hp->h_length); - if (connect(fd, (struct sockaddr *) &server, sizeof(server)) < 0) { - error("error connecting"); - } - - /* send a message to the server */ - int i; - //printf("Sending\n"); - for(i = 0; i < net.n; ++i){ - if(net.types[i] == CONVOLUTIONAL){ - convolutional_layer layer = *(convolutional_layer *) net.layers[i]; - write_all(fd, (char*) layer.bias_updates, layer.n*sizeof(float)); - int num = layer.n*layer.c*layer.size*layer.size; - write_all(fd, (char*) layer.filter_updates, num*sizeof(float)); - memset(layer.bias_updates, 0, layer.n*sizeof(float)); - memset(layer.filter_updates, 0, num*sizeof(float)); - } - if(net.types[i] == CONNECTED){ - connected_layer layer = *(connected_layer *) net.layers[i]; - write_all(fd, (char *)layer.bias_updates, layer.outputs*sizeof(float)); - write_all(fd, (char *)layer.weight_updates, layer.outputs*layer.inputs*sizeof(float)); - memset(layer.bias_updates, 0, layer.outputs*sizeof(float)); - memset(layer.weight_updates, 0, layer.inputs*layer.outputs*sizeof(float)); - } - } - //printf("Sent\n"); - - for(i = 0; i < net.n; ++i){ - if(net.types[i] == CONVOLUTIONAL){ - convolutional_layer layer = *(convolutional_layer *) net.layers[i]; - - read_all(fd, (char*) layer.biases, layer.n*sizeof(float)); - int num = layer.n*layer.c*layer.size*layer.size; - read_all(fd, (char*) layer.filters, num*sizeof(float)); - -#ifdef GPU - push_convolutional_layer(layer); - #endif - } - if(net.types[i] == CONNECTED){ - connected_layer layer = *(connected_layer *) net.layers[i]; - - read_all(fd, (char *)layer.biases, layer.outputs*sizeof(float)); - read_all(fd, (char *)layer.weights, layer.outputs*layer.inputs*sizeof(float)); - -#ifdef GPU - push_connected_layer(layer); - #endif - } - } - //printf("Updated\n"); - close(fd); -} diff --git a/src/server.h b/src/server.h deleted file mode 100644 index eb9bf281abd..00000000000 --- a/src/server.h +++ /dev/null @@ -1,4 +0,0 @@ -#include "network.h" - -void client_update(network net, char *address); -void server_update(network net); diff --git a/src/tree.c b/src/tree.c index dfa4178727d..dd44515c1dd 100644 --- a/src/tree.c +++ b/src/tree.c @@ -50,11 +50,39 @@ void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leave } } +int hierarchy_top_prediction(float *predictions, tree *hier, float thresh) +{ + float p = 1; + int group = 0; + int i; + while(1){ + float max = 0; + int max_i = 0; + + for(i = 0; i < hier->group_size[group]; ++i){ + int index = i + hier->group_offset[group]; + float val = predictions[i + hier->group_offset[group]]; + if(val > max){ + max_i = index; + max = val; + } + } + if(p*max > thresh){ + p = p*max; + group = hier->child[max_i]; + if(hier->child[max_i] < 0) return max_i; + } else { + return hier->parent[hier->group_offset[group]]; + } + } + return 0; +} + tree *read_tree(char *filename) { tree t = {0}; FILE *fp = fopen(filename, "r"); - + char *line; int last_parent = -1; int group_size = 0; @@ -67,6 +95,9 @@ tree *read_tree(char *filename) t.parent = realloc(t.parent, (n+1)*sizeof(int)); t.parent[n] = parent; + t.child = realloc(t.child, (n+1)*sizeof(int)); + t.child[n] = -1; + t.name = realloc(t.name, (n+1)*sizeof(char *)); t.name[n] = id; if(parent != last_parent){ @@ -80,6 +111,9 @@ tree *read_tree(char *filename) } t.group = realloc(t.group, (n+1)*sizeof(int)); t.group[n] = groups; + if (parent >= 0) { + t.child[parent] = groups; + } ++n; ++group_size; } diff --git a/src/tree.h b/src/tree.h index c3f49797dd7..dbd4c394141 100644 --- a/src/tree.h +++ b/src/tree.h @@ -5,6 +5,7 @@ typedef struct{ int *leaf; int n; int *parent; + int *child; int *group; char **name; @@ -16,6 +17,7 @@ typedef struct{ tree *read_tree(char *filename); void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves); void change_leaves(tree *t, char *leaf_list); +int hierarchy_top_prediction(float *predictions, tree *hier, float thresh); float get_hierarchy_probability(float *x, tree *hier, int c); #endif diff --git a/src/yolo.c b/src/yolo.c index 05f2be6a083..ee5f73bb305 100644 --- a/src/yolo.c +++ b/src/yolo.c @@ -351,5 +351,5 @@ void run_yolo(int argc, char **argv) else if(0==strcmp(argv[2], "train")) train_yolo(cfg, weights); else if(0==strcmp(argv[2], "valid")) validate_yolo(cfg, weights); else if(0==strcmp(argv[2], "recall")) validate_yolo_recall(cfg, weights); - else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix); + else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, .5); } diff --git a/src/yolo_kernels.cu b/src/yolo_kernels.cu deleted file mode 100644 index 09f3961fc23..00000000000 --- a/src/yolo_kernels.cu +++ /dev/null @@ -1,132 +0,0 @@ -#include "cuda_runtime.h" -#include "curand.h" -#include "cublas_v2.h" - -extern "C" { -#include "network.h" -#include "detection_layer.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "box.h" -#include "image.h" -#include -} - -#ifdef OPENCV -#include "opencv2/highgui/highgui.hpp" -#include "opencv2/imgproc/imgproc.hpp" -extern "C" image ipl_to_image(IplImage* src); -extern "C" void convert_yolo_detections(float *predictions, int classes, int num, int square, int side, int w, int h, float thresh, float **probs, box *boxes, int only_objectness); - -extern "C" char *voc_names[]; -extern "C" image voc_labels[]; - -static float **probs; -static box *boxes; -static network net; -static image in ; -static image in_s ; -static image det ; -static image det_s; -static image disp ; -static cv::VideoCapture cap; -static float fps = 0; -static float demo_thresh = 0; - -void *fetch_in_thread(void *ptr) -{ - cv::Mat frame_m; - cap >> frame_m; - IplImage frame = frame_m; - in = ipl_to_image(&frame); - rgbgr_image(in); - in_s = resize_image(in, net.w, net.h); - return 0; -} - -void *detect_in_thread(void *ptr) -{ - float nms = .4; - - detection_layer l = net.layers[net.n-1]; - float *X = det_s.data; - float *predictions = network_predict(net, X); - free_image(det_s); - convert_yolo_detections(predictions, l.classes, l.n, l.sqrt, l.side, 1, 1, demo_thresh, probs, boxes, 0); - if (nms > 0) do_nms(boxes, probs, l.side*l.side*l.n, l.classes, nms); - printf("\033[2J"); - printf("\033[1;1H"); - printf("\nFPS:%.0f\n",fps); - printf("Objects:\n\n"); - draw_detections(det, l.side*l.side*l.n, demo_thresh, boxes, probs, voc_names, voc_labels, 20); - return 0; -} - -extern "C" void demo_yolo(char *cfgfile, char *weightfile, float thresh, int cam_index) -{ - demo_thresh = thresh; - printf("YOLO demo\n"); - net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); - - srand(2222222); - - cv::VideoCapture cam(cam_index); - cap = cam; - if(!cap.isOpened()) error("Couldn't connect to webcam.\n"); - - detection_layer l = net.layers[net.n-1]; - int j; - - boxes = (box *)calloc(l.side*l.side*l.n, sizeof(box)); - probs = (float **)calloc(l.side*l.side*l.n, sizeof(float *)); - for(j = 0; j < l.side*l.side*l.n; ++j) probs[j] = (float *)calloc(l.classes, sizeof(float *)); - - pthread_t fetch_thread; - pthread_t detect_thread; - - fetch_in_thread(0); - det = in; - det_s = in_s; - - fetch_in_thread(0); - detect_in_thread(0); - disp = det; - det = in; - det_s = in_s; - - cvNamedWindow("YOLO", CV_WINDOW_NORMAL); - cvMoveWindow("YOLO", 0, 0); - cvResizeWindow("YOLO", 1352, 1013); - - while(1){ - struct timeval tval_before, tval_after, tval_result; - gettimeofday(&tval_before, NULL); - if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); - if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); - show_image(disp, "YOLO"); - free_image(disp); - cvWaitKey(1); - pthread_join(fetch_thread, 0); - pthread_join(detect_thread, 0); - - disp = det; - det = in; - det_s = in_s; - - gettimeofday(&tval_after, NULL); - timersub(&tval_after, &tval_before, &tval_result); - float curr = 1000000.f/((long int)tval_result.tv_usec); - fps = .9*fps + .1*curr; - } -} -#else -extern "C" void demo_yolo(char *cfgfile, char *weightfile, float thresh, int cam_index){ - fprintf(stderr, "YOLO demo needs OpenCV for webcam images.\n"); -} -#endif - From 35175b2ee89ecc212bc1b8ae235aa5fe74db74da Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 4 Jan 2017 05:01:53 -0800 Subject: [PATCH 002/118] forgot metadata --- cfg/combine9k.data | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 cfg/combine9k.data diff --git a/cfg/combine9k.data b/cfg/combine9k.data new file mode 100644 index 00000000000..06a3e76aefa --- /dev/null +++ b/cfg/combine9k.data @@ -0,0 +1,10 @@ +classes= 9418 +#train = /home/pjreddie/data/coco/trainvalno5k.txt +train = data/combine9k.train.list +valid = /home/pjreddie/data/imagenet/det.val.files +labels = data/9k.labels +names = data/9k.names +backup = backup/ +map = data/inet9k.map +eval = imagenet +results = results From b61bcf544e8dbcbd2e978ca6a716fa96b37df767 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 4 Jan 2017 05:05:08 -0800 Subject: [PATCH 003/118] ...and tree :tree: --- data/9k.tree | 9418 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 9418 insertions(+) create mode 100644 data/9k.tree diff --git a/data/9k.tree b/data/9k.tree new file mode 100644 index 00000000000..deb61e2a021 --- /dev/null +++ b/data/9k.tree @@ -0,0 +1,9418 @@ +n00002452 -1 +n00020827 -1 +n00002684 -1 +n11425580 -1 +n05220461 0 +n09225146 0 +n05538625 4 +n01900150 4 +n05225602 4 +n05418717 8 +n05302499 8 +n05578095 8 +n09475179 5 +n09376198 5 +n14877585 1 +n15046900 1 +n00019613 1 +n00021265 1 +n15067877 14 +n09436708 14 +n14915184 15 +n07555863 15 +n07850329 21 +n07849336 21 +n07705711 21 +n07622061 21 +n07594066 21 +n07854982 22 +n07852833 22 +n07852614 22 +n07854184 22 +n07852229 22 +n07851443 22 +n07705931 24 +n07707451 24 +n07752966 33 +n07760859 33 +n07747055 33 +n07754684 33 +n07768694 33 +n07764847 33 +n07768858 33 +n07739125 33 +n07746551 33 +n07753113 33 +n07763987 33 +n07748574 33 +n07751451 33 +n07762244 33 +n07750872 33 +n07742704 33 +n07765208 33 +n07763792 33 +n07767847 33 +n07766173 33 +n07751004 33 +n07760153 33 +n07758680 33 +n07753592 33 +n07751280 33 +n07769731 33 +n07763629 33 +n07755411 33 +n07754451 33 +n07753275 33 +n07764155 33 +n07765073 33 +n07762114 33 +n07762913 33 +n07753743 33 +n07765999 33 +n07765361 33 +n07752377 33 +n07757132 33 +n07769584 33 +n07751148 33 +n07761141 36 +n07761309 36 +n07749731 37 +n07747951 37 +n07749446 37 +n07747607 37 +n07749582 37 +n07750449 37 +n07749969 37 +n07750146 37 +n07748157 79 +n07748416 79 +n07748276 79 +n07748912 81 +n07748753 81 +n07749192 89 +n07749312 89 +n07739344 42 +n07739506 42 +n07742313 94 +n07740220 94 +n07740954 94 +n07740461 96 +n07740342 96 +n07745940 50 +n07767171 50 +n07744246 50 +n07744057 50 +n07744811 50 +n07744682 50 +n07745466 50 +n07743902 50 +n07746334 50 +n07746186 50 +n07743544 50 +n07743224 50 +n07755707 62 +n07756951 62 +n07755929 62 +n07757990 73 +n07757312 73 +n07757511 73 +n07734744 34 +n07719213 34 +n07768423 34 +n07735510 34 +n07718472 34 +n07710283 34 +n07713395 34 +n07708398 34 +n07710007 34 +n07718747 34 +n07708798 34 +n07723039 34 +n07715561 34 +n07709333 34 +n07730406 34 +n07730033 34 +n07733394 34 +n07713267 34 +n07722217 34 +n07817871 34 +n07736813 123 +n07719839 123 +n07712267 123 +n07730207 123 +n07710616 123 +n07710952 142 +n07711569 142 +n07711080 142 +n07713763 124 +n07713895 124 +n07733567 124 +n07715103 124 +n07715221 124 +n07715407 124 +n07714990 124 +n07735687 124 +n07735803 124 +n07714188 147 +n07714448 147 +n07714895 147 +n07714571 147 +n07714078 147 +n07720442 126 +n07734017 126 +n07713074 126 +n07734555 126 +n07720615 160 +n07721325 160 +n07720875 164 +n07721195 164 +n07721018 164 +n07721456 165 +n07722052 165 +n07721942 169 +n07721678 169 +n07734292 161 +n07734183 161 +n07724943 128 +n07725376 128 +n07726095 128 +n07725255 128 +n07729485 175 +n07726796 175 +n07727458 180 +n07727048 180 +n07727578 180 +n07727868 183 +n07728804 183 +n07728053 184 +n07728585 184 +n07728181 184 +n07729384 185 +n07729828 185 +n07725531 176 +n07725789 191 +n07725888 191 +n07715721 130 +n07717070 130 +n07716906 194 +n07716358 194 +n07716034 194 +n07717556 195 +n07717410 195 +n07720277 131 +n07736256 131 +n07723330 131 +n07719616 131 +n07736692 131 +n07733712 131 +n07732747 203 +n07730855 203 +n07731587 203 +n07731006 203 +n07723559 203 +n07724654 211 +n07724269 211 +n07724492 211 +n07722485 136 +n07723177 136 +n07722888 136 +n07639069 25 +n07679356 25 +n07682197 219 +n07680517 219 +n07695878 219 +n07685730 219 +n07682316 219 +n07684517 219 +n07680761 219 +n07681691 219 +n07684600 219 +n07684164 219 +n07686720 219 +n07680932 219 +n07687211 219 +n07681450 219 +n07683786 219 +n07695742 219 +n07682477 219 +n07686873 219 +n07684289 219 +n07683490 219 +n07682808 219 +n07690585 228 +n07684938 228 +n07690892 228 +n07685399 228 +n07693972 228 +n07690273 228 +n07691091 228 +n07687789 228 +n07685218 228 +n07694516 245 +n07694839 245 +n07694659 245 +n07690511 246 +n07690739 246 +n07690431 246 +n07688624 248 +n07688898 248 +n07689003 248 +n07690152 231 +n07693725 231 +n07690019 231 +n07692614 231 +n07691758 231 +n07691539 231 +n07691650 231 +n07693223 262 +n07693048 262 +n07691237 262 +n07687626 232 +n07687381 232 +n07687469 232 +n07871810 234 +n07684084 234 +n14580897 16 +n15062057 16 +n14698884 274 +n14696793 274 +n14765422 274 +n14844693 274 +n15019030 274 +n12167075 274 +n14974264 274 +n14858292 274 +n15075141 282 +n04033425 282 +n07556637 17 +n07566340 17 +n07560652 17 +n07881800 17 +n07938313 17 +n07800091 17 +n07570720 17 +n01464844 17 +n07556406 17 +n07840804 287 +n07802417 287 +n07925608 287 +n07844867 287 +n07569644 287 +n07568502 287 +n07809096 287 +n07843775 287 +n07755089 287 +n07882497 287 +n07573347 287 +n07923748 287 +n07572957 287 +n07731952 296 +n07804323 296 +n07804771 296 +n07803093 296 +n07803545 296 +n07732168 308 +n07732636 308 +n07804657 309 +n07804900 309 +n07809368 301 +n07841345 301 +n07827284 317 +n07827130 317 +n07822518 317 +n07827410 317 +n07816052 317 +n07812184 317 +n07810907 317 +n07858595 317 +n07811416 317 +n07824702 317 +n07818277 317 +n07819769 317 +n07920989 317 +n07822323 317 +n07815424 324 +n07814390 324 +n07826930 324 +n07814487 324 +n07814203 324 +n07583066 325 +n07822845 325 +n07767344 325 +n07823105 325 +n07828987 325 +n07582609 325 +n07825972 325 +n07823460 325 +n07823698 325 +n07822197 325 +n07856270 325 +n07767709 325 +n07829412 325 +n07829331 342 +n07829248 342 +n07857731 348 +n07857170 348 +n07838233 350 +n07836838 350 +n07826091 350 +n07830593 350 +n07840027 350 +n07832416 350 +n07832902 350 +n07835921 350 +n07835457 350 +n07831146 355 +n07831267 355 +n07834618 361 +n07834507 361 +n07595914 326 +n07858978 326 +n07859583 326 +n07860103 370 +n07860331 370 +n07860447 370 +n07816164 327 +n07818689 327 +n07821260 327 +n07820683 327 +n07816575 327 +n07817160 327 +n07817315 327 +n07819166 327 +n07817024 327 +n07818995 327 +n07816398 327 +n07820497 327 +n07932841 327 +n07820145 327 +n07819896 327 +n07816296 327 +n07821758 327 +n07933154 386 +n07935379 386 +n07935043 386 +n07847198 302 +n07844042 302 +n07848196 394 +n07847453 394 +n07847917 394 +n07847827 394 +n07678729 304 +n07860805 304 +n07860988 304 +n07883031 304 +n07623136 402 +n07861158 402 +n07627931 404 +n07628068 404 +n07565161 288 +n07565083 288 +n07561590 288 +n07561112 288 +n07560903 288 +n07562495 411 +n07564971 411 +n07938149 413 +n07938007 413 +n07884567 289 +n07924033 289 +n07919310 289 +n07891189 289 +n07922764 289 +n07929519 289 +n07921455 289 +n07933274 289 +n07927197 289 +n07925966 289 +n07891309 289 +n07936263 289 +n07883251 289 +n07914271 289 +n07911371 417 +n07901587 417 +n07891433 417 +n07891726 417 +n07886176 417 +n07886057 417 +n07907943 417 +n07921615 417 +n07886572 417 +n07902121 417 +n07886463 417 +n07912211 431 +n07911677 431 +n07914777 431 +n07930554 431 +n07930433 431 +n07930315 431 +n07915491 442 +n07915094 442 +n07913393 443 +n07916041 443 +n07914995 443 +n07916183 443 +n07914413 443 +n07917392 443 +n07917133 443 +n07915918 443 +n07930864 445 +n07931870 445 +n07932039 445 +n07930062 445 +n07906111 432 +n07907037 432 +n07902799 432 +n07904865 432 +n07905474 432 +n07902937 432 +n07904395 432 +n07905038 432 +n07902336 432 +n07905979 432 +n07903101 432 +n07904760 432 +n07903208 432 +n07904934 432 +n07906284 432 +n07902443 474 +n07903841 474 +n07903962 474 +n07903731 474 +n07903643 474 +n07907161 476 +n07906718 476 +n07907831 476 +n07907548 476 +n07907429 476 +n07906877 476 +n07906572 476 +n07893253 434 +n07892418 434 +n07893642 434 +n07899003 434 +n07896287 434 +n07896661 434 +n07893528 434 +n07896165 434 +n07900225 434 +n07893891 434 +n07900406 434 +n07895237 434 +n07898745 434 +n07896060 434 +n07899108 434 +n07892512 434 +n07897750 434 +n07892813 434 +n07894703 498 +n07894102 498 +n07894551 498 +n07900616 499 +n07900958 499 +n07900734 499 +n07900825 499 +n07901457 499 +n07898117 500 +n07895435 500 +n07899434 503 +n07899292 503 +n07894298 504 +n07895595 504 +n07894965 504 +n07897865 504 +n07895839 504 +n07895710 504 +n07898333 504 +n07897438 506 +n07895962 506 +n07896893 506 +n07899899 506 +n07895100 506 +n07898443 506 +n07899533 506 +n07894799 506 +n07897975 506 +n07899660 506 +n07894451 506 +n07910656 437 +n07909593 437 +n07911249 437 +n07910048 437 +n07908411 437 +n07910379 437 +n07908647 437 +n07886849 439 +n07887634 544 +n07887099 544 +n07889510 544 +n07887192 544 +n07887304 545 +n07888229 545 +n07887967 545 +n07889274 545 +n07887461 545 +n07888465 547 +n07890226 547 +n07890352 547 +n07889814 547 +n07890068 547 +n07890540 547 +n07888816 547 +n07924834 418 +n07924443 418 +n07924276 418 +n07920540 422 +n07920222 422 +n07920052 422 +n07920349 422 +n07919441 422 +n07731284 422 +n07919572 422 +n07920872 422 +n07921239 422 +n07934282 424 +n07933799 424 +n07929172 425 +n07927931 425 +n07928488 425 +n07928367 425 +n07927512 425 +n07928887 425 +n07928696 576 +n07928790 576 +n07936745 428 +n07935737 428 +n07936548 428 +n07801508 291 +n07805594 291 +n07800740 291 +n07801091 588 +n07802026 588 +n07801779 588 +n07801892 588 +n07557165 292 +n07560193 292 +n07651025 292 +n07560331 292 +n07557434 292 +n07556970 292 +n05399243 292 +n15089258 292 +n07560542 292 +n07573696 292 +n07613815 593 +n07643981 593 +n07596684 593 +n07600696 605 +n07597145 605 +n07597365 605 +n07599998 605 +n07596967 605 +n07620689 605 +n07642471 607 +n07643200 612 +n07642742 612 +n07643026 612 +n07642933 612 +n07643306 612 +n07606538 608 +n07599911 608 +n07607138 608 +n07608429 608 +n07598256 608 +n07606669 608 +n07607605 608 +n07601572 608 +n07609632 608 +n07605597 608 +n07607967 608 +n07609215 608 +n07841907 608 +n07606764 608 +n07605944 608 +n07601686 608 +n07605380 608 +n07605040 608 +n07601809 608 +n07605474 608 +n07842130 630 +n07842044 630 +n07600285 609 +n07600177 609 +n07842202 597 +n07579688 597 +n07580053 597 +n07588947 597 +n07842753 597 +n07583197 597 +n07879350 597 +n07880751 597 +n07868200 597 +n07863802 597 +n07875152 597 +n07824191 597 +n07878785 597 +n07865484 597 +n07866015 597 +n07868955 597 +n07861557 597 +n07580253 597 +n07877187 597 +n07866868 597 +n07880458 597 +n07648913 597 +n07580470 597 +n07866277 597 +n07591961 597 +n07868508 597 +n07871436 597 +n07864934 597 +n07874780 597 +n07879659 597 +n07878926 597 +n07937461 597 +n07842433 597 +n07862611 597 +n07863374 597 +n07866723 597 +n07867021 597 +n07867164 597 +n07726525 597 +n07624466 597 +n07842308 597 +n07877299 597 +n07880080 597 +n07862348 597 +n07873464 597 +n07869775 597 +n07879953 597 +n07625061 597 +n07843636 597 +n07696403 597 +n07580592 597 +n07655263 597 +n07868340 597 +n07619004 597 +n07879174 597 +n07867324 597 +n07843464 597 +n07877961 597 +n07873807 597 +n07867421 597 +n07654298 597 +n07878647 597 +n07611839 597 +n07842605 597 +n07871720 597 +n07869611 597 +n07876651 597 +n07880968 597 +n07875436 597 +n07806221 597 +n07841495 597 +n07823951 597 +n07712382 597 +n07591586 645 +n07590320 645 +n07587111 645 +n07592481 645 +n07590611 645 +n07591473 645 +n07590502 645 +n07591049 645 +n07592768 645 +n07585758 647 +n07588193 647 +n07586894 647 +n07588299 647 +n07584110 647 +n07587441 647 +n07587023 647 +n07586099 647 +n07588574 647 +n07584332 647 +n07586604 647 +n07586718 647 +n07585107 647 +n07585557 647 +n07585208 647 +n07584593 647 +n07585906 647 +n07584423 647 +n07587618 729 +n07587700 729 +n07588111 729 +n07704054 670 +n07704205 670 +n07871234 676 +n07870167 676 +n07863547 676 +n07700003 676 +n07619208 695 +n07619409 695 +n07874159 700 +n07874343 700 +n07874259 700 +n07874441 700 +n07874063 700 +n07867751 701 +n07867616 701 +n07808587 711 +n07807834 711 +n07806633 711 +n07807171 711 +n07807710 711 +n07807922 711 +n07808904 711 +n07806774 762 +n07807472 762 +n07841639 712 +n07841800 712 +n07695965 714 +n07712748 714 +n07712559 714 +n07697825 771 +n07697313 771 +n07696728 771 +n07696625 771 +n07698543 771 +n07698401 771 +n07865105 771 +n07696977 771 +n07698250 771 +n07698782 771 +n07697100 771 +n07696839 771 +n07697537 771 +n07712856 772 +n07712959 772 +n07579575 598 +n07579787 598 +n07609840 598 +n07581346 598 +n07611991 791 +n07613266 791 +n07611358 791 +n07612632 791 +n07612996 791 +n07613480 791 +n07611267 791 +n07612367 791 +n07611148 791 +n07611046 791 +n07617611 791 +n07612137 791 +n07616386 795 +n07631926 795 +n07615774 795 +n07616487 795 +n07614730 795 +n07614500 795 +n07614198 795 +n07616748 795 +n07616046 795 +n07617051 795 +n07615671 810 +n07615190 810 +n07614825 810 +n07615460 810 +n07617708 796 +n07618432 796 +n07582152 792 +n07734879 792 +n07581775 792 +n07582277 792 +n07730320 792 +n07581249 792 +n15089645 600 +n15089472 600 +n15093137 827 +n15093298 827 +n15090742 827 +n15091473 831 +n14919819 831 +n15091669 831 +n14810561 831 +n14973585 831 +n15091304 831 +n15091846 831 +n15092227 828 +n15090065 828 +n07576438 602 +n07577374 602 +n07575984 602 +n07574602 602 +n07574426 602 +n07593199 602 +n07576182 602 +n07574923 602 +n07574780 602 +n07575726 602 +n07575076 602 +n07578093 602 +n07576577 841 +n07577144 853 +n07576781 853 +n07574504 842 +n07577538 842 +n09335240 2 +n00027167 2 +n09334396 2 +n09283193 2 +n03892891 2 +n09287968 2 +n03059685 2 +n00003553 2 +n09300905 2 +n09452395 858 +n09260907 858 +n08630039 859 +n08630985 859 +n09386842 859 +n08593262 859 +n08620061 859 +n09379111 859 +n08649711 869 +n08658309 869 +n08568978 869 +n08512259 877 +n03823111 877 +n04170933 878 +n09433839 878 +n08578517 870 +n08640739 870 +n08574314 870 +n08552138 870 +n08645104 884 +n08505018 884 +n08659861 884 +n08659446 884 +n08673395 884 +n08583455 890 +n08598301 890 +n08651247 890 +n03120491 890 +n02802544 890 +n08614632 890 +n08674739 890 +n08569998 890 +n08494231 890 +n08677424 892 +n08616050 892 +n08518171 893 +n08573842 893 +n08521623 893 +n03368352 897 +n03417345 897 +n04454908 906 +n03902482 906 +n04610879 898 +n08579352 898 +n03963645 909 +n03417749 909 +n08524735 885 +n08537837 885 +n08551296 885 +n08628141 914 +n08633683 914 +n08539072 914 +n09249034 871 +n09263912 871 +n08583292 872 +n09443281 872 +n08547544 872 +n08664443 873 +n04602044 873 +n08580944 873 +n03581125 924 +n08517676 924 +n08598568 924 +n08584914 924 +n03899933 925 +n02776631 925 +n03322099 925 +n03935234 933 +n04052442 933 +n03159535 933 +n15102894 874 +n09242389 874 +n09382099 860 +n09282208 860 +n09392402 860 +n09393605 860 +n09445289 860 +n03030880 862 +n03946162 862 +n03485997 862 +n03882960 946 +n04322026 946 +n03474896 946 +n02764398 946 +n02907082 946 +n03948830 946 +n09205509 863 +n09472413 863 +n09443453 863 +n09309292 863 +n09366017 863 +n09366317 863 +n09376786 863 +n09348460 863 +n09246464 863 +n09433442 863 +n09454153 863 +n09409752 863 +n09403734 863 +n09331251 863 +n09437454 863 +n09238926 863 +n09283866 863 +n09217230 863 +n09305898 955 +n09288635 955 +n09308743 956 +n09308572 956 +n09194227 956 +n09289331 956 +n09468604 957 +n09344324 957 +n09335809 957 +n09435739 957 +n09215437 957 +n09259219 957 +n09217638 957 +n09304750 957 +n09206896 977 +n09405787 977 +n09233446 986 +n09290444 986 +n09457979 981 +n09245515 981 +n09376526 983 +n09415671 983 +n09448690 983 +n09230041 984 +n09398076 984 +n09453008 958 +n09303008 958 +n09359803 958 +n09302616 958 +n09409512 958 +n09399592 958 +n09199101 997 +n09230202 997 +n09283405 997 +n09326662 997 +n09193705 998 +n09218641 998 +n09472597 998 +n09421951 1000 +n09270735 1000 +n09406793 1000 +n09213434 1000 +n09256479 1011 +n09210862 1011 +n09421799 1012 +n09224725 1012 +n09396465 1001 +n09362945 1001 +n09259025 961 +n09398677 961 +n09428293 962 +n09447666 962 +n09332890 962 +n08596076 1021 +n09428628 1021 +n09361517 967 +n09265620 967 +n09303528 967 +n09436444 967 +n09274152 967 +n09213565 967 +n09269472 967 +n09206985 967 +n09228055 967 +n09466678 967 +n09415584 1031 +n09475925 1031 +n09257843 968 +n09239302 968 +n09294877 968 +n00021939 865 +n00004258 865 +n00019128 865 +n02749953 865 +n02852523 1041 +n03767112 1041 +n14977504 1041 +n03129123 1041 +n03848729 1041 +n03964744 1041 +n04362025 1041 +n04469003 1041 +n04341686 1041 +n03575240 1041 +n03873064 1041 +n03122748 1041 +n03309808 1041 +n02871147 1041 +n03364340 1041 +n14786479 1041 +n03169390 1041 +n04564698 1041 +n04339291 1041 +n00022903 1041 +n03315023 1041 +n03302121 1041 +n03076708 1041 +n04188643 1041 +n03354613 1041 +n14976871 1041 +n03670849 1041 +n02917521 1045 +n04414909 1045 +n04435180 1045 +n02725872 1045 +n04076846 1048 +n02743547 1048 +n03816849 1048 +n04007894 1048 +n03934656 1076 +n03720163 1076 +n04227144 1076 +n04260364 1076 +n03925226 1076 +n04564581 1076 +n02744844 1084 +n04042358 1084 +n03927091 1084 +n03927539 1084 +n03876519 1077 +n04485423 1077 +n03835197 1090 +n03342127 1090 +n04246271 1078 +n04321238 1078 +n04180314 1095 +n03625783 1095 +n03684611 1096 +n03514693 1096 +n03421485 1097 +n04026180 1097 +n02870526 1079 +n04599396 1079 +n06415688 1079 +n03822171 1079 +n04582205 1103 +n03727605 1103 +n03849679 1103 +n04598792 1103 +n03631922 1103 +n02933649 1109 +n03600722 1109 +n03169176 1049 +n03418618 1049 +n02727016 1049 +n03526198 1049 +n03794798 1049 +n03859608 1049 +n03968581 1116 +n03717447 1116 +n03614782 1116 +n03915900 1116 +n04431025 1116 +n03974070 1050 +n02779435 1050 +n03941231 1050 +n04399382 1050 +n03603442 1050 +n09229709 1050 +n03548402 1050 +n03944138 1050 +n04238128 1050 +n04284869 1050 +n03061211 1050 +n03219135 1050 +n09282724 1129 +n09191635 1129 +n09443641 1136 +n04186268 1136 +n03447358 1135 +n03607029 1135 +n03536348 1051 +n02857023 1051 +n04381860 1051 +n04213626 1051 +n03961939 1142 +n04394630 1142 +n03365592 1142 +n04501550 1146 +n04296562 1146 +n03159640 1146 +n04354182 1146 +n03549732 1146 +n03360300 1148 +n03892178 1148 +n02768973 1143 +n03906224 1143 +n03313333 1145 +n02990373 1145 +n02861886 1053 +n03365991 1053 +n02898711 1053 +n03109693 1053 +n13898207 1053 +n04358874 1053 +n02687821 1053 +n03135532 1053 +n03545756 1053 +n03548626 1053 +n03469175 1053 +n03688943 1053 +n02914991 1053 +n04191595 1053 +n09218315 1053 +n03074380 1053 +n02699494 1053 +n02733524 1053 +n04460130 1053 +n04471148 1053 +n03792048 1053 +n03388043 1053 +n03837869 1053 +n03321954 1053 +n02733213 1053 +n03687137 1053 +n03065424 1053 +n02839110 1053 +n03894379 1053 +n03725717 1053 +n04226464 1053 +n03071160 1053 +n03839993 1053 +n02913152 1053 +n04128413 1053 +n04008947 1053 +n03917198 1053 +n03222318 1053 +n04295881 1053 +n03241335 1053 +n02735688 1053 +n02777734 1053 +n03984381 1053 +n03216828 1053 +n03517899 1053 +n03546340 1053 +n04361095 1053 +n13897996 1053 +n03171356 1053 +n03290195 1053 +n03743902 1053 +n03297735 1053 +n04217882 1053 +n02863426 1160 +n03408054 1160 +n03463381 1161 +n03758089 1161 +n03686130 1161 +n02800497 1161 +n03379828 1162 +n03233744 1162 +n02953197 1162 +n04108822 1162 +n03865557 1162 +n04492749 1162 +n04532670 1162 +n04311004 1162 +n03122073 1162 +n03415486 1162 +n04366367 1162 +n04479939 1162 +n03956922 1172 +n03069752 1172 +n04592465 1231 +n03316406 1231 +n03212811 1231 +n03844673 1231 +n04068441 1231 +n04103094 1234 +n03387653 1234 +n04311595 1234 +n03697007 1234 +n04300358 1234 +n04032603 1242 +n02810782 1242 +n03492250 1173 +n03826186 1173 +n03547054 1173 +n04411264 1173 +n03550153 1173 +n03560430 1173 +n03254189 1173 +n03792972 1248 +n04025508 1248 +n03900979 1248 +n02769963 1248 +n03374473 1248 +n02954163 1248 +n03334291 1257 +n04549028 1257 +n03035252 1257 +n03448956 1177 +n04113765 1177 +n03975035 1177 +n04486054 1177 +n02905152 1177 +n03784896 1262 +n04104384 1262 +n02946127 1178 +n04501947 1178 +n03047052 1178 +n04206790 1178 +n03029197 1178 +n03767745 1178 +n04028581 1178 +n04220250 1178 +n04556948 1178 +n04479823 1178 +n04028764 1178 +n04312432 1178 +n03347617 1178 +n03519387 1178 +n04361260 1178 +n03098959 1178 +n02826886 1178 +n02814860 1178 +n02922292 1180 +n04251701 1180 +n04051825 1180 +n03390786 1288 +n02811936 1288 +n02699770 1188 +n04546855 1188 +n03409393 1292 +n04544325 1292 +n02755823 1292 +n03904657 1293 +n02825961 1293 +n02898369 1189 +n04326799 1189 +n02796623 1192 +n03839795 1192 +n03967942 1192 +n03659686 1192 +n03454707 1300 +n04127395 1300 +n03795580 1300 +n02788148 1300 +n02894605 1300 +n03459775 1300 +n04571566 1300 +n04047401 1300 +n03549589 1300 +n04304680 1300 +n03327234 1300 +n03160309 1300 +n03427296 1306 +n03221720 1306 +n03698815 1316 +n03985881 1316 +n04501370 1316 +n03395514 1317 +n02963821 1317 +n04153025 1317 +n03394649 1317 +n03226880 1317 +n03579538 1317 +n04239074 1317 +n04086446 1317 +n02793842 1317 +n03498662 1317 +n04329834 1317 +n04547592 1314 +n04082710 1314 +n04046974 1314 +n03000134 1314 +n03252637 1314 +n03511175 1314 +n04604644 1314 +n03930313 1314 +n04326547 1314 +n04560882 1301 +n02920369 1301 +n03262072 1302 +n03108853 1302 +n04390977 1302 +n03999160 1193 +n03542333 1193 +n04409384 1193 +n02666943 1193 +n02726681 1193 +n02763604 1193 +n03478756 1193 +n03545150 1193 +n04104500 1193 +n04081699 1193 +n03859280 1193 +n03402941 1193 +n03739518 1193 +n03542605 1193 +n03661043 1193 +n02977936 1193 +n03322570 1193 +n03953416 1193 +n04081281 1193 +n03770316 1193 +n04112654 1193 +n03839671 1193 +n03842012 1193 +n04407686 1193 +n04217546 1193 +n03449564 1193 +n03457902 1193 +n04093625 1193 +n03956157 1193 +n04018399 1193 +n02882190 1193 +n03544360 1193 +n04118635 1193 +n02734725 1193 +n04233124 1193 +n03430418 1193 +n04146050 1193 +n03007444 1193 +n04417809 1193 +n03479397 1193 +n03092166 1193 +n02993546 1193 +n04080705 1347 +n08640531 1347 +n03788498 1347 +n08560295 1347 +n04095109 1347 +n04229737 1347 +n03541696 1347 +n03790755 1347 +n03036022 1352 +n03466839 1352 +n03698723 1352 +n03333610 1353 +n03837698 1353 +n03121298 1353 +n04187547 1356 +n03416489 1356 +n02968074 1356 +n03860404 1356 +n03055857 1356 +n02859443 1402 +n04598318 1402 +n02727426 1402 +n03730334 1358 +n03210552 1358 +n04294879 1362 +n03016389 1362 +n03123809 1362 +n02793495 1362 +n03884778 1363 +n03028079 1363 +n04407435 1363 +n04210390 1363 +n04346328 1363 +n03724756 1363 +n04374735 1363 +n03788195 1363 +n03007130 1363 +n03618982 1417 +n02667576 1417 +n02984061 1417 +n02984203 1417 +n03772077 1417 +n02935658 1364 +n04111414 1364 +n02760099 1364 +n02892499 1364 +n02935891 1364 +n03199647 1364 +n02956699 1371 +n03282295 1371 +n04461437 1371 +n03005033 1371 +n03152303 1371 +n04305210 1371 +n03121431 1371 +n03558176 1373 +n03557360 1373 +n02696165 1375 +n03393017 1375 +n04258438 1377 +n02919792 1377 +n04115256 1377 +n02932400 1377 +n03257210 1377 +n03719053 1377 +n03685820 1377 +n03428090 1377 +n03686924 1377 +n04131368 1377 +n03118969 1377 +n03219483 1377 +n04052658 1377 +n02857477 1377 +n03180865 1377 +n04535524 1377 +n03002816 1377 +n04079244 1377 +n03322836 1377 +n04413969 1449 +n02907873 1449 +n03878066 1452 +n04305323 1452 +n03718458 1452 +n04354026 1457 +n03158186 1457 +n04535370 1457 +n03010915 1457 +n03718935 1464 +n04073948 1464 +n03439348 1464 +n03892557 1464 +n03877845 1464 +n03781244 1476 +n02667379 1476 +n02667478 1476 +n03165616 1382 +n03092314 1382 +n03801671 1382 +n03849814 1384 +n03801533 1384 +n03032252 1384 +n03678729 1384 +n03529860 1384 +n03097362 1387 +n04177931 1387 +n02940385 1387 +n03111041 1195 +n03064935 1195 +n03626115 1195 +n02838728 1195 +n03356858 1195 +n02902079 1195 +n04439585 1195 +n03263076 1195 +n04453037 1195 +n03942920 1195 +n03379204 1198 +n03522003 1198 +n03220692 1198 +n02782778 1198 +n02918112 1198 +n02704949 1198 +n03899768 1200 +n03109881 1200 +n02775178 1200 +n03517647 1200 +n03024064 1200 +n02894158 1200 +n04030518 1200 +n03004824 1200 +n02758134 1200 +n03120198 1200 +n03200231 1200 +n04105893 1200 +n02750070 1200 +n03285912 1200 +n03813078 1200 +n02694045 1200 +n04328946 1200 +n03443005 1200 +n03378005 1519 +n02754656 1519 +n03047941 1519 +n03382292 1519 +n04446276 1521 +n04356925 1521 +n03288500 1521 +n04363991 1521 +n04112579 1521 +n03038685 1521 +n03412058 1521 +n03718581 1521 +n02991302 1521 +n03691817 1521 +n04139395 1521 +n03238131 1521 +n02839592 1521 +n02824319 1521 +n03619890 1521 +n03660909 1521 +n04329477 1521 +n04602762 1521 +n04180229 1521 +n02710324 1521 +n03200701 1521 +n04065464 1521 +n03541091 1521 +n04058096 1521 +n02873839 1521 +n03089879 1521 +n02821627 1521 +n03040376 1521 +n03679712 1521 +n03222176 1521 +n03478907 1521 +n04061793 1521 +n02857644 1521 +n04345028 1521 +n03683708 1521 +n03062122 1521 +n04406239 1521 +n03079741 1521 +n03120778 1521 +n03982331 1521 +n02807731 1521 +n03098688 1521 +n02715513 1521 +n04558478 1532 +n03746486 1532 +n04555291 1532 +n04018667 1532 +n03529175 1537 +n03653740 1537 +n04345201 1537 +n03885535 1548 +n04324387 1548 +n04523831 1548 +n04067818 1552 +n03200539 1552 +n02952585 1553 +n03319745 1553 +n04119478 1553 +n03283221 1554 +n04064862 1554 +n03850245 1554 +n04401680 1556 +n04541987 1556 +n03090172 1556 +n04209613 1556 +n03727465 1558 +n03788601 1558 +n03465718 1558 +n03542860 1558 +n03225108 1558 +n03836062 1558 +n03165466 1558 +n03457008 1562 +n03086580 1562 +n03878211 1562 +n03303831 1562 +n03891538 1563 +n03235042 1563 +n04000592 1569 +n03075946 1569 +n02932019 1569 +n03939677 1569 +n02931148 1569 +n03696065 1569 +n02933462 1569 +n03061505 1569 +n04305572 1569 +n02960352 1569 +n02934451 1569 +n04299370 1569 +n03235180 1569 +n04414199 1523 +n02936714 1523 +n03964495 1523 +n03907227 1523 +n04539203 1523 +n03993703 1523 +n03683079 1523 +n03016737 1523 +n03003730 1523 +n04061969 1523 +n02843276 1624 +n04037220 1624 +n03550289 1624 +n03124590 1626 +n04100519 1626 +n03376159 1626 +n04262161 1631 +n02921884 1631 +n03348868 1631 +n04080454 1631 +n03404449 1631 +n02868638 1631 +n03555006 1631 +n04076713 1640 +n03732114 1640 +n03617095 1643 +n02849885 1643 +n03837606 1643 +n03425325 1643 +n03566193 1643 +n03762434 1632 +n03073694 1632 +n03343560 1632 +n03346455 1632 +n02731398 1632 +n02991847 1526 +n03148324 1526 +n04295571 1526 +n03411544 1201 +n02705201 1661 +n03854722 1661 +n04327204 1202 +n04355267 1202 +n03399677 1202 +n04527648 1202 +n03168107 1202 +n02770211 1202 +n03986704 1202 +n03721590 1203 +n03251533 1203 +n02853016 1205 +n03259505 1205 +n04409625 1205 +n03679384 1205 +n03776460 1205 +n03088389 1205 +n02726305 1205 +n04549919 1673 +n02992032 1673 +n03088580 1674 +n04613696 1674 +n03685307 1674 +n04517408 1674 +n03507241 1674 +n03354207 1674 +n03042490 1674 +n03529629 1674 +n04172107 1674 +n04584373 1684 +n04412416 1684 +n02672371 1676 +n03349892 1693 +n02932693 1693 +n02822064 1679 +n03361297 1679 +n03010473 1206 +n04360501 1206 +n03391770 1206 +n03903868 1699 +n02929289 1699 +n03373943 1699 +n02669295 1699 +n04087826 1700 +n02926591 1700 +n04589593 1700 +n03390983 1700 +n03416094 1700 +n03530642 1700 +n04492375 1700 +n03646916 1700 +n03111296 1700 +n03931765 1700 +n04587648 1700 +n03042697 1700 +n04478512 1700 +n02689144 1700 +n03454536 1700 +n03453443 1700 +n04545305 1700 +n02977619 1700 +n04387261 1700 +n02732827 1700 +n04038727 1700 +n03793186 1700 +n04136510 1700 +n02976350 1700 +n03855333 1715 +n02813399 1715 +n04297750 1715 +n04232800 1715 +n03211789 1715 +n04110178 1715 +n03986562 1715 +n04473108 1715 +n03041810 1715 +n03224603 1715 +n03224753 1715 +n03637898 1715 +n03320959 1715 +n03961711 1725 +n02790669 1725 +n02835829 1725 +n03696301 1725 +n03207630 1725 +n04459773 1725 +n03896526 1726 +n03900393 1726 +n03792526 1726 +n04340935 1208 +n03386011 1208 +n03385557 1208 +n02806088 1751 +n03610098 1751 +n03628511 1754 +n02676938 1754 +n02695627 1752 +n03723781 1752 +n03334382 1753 +n02805983 1753 +n03296328 1753 +n03878963 1753 +n02980441 1753 +n02993194 1210 +n03743016 1210 +n04178329 1210 +n02892201 1210 +n03810952 1210 +n03884926 1210 +n03220237 1766 +n03745571 1766 +n03953020 1211 +n03574555 1211 +n04511002 1211 +n03748162 1773 +n03841666 1773 +n02931417 1773 +n03506370 1773 +n03965456 1776 +n03119203 1776 +n03176763 1776 +n04202417 1776 +n03722288 1776 +n02879309 1783 +n04131208 1783 +n04200800 1783 +n02871525 1783 +n03871371 1783 +n04428634 1783 +n03606251 1783 +n04462240 1783 +n03039827 1783 +n02813544 1783 +n03436417 1783 +n03367410 1783 +n03249342 1783 +n03416640 1783 +n03173387 1783 +n04245508 1783 +n02791270 1783 +n04299215 1783 +n04443257 1783 +n03822656 1783 +n02927161 1783 +n03952576 1783 +n03089624 1783 +n03099274 1783 +n02813645 1784 +n08492461 1784 +n03461385 1784 +n03847823 1784 +n04358707 1811 +n03555426 1811 +n03457686 1811 +n04261281 1812 +n03322704 1812 +n08571898 1812 +n03822504 1777 +n02885882 1777 +n03504723 1777 +n03111690 1774 +n03856012 1774 +n03592245 1822 +n03911513 1822 +n04005630 1822 +n04447443 1054 +n04566257 1054 +n03294048 1054 +n03091374 1054 +n03563967 1054 +n03405265 1054 +n03183080 1054 +n02997391 1054 +n04377057 1054 +n03094503 1054 +n03100490 1054 +n06254669 1054 +n03176594 1827 +n02807523 1827 +n03128519 1827 +n03690938 1827 +n04186051 1827 +n03476991 1827 +n03794136 1827 +n03916031 1827 +n03475823 1827 +n02723165 1827 +n03994008 1827 +n03113152 1827 +n02808185 1827 +n03484487 1841 +n03067339 1841 +n04357314 1841 +n03640850 1841 +n02862916 1842 +n04450640 1842 +n03487444 1842 +n02683791 1842 +n03992325 1846 +n03898271 1846 +n03916470 1846 +n03071021 1846 +n04448070 1846 +n03980026 1847 +n02901793 1847 +n04447276 1849 +n04386792 1849 +n03177165 1850 +n03519081 1850 +n03714235 1850 +n03314780 1871 +n03676087 1871 +n03309687 1871 +n03724066 1871 +n03676483 1871 +n04112752 1871 +n03309110 1871 +n03308481 1871 +n02738031 1828 +n03171228 1828 +n02866578 1828 +n02703275 1828 +n03812924 1828 +n02813752 1880 +n02746365 1880 +n03647520 1880 +n02950256 1886 +n03332393 1886 +n03786715 1888 +n02801450 1888 +n03553248 1882 +n02753044 1882 +n04113641 1883 +n04206570 1883 +n04063373 1829 +n04285146 1829 +n03926148 1829 +n03811847 1829 +n03889726 1829 +n03430959 1829 +n04137444 1829 +n03414162 1829 +n03888257 1829 +n03278248 1829 +n02727825 1829 +n02761206 1829 +n03729951 1829 +n02774921 1829 +n04393095 1896 +n02979290 1896 +n03192543 1910 +n04533802 1910 +n02799897 1897 +n03135030 1897 +n03039259 1897 +n04225729 1897 +n04607035 1897 +n03132261 1897 +n02802721 1897 +n03594148 1897 +n04212282 1897 +n03446832 1897 +n04275661 1897 +n04318131 1897 +n02885338 1897 +n02885462 1897 +n03472232 1897 +n04571292 1897 +n02800213 1914 +n02811059 1914 +n02811204 1914 +n02797881 1914 +n02811350 1914 +n02799175 1914 +n03528901 1933 +n03349771 1933 +n04425804 1933 +n04164406 1933 +n04102037 1917 +n04102162 1917 +n04102618 1917 +n03558404 1917 +n03523987 1943 +n04273972 1943 +n03336282 1943 +n03132076 1919 +n04582869 1919 +n03445924 1923 +n03447075 1923 +n04399537 1923 +n03446070 1923 +n04597066 1952 +n03585073 1952 +n03244047 1953 +n04284341 1953 +n04569822 1954 +n03762332 1954 +n04028074 1954 +n03823216 1954 +n03950537 1957 +n04135024 1957 +n03524150 1925 +n03978686 1925 +n03535780 1928 +n03538037 1928 +n04509260 1928 +n03888605 1928 +n04469514 1928 +n02777292 1928 +n04524142 1966 +n03980478 1966 +n03255030 1929 +n02790996 1929 +n03289660 1898 +n02942699 1898 +n03037404 1898 +n03338821 1898 +n03667664 1898 +n02884994 1976 +n03358726 1976 +n03976467 1976 +n03974915 1976 +n04569063 1976 +n03789171 1976 +n03196062 1976 +n03987266 1976 +n04069434 1976 +n04609531 1978 +n04067658 1978 +n03817191 1978 +n04071263 1901 +n03619396 1901 +n04091097 1901 +n03351434 1901 +n04295081 1901 +n04091693 1901 +n03138669 1992 +n03139464 1992 +n04179824 1993 +n03349469 1993 +n02966687 1993 +n03650551 1993 +n03241093 1994 +n03240683 1994 +n03494706 1996 +n04247876 1996 +n03503718 1996 +n04124202 1996 +n03480719 2008 +n02900160 2008 +n04290615 1902 +n04266162 1902 +n02768226 1903 +n02778669 1903 +n04028315 1903 +n03982430 1903 +n02882647 1903 +n03716327 1903 +n03020416 1903 +n04113406 1903 +n03442756 1903 +n04540255 1903 +n03941417 1903 +n04254680 2015 +n03982232 2015 +n02882301 2015 +n04256891 2015 +n03333252 2015 +n04023962 2015 +n02839351 2015 +n03134739 2015 +n03131967 2015 +n04409515 2015 +n03445777 2015 +n04118538 2015 +n03145719 2015 +n03742019 2015 +n02802426 2015 +n03267113 2015 +n03942813 2015 +n03482877 2015 +n02799071 2015 +n04039742 2015 +n02861147 2015 +n04540053 2015 +n03598930 2016 +n06785654 2016 +n03014440 2019 +n04579986 2019 +n03901750 2019 +n02802215 2022 +n03820318 2022 +n03278914 1905 +n03782006 1905 +n03781787 1905 +n04405762 1905 +n04401088 1905 +n03857828 1905 +n03916720 1905 +n02872529 1905 +n02979186 1905 +n02988304 1905 +n04060647 1905 +n02757462 1905 +n03656957 1905 +n03963294 1905 +n04405540 1905 +n03034405 1905 +n02979074 1905 +n02995345 1905 +n03775388 1905 +n04142731 1905 +n04392985 1905 +n03181293 1905 +n03777754 1905 +n03293741 1905 +n04392526 1905 +n02705944 1905 +n02992529 2058 +n04270371 2058 +n03179910 2058 +n03902125 2058 +n03488438 2058 +n03187595 2058 +n04044498 2058 +n04405907 2064 +n04043733 2064 +n04137773 2064 +n03516996 2088 +n03046921 2088 +n04077430 2065 +n03517760 2092 +n04315948 2092 +n03584254 2094 +n04546340 2094 +n03584400 2094 +n03436182 2094 +n02942349 2068 +n04404997 2068 +n03909160 1906 +n04026053 1906 +n04173511 1906 +n04070003 1906 +n03257586 1906 +n03509608 1906 +n04171208 1906 +n04450243 1906 +n04506506 1906 +n03434188 1906 +n03567066 1906 +n02923129 1906 +n03386544 2101 +n03046802 2101 +n03757604 2101 +n03927299 2105 +n03924679 2105 +n04608923 2105 +n03316105 2105 +n03767459 2105 +n03987990 2108 +n03084834 2108 +n03422072 2112 +n02855390 2112 +n02921029 2123 +n03425769 2123 +n03871524 1908 +n02852360 1908 +n04105704 1908 +n04408871 1830 +n04241573 1830 +n04402057 1830 +n03664943 1830 +n03605915 1830 +n03543012 2132 +n03196990 2132 +n03639497 2132 +n02840134 2133 +n04594218 2133 +n02999410 2133 +n03086868 2139 +n02790823 2139 +n03886641 2140 +n02709637 2140 +n03374838 2140 +n02835412 2140 +n04440963 2140 +n03011018 2140 +n03600977 2134 +n03093792 2134 +n03228967 2149 +n04573281 2149 +n03521076 2149 +n04144241 2149 +n04571958 2149 +n04160372 2149 +n03787523 2149 +n02928299 2153 +n04333869 2153 +n03213826 2150 +n04476972 2150 +n04593866 2150 +n02788689 1831 +n04451818 1831 +n04516672 1831 +n04116512 1831 +n03816136 1831 +n03294833 1831 +n04317420 1831 +n02908217 1831 +n03532342 1831 +n04185071 1831 +n04285622 1831 +n03653220 1831 +n04369282 1831 +n03346135 1831 +n03837422 1831 +n04317833 1831 +n03039947 1831 +n04100174 1831 +n04608567 1831 +n04208427 1831 +n04282872 2163 +n03396074 2163 +n02865931 2163 +n04112147 2163 +n04459909 2163 +n03659292 2163 +n04463679 2163 +n03487090 2163 +n03138344 2188 +n04317976 2188 +n03613592 2188 +n04393808 2188 +n03903424 2188 +n04099003 2188 +n03470629 2188 +n04264628 2193 +n02771004 2193 +n04193377 2193 +n04400737 2193 +n02670683 2195 +n04367011 2195 +n03489162 2164 +n03588951 2164 +n03919430 2164 +n03418242 2164 +n03967562 2164 +n03075097 2164 +n03239726 2164 +n03154446 2164 +n04387706 2164 +n03417970 2164 +n04050066 2164 +n04299963 2164 +n03684224 2204 +n03919289 2204 +n03970156 2204 +n03941684 2204 +n03966976 2204 +n04258859 2204 +n04266486 2204 +n03481172 2204 +n03946076 2204 +n04606574 2204 +n04154565 2204 +n04489817 2204 +n04140064 2204 +n03848348 2204 +n04150980 2204 +n04208210 2204 +n02898269 2204 +n04269944 2204 +n02966545 2223 +n03430313 2223 +n03715386 2223 +n03731695 2223 +n04457910 2225 +n03947466 2225 +n02680754 2225 +n03848168 2225 +n02697675 2225 +n02886434 2225 +n03474779 2228 +n03376938 2228 +n03488188 2228 +n04016240 2246 +n04016576 2246 +n03109150 2229 +n02877962 2229 +n02951585 2229 +n03511333 2207 +n03649909 2207 +n03995856 2253 +n04089976 2253 +n03995372 2210 +n03240140 2210 +n03154073 2211 +n04503593 2211 +n02844307 2211 +n02848216 2211 +n03624400 2211 +n02866386 2258 +n03030557 2258 +n03265032 2258 +n04148054 2265 +n03623556 2265 +n02764044 2265 +n04057047 2265 +n04594828 2265 +n03020692 2265 +n03954731 2265 +n04186848 2266 +n04250473 2273 +n04016684 2273 +n04163530 2273 +n02973904 2267 +n02880842 2267 +n03973628 2267 +n03041632 2267 +n03549473 2267 +n02976123 2267 +n03890093 2267 +n03658185 2267 +n04373089 2279 +n03911658 2279 +n02811468 2268 +n03498962 2268 +n04185804 2269 +n04332074 2269 +n04127521 2269 +n03067212 2271 +n04597400 2271 +n03601638 2272 +n04247630 2272 +n04283585 2272 +n03621049 2165 +n02997607 2165 +n03403643 2165 +n04103206 2297 +n04059516 2297 +n03724417 2297 +n03621377 2297 +n04293119 2297 +n03775199 2297 +n03101517 2297 +n03101986 2297 +n03454885 2297 +n03767966 2297 +n03266371 2305 +n04578934 2305 +n02850732 2305 +n03880531 2307 +n03133878 2307 +n02999138 2307 +n04270147 2307 +n03459328 2307 +n03284981 2307 +n04309548 2307 +n03101796 2307 +n03101156 2307 +n04500060 2307 +n03846677 2313 +n04317325 2313 +n03400231 2313 +n04097760 2313 +n04596742 2313 +n04138977 2313 +n03453231 2318 +n03047799 2318 +n03984234 2298 +n03262519 2298 +n04326676 2298 +n03992703 2298 +n04282992 2331 +n03018209 2331 +n02869155 2331 +n03713436 2332 +n03317788 2332 +n03625646 2167 +n03133050 2167 +n04546194 2169 +n03729826 2169 +n03053474 2169 +n03332271 2169 +n04277352 2169 +n04321453 2169 +n04296261 2169 +n03250847 2169 +n03715669 2169 +n02949202 2342 +n04374315 2342 +n02806379 2344 +n04381724 2344 +n04491388 2344 +n02698634 2348 +n03355925 2348 +n03141823 2348 +n03274265 2170 +n04453156 2170 +n04122349 2170 +n04156140 2170 +n03475581 2170 +n02902687 2170 +n04185946 2170 +n03908714 2172 +n04310904 2172 +n03145522 2173 +n04039381 2173 +n04292414 2369 +n04409806 2369 +n02772700 2369 +n04426316 2174 +n04333129 2174 +n03012013 2374 +n04072551 2374 +n03831382 2374 +n03651843 2374 +n04156946 2177 +n03873416 2177 +n02831894 2179 +n04150153 2179 +n03258905 2179 +n04292921 2179 +n02906734 2179 +n04367480 2179 +n04111190 2180 +n04549629 2180 +n04182322 2180 +n03949317 2180 +n03616428 2180 +n02764779 2180 +n03976657 2180 +n03351979 2180 +n03091044 2180 +n04434531 2180 +n03244231 2387 +n03127408 2387 +n04472563 2387 +n04277493 2387 +n02946824 2387 +n02871824 2393 +n04319937 2393 +n04230603 2393 +n03051396 2393 +n02931836 2393 +n04267577 2393 +n03726993 2393 +n03726760 2407 +n02883004 2407 +n04610676 2407 +n03775847 2409 +n04115996 2409 +n03711999 2409 +n03382856 2409 +n03374372 2394 +n04279353 2394 +n03908204 2181 +n03906997 2181 +n03518943 2181 +n03003091 2181 +n03128248 2181 +n03652100 2181 +n02783161 2419 +n04185529 2419 +n04033901 2419 +n03388183 2419 +n03326948 2419 +n03405725 1832 +n03842156 2429 +n03200906 2429 +n04550184 2429 +n02821943 2429 +n04379243 2429 +n04379964 2429 +n04549122 2429 +n03636649 2429 +n03201035 2429 +n04555400 2429 +n02912065 2429 +n02933112 2429 +n02766320 2429 +n02822579 2429 +n03649797 2429 +n03129753 2429 +n02870880 2429 +n03290653 2429 +n03298716 2429 +n04161981 2429 +n04165409 2429 +n03015254 2429 +n03337140 2430 +n04104147 2452 +n02963302 2452 +n04529681 2452 +n03050546 2432 +n02739550 2432 +n02818832 2433 +n02831724 2458 +n03962852 2458 +n03540914 2458 +n02920083 2458 +n04491638 2458 +n03388549 2458 +n03115762 2458 +n02920259 2458 +n04503413 2458 +n04236809 2458 +n04222210 2458 +n03482252 2458 +n03799876 2458 +n03225988 2458 +n03414676 2434 +n03465426 2434 +n04381587 2434 +n03116530 2434 +n02699629 2434 +n02894337 2434 +n04301000 2434 +n03090000 2434 +n03904060 2434 +n03620967 2434 +n03850492 2434 +n04398951 2434 +n03653583 2434 +n04603729 2434 +n03428226 2434 +n03238586 2434 +n03179701 2434 +n03246933 2434 +n03063968 2434 +n04480033 2434 +n03092883 2434 +n03011741 2476 +n02789487 2476 +n03735963 2476 +n04061681 2476 +n04130143 2495 +n04247736 2495 +n03231368 2486 +n03630262 2486 +n04608329 2489 +n04164868 2489 +n03164722 2489 +n03201208 2435 +n03202354 2505 +n04067921 2505 +n03367059 2437 +n04380533 2437 +n04057981 2437 +n03237340 2441 +n03018349 2441 +n03742115 2441 +n02804414 2442 +n03131574 2442 +n02970534 2442 +n03125729 2442 +n03001627 2449 +n04447861 2449 +n04326896 2449 +n04256520 2449 +n03858418 2449 +n02828884 2449 +n03649674 2518 +n03002711 2518 +n04099969 2518 +n04373704 2518 +n04429376 2518 +n04331277 2518 +n03632729 2518 +n03518445 2518 +n02738535 2518 +n04590933 2518 +n03376595 2518 +n04576002 2518 +n03790953 2518 +n02791124 2518 +n03262932 2532 +n04062428 2532 +n03786621 2532 +n04593077 2532 +n03168217 2534 +n02946270 2534 +n03801880 2520 +n04382438 2520 +n03380724 2520 +n04177755 2521 +n03165096 2521 +n03100346 2521 +n03693474 2521 +n03015149 2549 +n04344873 2549 +n03891251 2523 +n03360622 2523 +n03920867 2523 +n04177820 2523 +n04590021 2523 +n03016953 2451 +n03518305 2451 +n02843553 1833 +n03508101 1833 +n03666591 1833 +n06791372 1833 +n03099945 1833 +n03141702 1833 +n03243218 1833 +n03626760 1833 +n03904909 1833 +n03800933 1833 +n04200537 1833 +n04198797 1833 +n03699975 1833 +n03088707 1833 +n02776205 1833 +n04294212 1833 +n03339643 1833 +n03738472 1833 +n02676261 1833 +n04474466 1833 +n03008976 1833 +n02688443 1833 +n04114844 1833 +n03929660 1833 +n03287351 1833 +n03320046 1833 +n03553019 1833 +n03175604 1833 +n02678897 1833 +n04461879 1833 +n04359589 1833 +n03851341 1833 +n04331639 1833 +n04450749 1833 +n03923918 1833 +n03574816 1833 +n03074855 1833 +n04074963 1833 +n03302790 1833 +n03075768 1833 +n04554406 1833 +n04210120 1833 +n04562262 1833 +n02855089 1833 +n04526964 1833 +n02895606 1833 +n02730265 1833 +n04226826 1833 +n03467796 1833 +n04081844 1833 +n03614007 1833 +n03269401 1833 +n02729965 1833 +n03345837 1833 +n03111899 1833 +n04069276 1833 +n02694426 1833 +n03277771 1833 +n04252331 1833 +n03525827 1833 +n03744840 1833 +n03613294 1833 +n03827536 1833 +n04263760 1833 +n03568117 1833 +n03180969 1833 +n02895438 1833 +n03565288 1833 +n02683558 1833 +n03537241 1833 +n03267972 1833 +n04228054 1833 +n03664675 1833 +n04258333 2561 +n03272239 2561 +n04041069 2561 +n03423479 2561 +n03099147 2561 +n04265275 2561 +n04330267 2561 +n03031422 2562 +n03728437 2562 +n07273802 2563 +n06793231 2563 +n06794110 2563 +n06874185 2563 +n03269203 2564 +n02981321 2564 +n03582959 2646 +n04375405 2646 +n03307792 2566 +n02988963 2566 +n03580518 2566 +n04338517 2569 +n03279153 2569 +n03614532 2569 +n04586932 2569 +n02803349 2569 +n03915437 2569 +n03254862 2653 +n03025886 2653 +n02787622 2653 +n04615226 2653 +n04132603 2653 +n03467517 2653 +n02880546 2653 +n04224842 2653 +n03698360 2660 +n03716887 2660 +n03716966 2660 +n03495258 2660 +n02676566 2664 +n03499907 2664 +n04506289 2664 +n03272010 2664 +n04536153 2665 +n04536866 2665 +n02992211 2665 +n04536335 2665 +n04536595 2665 +n04330998 2665 +n04419642 2654 +n03273551 2654 +n04376400 2654 +n03928116 2655 +n03039015 2655 +n03854065 2655 +n02672831 2655 +n03452741 2684 +n04515003 2684 +n04278353 2684 +n03738066 2684 +n02766792 2688 +n03086457 2688 +n03496296 2685 +n04278247 2685 +n03840681 2656 +n04598582 2656 +n02891788 2656 +n03854815 2656 +n03393324 2656 +n04579667 2656 +n03945615 2656 +n03609397 2656 +n03372029 2697 +n02817799 2697 +n03228016 2705 +n04222847 2705 +n02804610 2706 +n03838899 2706 +n03037709 2707 +n04141076 2707 +n02793089 2698 +n02912894 2698 +n03369276 2698 +n03394916 2698 +n04487394 2698 +n03110669 2698 +n03494537 2700 +n03494278 2700 +n03086670 2700 +n03006626 2702 +n03884397 2702 +n02775483 2702 +n03343354 2702 +n03912218 2702 +n03245724 2702 +n02803934 2657 +n02804252 2657 +n02804123 2657 +n03301568 2657 +n03483230 2658 +n02869249 2658 +n03447721 2658 +n04532831 2658 +n04311174 2658 +n03721384 2658 +n03440682 2658 +n03017168 2658 +n03612965 2658 +n03720891 2658 +n03249569 2658 +n03157348 2658 +n02869737 2741 +n02803666 2741 +n04387400 2741 +n04249415 2741 +n04410086 2741 +n04243941 2572 +n03996416 2572 +n03999992 2572 +n02769290 2572 +n04004475 2572 +n03702248 2572 +n03789946 2572 +n04252653 2572 +n02977058 2572 +n03322940 2572 +n03082979 2572 +n04613939 2572 +n03765561 2572 +n04303357 2572 +n03997484 2572 +n03087069 2572 +n04303497 2572 +n04237423 2572 +n04417180 2572 +n04064401 2572 +n02938886 2572 +n04525305 2748 +n04243546 2748 +n02760199 2748 +n03418915 2750 +n02829596 2750 +n03551395 2750 +n04024274 2750 +n03007591 2752 +n03563200 2752 +n04004767 2752 +n03250405 2752 +n03672827 2752 +n03643737 2752 +n03675235 2752 +n04419868 2752 +n03985069 2776 +n04505036 2776 +n02794664 2777 +n04595285 2777 +n03225777 2778 +n02909285 2788 +n03571942 2788 +n04184435 2753 +n03240892 2753 +n03460040 2753 +n03646296 2791 +n03766044 2791 +n03287733 2754 +n03273061 2754 +n03507963 2796 +n03596285 2796 +n02761557 2796 +n02687423 2796 +n03433877 2796 +n04309049 2798 +n03579982 2798 +n04591517 2804 +n03424630 2804 +n03193107 2804 +n03859000 2804 +n04040373 2804 +n04099175 2799 +n03321103 2799 +n02872333 2810 +n04265904 2810 +n02700064 2802 +n04587404 2802 +n04304375 2797 +n03616763 2797 +n03146846 2757 +n03500699 2757 +n03075634 2757 +n04428191 2757 +n03496892 2757 +n03210245 2818 +n03496612 2818 +n04238763 2758 +n06359193 2758 +n03528523 2758 +n04175147 2758 +n03196324 2758 +n04358117 2829 +n04603399 2829 +n03918480 2829 +n03985232 2832 +n03180011 2832 +n03832673 2833 +n03956785 2833 +n03642806 2833 +n03485407 2833 +n03914337 2760 +n04561422 2760 +n03736064 2760 +n03063485 2760 +n04477219 2760 +n04587559 2760 +n03272125 2762 +n03996145 2762 +n02911332 2762 +n03034663 2846 +n03000684 2846 +n04380916 2846 +n04121728 2846 +n02786837 2846 +n04279462 2766 +n03689157 2766 +n03604156 2767 +n03452267 2767 +n02666196 2768 +n02679257 2768 +n03483823 2768 +n04171831 2573 +n04594489 2573 +n03106898 2573 +n03510244 2573 +n02934168 2573 +n03760310 2860 +n04471632 2860 +n03666362 2860 +n03020034 2860 +n03336575 2861 +n03604843 2861 +n04402984 2861 +n03898129 2861 +n04401828 2861 +n03995265 2862 +n03307037 2862 +n03300443 2864 +n03268918 2864 +n04004990 2864 +n03995535 2864 +n03350602 2574 +n03373237 2880 +n03251932 2881 +n04573937 2881 +n04334365 2881 +n03861271 2575 +n04520784 2575 +n04332243 2576 +n02688273 2576 +n03843555 2576 +n04216634 2887 +n04398834 2887 +n03066849 2887 +n03407865 2577 +n02710201 2577 +n04040759 2577 +n03736970 2577 +n04110955 2577 +n04112430 2577 +n02969010 2577 +n03096960 2577 +n03996849 2577 +n02761392 2577 +n02677718 2577 +n03102859 2577 +n03431243 2577 +n04392764 2577 +n03339529 2577 +n04289027 2896 +n04011827 2896 +n02709367 2896 +n03446268 2896 +n04568069 2896 +n03700963 2896 +n04167346 2896 +n04021798 2896 +n03432129 2896 +n04088797 2896 +n02918595 2896 +n03532672 2896 +n04228215 2896 +n03119510 2896 +n04063154 2896 +n04371774 2896 +n04590746 2896 +n04586581 2896 +n04586421 2896 +n03189083 2896 +n04211528 2896 +n03296081 2896 +n02903204 2896 +n03150232 2896 +n04282494 2896 +n03082807 2896 +n02686227 2896 +n02962200 2896 +n03198500 2896 +n02973017 2896 +n04475411 2896 +n03431745 2896 +n04306592 2896 +n02692086 2909 +n04154152 2909 +n04020298 2913 +n04574999 2913 +n03559999 2913 +n03659809 2913 +n03566329 2913 +n03767203 2944 +n04563204 2944 +n04101701 2944 +n02836035 2944 +n02980036 2944 +n03460147 2944 +n04115144 2944 +n03334912 2944 +n04543772 2944 +n04563413 2944 +n02974003 2944 +n04289690 2944 +n03944341 2944 +n03992509 2944 +n03430551 2944 +n03244919 2944 +n03874293 2944 +n04113194 2944 +n04290507 2962 +n02833793 2962 +n03943115 2962 +n04051549 2947 +n02764505 2947 +n04154340 2947 +n03456299 2915 +n03425413 2915 +n02835724 2915 +n04354487 2915 +n03487886 2915 +n02995871 2915 +n03329302 2917 +n04102406 2917 +n02966193 2917 +n04510706 2921 +n03054901 2921 +n03393761 2982 +n03209359 2982 +n02860415 2926 +n04067472 2926 +n04211857 2926 +n02848523 2897 +n03473227 2897 +n03032811 2897 +n04111668 2897 +n03873699 2988 +n03563460 2988 +n03320421 2988 +n03208556 2990 +n04019541 2995 +n02890188 2995 +n04448361 2995 +n03397947 2995 +n03954393 2995 +n04385799 2991 +n03712111 2991 +n04519153 2900 +n04313503 2900 +n03450018 2900 +n03602883 2900 +n04072193 2900 +n04372370 2900 +n02783459 3003 +n02927887 3003 +n04438507 3005 +n03374649 3005 +n03325088 3007 +n04422875 3007 +n02727141 3007 +n03775636 3013 +n04327682 3013 +n04445952 3008 +n04027023 3008 +n03186818 3008 +n03537412 3019 +n03793850 3019 +n03222516 3019 +n02826589 3019 +n03363549 2903 +n03795758 2903 +n03469493 2903 +n03103396 2904 +n03301833 2904 +n02686379 2904 +n03432061 2905 +n03389611 2905 +n04579432 2578 +n04218564 2578 +n03743279 2578 +n03506560 2578 +n02824448 2578 +n03123917 3037 +n03028596 3037 +n03201529 3037 +n04275548 2579 +n03794056 2579 +n03680858 2579 +n04568557 2579 +n03819994 2579 +n03639077 3045 +n03352628 3045 +n04529962 2581 +n04283255 2581 +n04283096 2581 +n04112252 2581 +n03357716 2581 +n04117464 2581 +n03536122 2581 +n04592741 2581 +n03303217 2585 +n03271574 2585 +n02887079 2587 +n03176386 2587 +n02768114 2590 +n04320973 2590 +n03933933 2590 +n03934042 2590 +n02767433 2590 +n04190052 2590 +n03638883 2590 +n02783994 2590 +n04283378 2590 +n02797692 2590 +n04314914 2590 +n02887209 2590 +n03938401 2590 +n02817031 2590 +n04098513 2590 +n03057920 2590 +n03495570 2590 +n04081044 2590 +n02888569 2590 +n04386051 2590 +n02871005 2590 +n04341414 2590 +n03506184 2590 +n04161358 2590 +n04430475 2590 +n03490884 2590 +n04038440 2590 +n03495039 2590 +n02953455 3064 +n03632577 3064 +n02871439 3065 +n03719343 3065 +n03814639 3071 +n03622839 3071 +n02713003 3071 +n02768655 3071 +n02737660 3077 +n03505133 3077 +n03019685 3077 +n02741475 3077 +n04148579 3078 +n03105467 3078 +n04190376 3078 +n04220036 3081 +n04094720 3081 +n04515129 3081 +n02886599 3081 +n04476831 3081 +n02815950 3081 +n04590263 3103 +n03223686 3103 +n04318787 3105 +n03592773 3105 +n03073977 3105 +n03988170 3105 +n04360798 3113 +n02974348 3113 +n03443149 3114 +n03821518 3114 +n02864593 3114 +n03637181 3114 +n04402449 3114 +n03733131 3114 +n04436329 3114 +n04119751 3106 +n04433585 3106 +n04045644 3108 +n03437941 3108 +n04436185 3108 +n03366974 3108 +n03601840 3108 +n02970685 3083 +n03937931 3083 +n03955489 3083 +n04123740 3083 +n03002096 3083 +n02835915 3083 +n02910145 3083 +n02770830 3083 +n04325041 3134 +n03288886 3134 +n04485082 3086 +n04275175 3086 +n03704549 3086 +n03801760 3086 +n02943871 3141 +n03262809 3141 +n02759257 2591 +n04009801 2591 +n03340723 2591 +n03643253 2591 +n03656484 2591 +n03838298 3151 +n03087366 3151 +n02943241 3151 +n02709101 3151 +n03094159 3151 +n04355933 3151 +n03309465 3151 +n03333711 3151 +n03395859 3151 +n03987376 3154 +n03049782 3154 +n04403413 3154 +n04583212 3154 +n03967396 2595 +n04147495 2595 +n03733925 2595 +n04565375 2595 +n03467068 2595 +n03231160 2595 +n02708711 2595 +n03813176 2595 +n03852280 2595 +n03739693 2595 +n03575958 2595 +n02981911 2595 +n03308152 2595 +n04419073 2595 +n04089836 2595 +n04383015 2595 +n03070193 3166 +n03760944 3166 +n02670382 3166 +n04340521 3166 +n03709206 3166 +n03092656 3166 +n04403638 3185 +n03760671 3185 +n02751295 3187 +n03293863 3187 +n03852688 3189 +n04044716 3189 +n04070207 3191 +n03333129 3191 +n04068601 3191 +n02978478 3195 +n03822767 3195 +n04145863 3195 +n03715114 3195 +n03279508 3188 +n03332989 3188 +n03667829 3188 +n02841506 3202 +n03484931 3202 +n03850053 3202 +n03082280 3202 +n03692522 3202 +n03868643 3167 +n03247083 3167 +n04070415 3167 +n04053508 3167 +n02794156 3167 +n03904782 3167 +n04421872 3167 +n02751215 3167 +n03735637 3167 +n03429288 3167 +n04437953 3167 +n02710600 3167 +n02939866 3167 +n03991837 3167 +n04382880 3167 +n04141975 3167 +n04392113 3167 +n03753077 3167 +n03554460 3167 +n04180888 3167 +n04118776 3167 +n02699915 3167 +n04029734 3214 +n03736470 3214 +n04559730 3217 +n04518343 3217 +n02710429 3217 +n03424862 3217 +n04001499 3217 +n03718335 3236 +n04274985 3236 +n02753394 3218 +n03046257 3218 +n04555897 3218 +n04355338 3218 +n04438304 3218 +n03544143 3218 +n03452594 3240 +n03196217 3240 +n02694662 3240 +n04548280 3240 +n02708093 3240 +n03909406 3240 +n03145147 3240 +n03197337 3241 +n02708433 3241 +n03973839 3241 +n04607869 3241 +n04328186 3243 +n03891332 3243 +n03026907 3243 +n04528968 3220 +n03759661 3220 +n02777100 3223 +n02708555 3261 +n03277459 3261 +n03272810 3225 +n03841143 3225 +n02702989 3225 +n04273796 3225 +n03842986 3225 +n04561287 3225 +n04541320 3225 +n03708843 3225 +n04449966 3168 +n03467984 3168 +n02879718 3168 +n02880393 3168 +n02892948 3168 +n03624134 3168 +n04373894 3168 +n04346157 3168 +n04008634 3168 +n02715712 3273 +n03343853 3273 +n04177041 3273 +n02689274 3273 +n03423306 3273 +n03875955 3273 +n02950826 3273 +n02759963 3282 +n03948459 3282 +n04502851 3282 +n03732020 3282 +n03803116 3282 +n04090263 3282 +n04076284 3282 +n04171459 3288 +n02760429 3288 +n03416775 3295 +n03695857 3295 +n04171629 3295 +n02760855 3296 +n02749479 3296 +n02760658 3296 +n03701391 3296 +n04347519 3303 +n02923682 3304 +n04517211 3304 +n03607659 3304 +n04450133 3304 +n03073296 3289 +n03178674 3289 +n04086273 3289 +n03427202 3289 +n03363749 3292 +n03802007 3292 +n04250224 3293 +n04585980 3293 +n02961451 3293 +n03136369 3274 +n03687928 3274 +n03615790 3277 +n02812949 3277 +n03699591 3277 +n03158885 3277 +n04054361 3278 +n03327691 3278 +n02904640 3278 +n02987492 3278 +n04121511 3325 +n03292475 3325 +n03375575 3325 +n02916350 3280 +n02950943 3280 +n03080633 3170 +n04015908 3170 +n02745611 3172 +n03178000 3172 +n03706229 3172 +n03080497 3172 +n02841315 3173 +n04272054 3173 +n04009552 3173 +n04403925 3173 +n03443912 3340 +n04356056 3340 +n04238617 3341 +n03399761 3341 +n03795976 3341 +n03864692 3341 +n03555662 3174 +n02963503 3174 +n04376876 3174 +n04317175 3174 +n03643149 3174 +n03858183 3174 +n04364545 3174 +n04083800 3355 +n03514451 3355 +n03938037 3175 +n04056180 3175 +n03302671 2598 +n04477387 2598 +n04080833 2605 +n04251144 2605 +n03868863 2605 +n02731629 2605 +n03876231 2606 +n04287747 2606 +n02889646 2609 +n03484576 2609 +n03323703 2609 +n04162706 2609 +n03652932 2609 +n04125853 2609 +n02891188 2609 +n03803284 2609 +n02999936 2609 +n02865665 3370 +n02910353 3370 +n03627232 3370 +n03041114 3370 +n03051249 3370 +n02982599 3370 +n03940256 3370 +n03229244 3370 +n04153751 3370 +n04238321 3370 +n02928608 3370 +n04159354 3370 +n03887185 3370 +n03682487 3370 +n04431745 3370 +n03683606 3370 +n03038281 3370 +n03043958 3370 +n02960690 3370 +n03804744 3370 +n04445327 3370 +n03836451 3370 +n02881906 3379 +n02880189 3379 +n03644858 3382 +n03497352 3382 +n04095342 3383 +n03476313 3383 +n04227900 3383 +n03499354 3383 +n02903126 3383 +n02860640 3383 +n02796318 3383 +n04127249 3383 +n04197781 3387 +n03057541 3387 +n04554871 3388 +n03423719 3388 +n03503477 3414 +n03855604 3414 +n03874599 3390 +n04136800 3390 +n03645011 3390 +n03075370 3390 +n03223162 3390 +n03886762 3394 +n02915904 3394 +n03476684 3394 +n03551084 3374 +n03208938 3425 +n03250089 3425 +n04505470 2610 +n04036303 2610 +n03085013 2610 +n03928814 2610 +n03033362 2611 +n04168199 2611 +n03589513 2611 +n03098140 2611 +n04401949 2611 +n03034244 2611 +n03968293 2611 +n03275681 2611 +n03163222 2611 +n04470953 2611 +n04257986 2611 +n02715229 2611 +n02955247 2611 +n04269270 2611 +n04072960 2611 +n04364160 2611 +n04257790 2611 +n02810471 2611 +n04414675 2611 +n03048883 3432 +n04595855 3432 +n03084420 3432 +n03577090 3453 +n03778817 3453 +n04004210 3453 +n03578656 3453 +n03125057 3456 +n03033986 3456 +n03788047 3441 +n03274561 3441 +n03261776 3461 +n03759954 3461 +n03691459 3461 +n04402580 3462 +n03505667 3462 +n03087816 3463 +n02963692 3463 +n04502670 3464 +n02917377 3464 +n04390873 3464 +n04599124 3464 +n04349401 3464 +n03846772 3443 +n03204955 3443 +n04041747 3474 +n04404817 3474 +n03207305 3475 +n04142999 3475 +n04610274 3475 +n04540547 3449 +n03359285 3481 +n03651388 3481 +n03870980 2614 +n04013729 2614 +n04258138 2615 +n03773035 2615 +n03485198 3487 +n02965783 3487 +n04059947 3489 +n03861842 3489 +n02921756 2616 +n02761834 2616 +n04201064 2616 +n03343737 2616 +n04058594 2617 +n04143140 2617 +n04494204 2617 +n03211117 2617 +n03918737 2617 +n03221351 2617 +n04464615 2617 +n03793489 2617 +n02714751 2617 +n03506727 2617 +n02823124 2617 +n04484432 3498 +n03913343 3498 +n03085219 3499 +n03782190 3499 +n04152593 3499 +n03196598 3499 +n03676759 3499 +n03361380 3499 +n04588739 3499 +n03187268 3499 +n02940570 3499 +n03085602 3511 +n02769075 3511 +n02988066 2619 +n03027250 2619 +n03070059 2619 +n03525454 2619 +n04538552 2619 +n02948557 3523 +n03031152 3523 +n02947818 3525 +n03746005 3527 +n03746155 3527 +n02935017 2620 +n03851787 2620 +n03706653 2620 +n03744276 2620 +n03708036 2620 +n04063868 2620 +n02763306 2620 +n03079230 3531 +n04533946 3531 +n02988679 3537 +n02988486 3537 +n02757061 3537 +n03492542 3532 +n03209910 3532 +n03359436 3533 +n04052757 3533 +n04534359 3534 +n02979399 3534 +n04391838 3535 +n03924069 3535 +n03694639 3549 +n04178190 3549 +n03636248 2623 +n03665366 2623 +n03358172 3552 +n03640988 3552 +n02948072 3552 +n03818343 3552 +n04534895 3552 +n04384910 3552 +n03423877 3552 +n03844045 3552 +n03549897 3552 +n03370387 3552 +n04335886 3552 +n04286575 3552 +n03272383 3552 +n03590841 3555 +n03018712 3555 +n03359137 3566 +n03665924 3566 +n03911767 3566 +n03503997 3553 +n04107743 3553 +n04339879 3553 +n03318294 3553 +n04148703 3553 +n04160847 3553 +n03824713 3553 +n02852173 3553 +n04456115 3553 +n03365374 3553 +n03401129 2624 +n03442597 2624 +n03187037 2624 +n04529108 2624 +n03975232 2624 +n03668279 3586 +n03482523 3586 +n04371050 3588 +n03772584 3588 +n04164757 3588 +n03544238 3588 +n04288272 2630 +n04116098 2630 +n03066359 3593 +n02886321 3593 +n03525074 2632 +n04585745 2632 +n03281145 2632 +n03126707 2632 +n04575824 2632 +n03178430 2632 +n03733281 1835 +n03078287 1835 +n03820728 1835 +n03440216 1835 +n04080138 1835 +n03302938 1835 +n03738241 1835 +n03085915 1835 +n04141712 1835 +n04082886 1835 +n04545858 3604 +n04041544 3604 +n04400289 3604 +n04402746 3604 +n03578055 3604 +n03580845 3604 +n04404412 3615 +n04137897 3619 +n04365328 3619 +n03072201 3619 +n03681477 3605 +n04358491 3605 +n03300216 3623 +n04595028 3623 +n04008385 3609 +n03674440 3609 +n04366116 3609 +n03401279 3609 +n03957315 1836 +n04488202 1836 +n04555700 1836 +n03206908 1836 +n02893692 1836 +n03210683 1836 +n03991062 1836 +n02920658 1836 +n04074185 1836 +n03147509 1836 +n02774152 1836 +n02978881 1836 +n03256032 1836 +n02773037 1836 +n03733805 1836 +n03438257 1836 +n03875806 1836 +n03733644 1836 +n03291819 1836 +n04183329 1836 +n03935335 1836 +n02801938 1836 +n04179712 1836 +n04139859 1836 +n03994614 1836 +n02946921 1836 +n04576211 1836 +n04600312 1836 +n02839910 1836 +n02949542 1836 +n03779370 1836 +n02964843 1836 +n04533700 1836 +n02975212 1836 +n02974697 1836 +n04531098 1836 +n03233905 1836 +n04060904 1836 +n03871083 1836 +n04560292 1836 +n02883344 1836 +n03062336 3634 +n03920288 3634 +n03456024 3634 +n04176190 3634 +n04499062 3634 +n04350581 3634 +n02880940 3634 +n02978753 3634 +n04050933 3634 +n02927764 3634 +n04130257 3678 +n03775546 3678 +n03984759 3678 +n02997910 3678 +n04263257 3678 +n04023695 3678 +n04103769 3636 +n02682922 3636 +n04254120 3636 +n02754103 3636 +n03571280 3636 +n03174731 3640 +n02815749 3640 +n03629520 3640 +n03063073 3640 +n03002948 3640 +n04397452 3640 +n03216710 3640 +n03301940 3641 +n04207343 3641 +n03055418 3641 +n04083309 3641 +n02769748 3644 +n04122685 3644 +n02816656 3644 +n04134008 3644 +n02970408 3644 +n03883524 3644 +n03253886 3644 +n02870676 3644 +n04452528 3644 +n03709823 3644 +n04026417 3644 +n03235796 3644 +n03291963 3644 +n04124098 3644 +n04122825 3644 +n03993180 3644 +n04204081 3644 +n04446844 3644 +n03414029 3644 +n03619793 3644 +n03958227 3644 +n03445617 3644 +n04235860 3644 +n03469903 3644 +n03461288 3644 +n04284572 3719 +n03972524 3719 +n04544450 3719 +n03321563 3719 +n03521899 3730 +n03898395 3730 +n03372549 3646 +n04496872 3646 +n04559910 3646 +n02918831 3646 +n03676623 3646 +n04249882 3646 +n04206225 3646 +n02823750 3646 +n04119360 3646 +n03443371 3646 +n04592099 3646 +n03062245 3650 +n04131690 3650 +n03914438 3650 +n03883385 3652 +n03050864 3652 +n03482405 3652 +n02893608 3652 +n04204238 3652 +n04582349 3652 +n03764736 3656 +n02823510 3656 +n04255586 3656 +n03904433 3657 +n02946509 3657 +n04103364 3657 +n03791053 3657 +n04170037 3657 +n04509417 3657 +n04543158 3657 +n02804515 3657 +n03484083 3657 +n02766534 3657 +n02834778 3657 +n03538634 3657 +n04467099 3657 +n02959942 3657 +n04482393 3657 +n02740533 3762 +n04065272 3762 +n04464852 3762 +n04252077 3762 +n02916179 3762 +n03684823 3762 +n04335435 3762 +n03791235 3762 +n04465501 3762 +n03384352 3762 +n02740300 3773 +n02739889 3773 +n03256788 3774 +n02946348 3774 +n04520382 3774 +n04211219 3778 +n03193597 3778 +n03272562 3778 +n04389854 3778 +n04465358 3778 +n04310018 3778 +n03193260 3789 +n03193423 3789 +n03506880 3780 +n04490091 3780 +n02704792 3780 +n03389761 3780 +n03790512 3780 +n03444034 3780 +n02958343 3780 +n04252225 3780 +n03345487 3797 +n04520170 3797 +n04467665 3797 +n04474035 3797 +n03417042 3797 +n03632852 3797 +n04461696 3797 +n03256166 3797 +n04465666 3797 +n03930630 3797 +n03173929 3805 +n03796401 3805 +n03896419 3805 +n03977966 3805 +n02871314 3805 +n04466871 3800 +n03785016 3800 +n02814533 3802 +n03680512 3802 +n03777568 3802 +n03268790 3802 +n03770679 3802 +n03100240 3802 +n03079136 3802 +n02930766 3802 +n04201733 3802 +n04037443 3802 +n03498781 3802 +n04097373 3802 +n02831335 3802 +n04285965 3802 +n04166281 3802 +n03594945 3802 +n03670208 3802 +n03141065 3802 +n02701002 3802 +n04516354 3802 +n04322801 3802 +n04347119 3802 +n03870105 3802 +n03543394 3802 +n04285008 3802 +n03119396 3802 +n03122295 3764 +n02970849 3764 +n03538406 3848 +n03255899 3848 +n03599486 3848 +n03981924 3848 +n03868242 3848 +n04397027 3766 +n03648431 3766 +n04176068 3766 +n02797295 3766 +n04204347 3766 +n03490119 3766 +n02835271 3768 +n04126066 3768 +n04026813 3768 +n03792782 3768 +n02968473 3769 +n03435991 3864 +n02912557 3864 +n04297098 3864 +n03389889 3864 +n02775039 3771 +n03393912 3771 +n03895866 3771 +n02932523 3771 +n02885108 3870 +n04389521 3870 +n03828020 3871 +n04020912 3871 +n03200357 3871 +n04246855 3871 +n04065789 3659 +n02747177 3659 +n03678558 3659 +n04134523 3661 +n03935116 3661 +n02900705 3665 +n03078995 3665 +n03210372 3665 +n03619650 3665 +n04548362 3665 +n02962843 3665 +n03986355 3665 +n03214582 3665 +n03031012 3665 +n04200000 3665 +n03468821 3665 +n02755140 3665 +n03683995 3665 +n04608435 3665 +n04556533 3665 +n02774630 3665 +n03438863 3665 +n03487533 3899 +n04137217 3899 +n02773838 3899 +n04491769 3899 +n03498441 3899 +n03420345 3903 +n04570815 3903 +n02967294 3903 +n03986949 3903 +n03865371 3903 +n04518764 3903 +n02863750 3666 +n03355768 3666 +n02881193 3666 +n03633091 3666 +n02876657 3666 +n02877266 3666 +n03990474 3666 +n03950228 3666 +n02808440 3666 +n03786901 3666 +n02909870 3666 +n03241496 3666 +n03129001 3666 +n04591887 3666 +n04001265 3666 +n04493381 3666 +n03572321 3666 +n04438897 3666 +n02801525 3666 +n03784270 3666 +n02758960 3666 +n03029445 3666 +n02795169 3666 +n04388743 3666 +n03593526 3666 +n02993368 3666 +n04447028 3914 +n03350204 3914 +n04149083 3915 +n04263336 3915 +n04246060 3916 +n03983396 3916 +n04557648 3916 +n03603722 3916 +n02985963 3916 +n03449451 3916 +n03937543 3916 +n02962061 3916 +n03359566 3916 +n02823428 3916 +n03571625 3916 +n03174450 3916 +n04579056 3916 +n03140431 3916 +n04591713 3916 +n02960903 3916 +n03923379 3916 +n04579145 3945 +n04560804 3945 +n03521675 3950 +n03295246 3950 +n04422727 3950 +n02952374 3950 +n04518132 3950 +n03709363 3956 +n03595409 3956 +n04139140 3918 +n04398044 3918 +n03259401 3918 +n04516214 3918 +n04324297 3918 +n03612814 3918 +n02939185 3918 +n03915118 3918 +n04397768 3918 +n03063689 3918 +n03064250 3971 +n04132985 3971 +n04399158 3971 +n04225031 3920 +n03543603 3920 +n03379343 3920 +n03797390 3923 +n03693707 3923 +n04389430 3923 +n03063599 3984 +n04443766 3984 +n02824058 3984 +n02836174 3930 +n02843158 3930 +n04553703 3930 +n02788572 3930 +n02823335 3934 +n04592005 3934 +n03610418 3934 +n03426134 3935 +n04560113 3935 +n04173046 3935 +n02732072 3935 +n04078574 3935 +n04562935 4001 +n04049303 4001 +n02951703 3936 +n02705429 3936 +n03101664 3936 +n02815834 3936 +n04516116 3936 +n03725600 3936 +n04522168 3936 +n03133415 3936 +n03593122 3936 +n03960374 3668 +n04476259 3668 +n02982515 3668 +n03259009 3668 +n03004275 3668 +n04131929 3668 +n03416900 3668 +n03565830 3668 +n03543735 3668 +n03858085 3668 +n04255163 3668 +n02747802 3668 +n03871628 3669 +n02919414 3669 +n03167978 3669 +n02778456 4026 +n03500389 4026 +n03870672 4026 +n02782681 3671 +n02971356 3671 +n03064758 3671 +n04200258 3671 +n04253057 3671 +n03908618 3671 +n03127925 3671 +n02786331 3671 +n04589325 3671 +n03014705 3671 +n04340750 3671 +n02998003 3671 +n03710193 3671 +n02978055 3671 +n02836392 3671 +n03871724 3671 +n04452615 4040 +n04462011 4040 +n03064350 4040 +n03535024 4040 +n04477548 4040 +n02989099 4040 +n02977438 4041 +n04125257 4041 +n02976939 4041 +n04125021 4041 +n04469813 1837 +n03002341 1837 +n04214282 1837 +n04019101 1837 +n04172342 1837 +n03538179 1837 +n04524313 1837 +n04231693 1837 +n04103918 1837 +n04467307 1837 +n04196502 1837 +n03678362 1837 +n03306385 4060 +n04212165 4060 +n04468005 4060 +n02924116 4060 +n03680942 4060 +n03394272 4071 +n03896233 4071 +n04349306 4071 +n03711044 4071 +n03394480 4071 +n03078802 4075 +n02917067 4075 +n04487081 4072 +n03769881 4072 +n04146614 4072 +n04310157 4063 +n02918964 4063 +n04099429 4063 +n03764276 4063 +n03773504 4063 +n03125870 4063 +n04235291 4063 +n03478589 4087 +n04389033 4087 +n03886053 4087 +n03919096 4087 +n03549199 4087 +n02686568 4089 +n04530566 4089 +n04264914 4089 +n03547229 4089 +n03510583 4096 +n04308084 4096 +n03666917 4096 +n03491032 4100 +n03439814 4100 +n03512147 4100 +n04552348 4100 +n02691156 4100 +n02759387 4100 +n02867715 4107 +n02704645 4107 +n04012084 4107 +n02690373 4107 +n02842573 4107 +n03365231 4107 +n03595860 4107 +n03335030 4107 +n04308273 4107 +n04160586 4107 +n02686121 4112 +n04583620 4112 +n03604311 4115 +n03596543 4115 +n04308397 4116 +n03577672 4116 +n02692877 4102 +n02850950 4102 +n02782093 4102 +n03541923 4102 +n02858304 4097 +n04476116 4097 +n04610013 4097 +n04194289 4097 +n04128837 4097 +n02792409 4097 +n03662601 4129 +n03977592 4129 +n03447447 4129 +n04158807 4129 +n02792552 4129 +n04095210 4129 +n04495843 4129 +n04024983 4129 +n03939178 4129 +n04244997 4129 +n03329663 4129 +n04409128 4129 +n02947660 4129 +n03344393 4129 +n03790230 4129 +n03236423 4139 +n03981566 4139 +n03545470 4139 +n04229480 4144 +n02951358 4144 +n03199901 4144 +n04037964 4144 +n03105306 4144 +n04612504 4144 +n03436891 4144 +n03602081 4144 +n04115456 4144 +n03609235 4154 +n03861430 4154 +n03254374 4154 +n04038231 4156 +n04038338 4156 +n04273569 4149 +n03859170 4149 +n02932891 4149 +n03552749 4149 +n04197110 4132 +n04606251 4132 +n03896103 4132 +n03947888 4132 +n03668488 4132 +n03541269 4132 +n04309348 4132 +n02965300 4132 +n04224543 4132 +n04552696 4132 +n03673027 4173 +n03698604 4181 +n02965216 4181 +n03141327 4181 +n03874138 4177 +n04317063 4177 +n02878222 4178 +n03095699 4178 +n02784124 4178 +n03845190 4178 +n04347754 4180 +n03466493 4180 +n03397266 4180 +n02812201 4180 +n03466600 4180 +n02687172 4180 +n03718212 4180 +n03180504 4180 +n02755529 4191 +n03811295 4191 +n04612373 4133 +n03045228 4133 +n03327133 4133 +n04242408 4133 +n03612010 4133 +n03186285 4133 +n04128499 4133 +n02793199 4133 +n04147183 4133 +n04587327 4133 +n04483307 4207 +n02981792 4207 +n02982416 4207 +n04266014 4098 +n04264765 4098 +n03218198 4090 +n02860847 4090 +n02861022 4090 +n04336792 4068 +n03122202 4068 +n06271778 1838 +n06255081 1838 +n06263609 1838 +n06276697 4221 +n06272290 4221 +n06276501 4221 +n06277280 4224 +n06281040 4224 +n06277135 4224 +n06278338 4227 +n06278475 4227 +n06274760 4225 +n06272803 4225 +n06272612 4225 +n06263369 4223 +n06266417 4223 +n06595351 4235 +n06267145 4235 +n06596607 4237 +n06596727 4237 +n06596364 4237 +n06596474 4237 +n06267893 4238 +n06267564 4238 +n06267655 4238 +n06266633 4236 +n06267991 4236 +n03938244 1055 +n03872495 1055 +n04135315 4249 +n02823964 4249 +n03408444 4249 +n02967626 4249 +n04053677 1056 +n04151940 1056 +n04453910 1056 +n03380867 1056 +n04014297 1056 +n03045698 1056 +n04605726 1056 +n04513827 1056 +n03050026 1056 +n03724870 1056 +n03341153 1056 +n03366823 1056 +n03058107 1056 +n02952237 1056 +n03357376 1056 +n03221059 1056 +n03376279 1056 +n03956623 1056 +n03261603 1056 +n02944459 4255 +n04201297 4255 +n02954938 4256 +n03717622 4256 +n03661340 4256 +n04041243 4275 +n02877765 4275 +n03825788 4275 +n03047690 4257 +n04199027 4257 +n02735538 4257 +n02872752 4257 +n03361550 4257 +n04241394 4257 +n03865949 4257 +n04122578 4282 +n04239786 4282 +n03027625 4282 +n04124370 4282 +n04272389 4282 +n02904927 4282 +n04593524 4282 +n04545748 4282 +n02855701 4282 +n02713364 4282 +n03041449 4282 +n03411079 4282 +n03680355 4282 +n04120489 4282 +n03868406 4282 +n02882894 4282 +n03967270 4282 +n04022332 4282 +n04133789 4282 +n03025250 4282 +n04027706 4306 +n04386664 4306 +n03364008 4306 +n03297103 4306 +n03600475 4284 +n02925666 4284 +n04228581 4284 +n03521544 4284 +n04089666 4284 +n04116294 4284 +n03516844 4284 +n04542715 4284 +n03124043 4284 +n03798061 4286 +n02873733 4286 +n03067518 4258 +n03046133 4258 +n04554211 4258 +n04444749 4258 +n03797896 4258 +n04192858 4258 +n02888270 4258 +n04151581 4258 +n04187233 4258 +n02826068 4258 +n04181718 4258 +n04191943 4258 +n04281375 4258 +n04416005 4258 +n04105068 4258 +n03314608 4258 +n03530910 4258 +n04187061 4258 +n02955065 4258 +n03725035 4258 +n03315644 4258 +n03142679 4258 +n02937958 4258 +n02739668 4258 +n02840245 4258 +n02840619 4258 +n03546766 4258 +n02851099 4258 +n03673767 4258 +n03959701 4328 +n03539433 4352 +n02740764 4352 +n02895154 4354 +n03513376 4354 +n02950632 4354 +n03623338 4354 +n03929855 4356 +n04130907 4356 +n04589890 4330 +n03347037 4330 +n04590553 4330 +n03788365 4330 +n03637318 4333 +n03889871 4333 +n03652729 4334 +n02825657 4334 +n04172776 4334 +n02843684 4334 +n02951843 4334 +n03610524 4334 +n02763901 4371 +n04507155 4371 +n03415252 4371 +n03409591 4337 +n04357121 4337 +n03718789 4337 +n03220513 4337 +n03522100 4337 +n04435653 4337 +n03546235 4337 +n04523525 4337 +n04234887 4337 +n03413684 4337 +n04417672 4337 +n03148727 4379 +n03435593 4379 +n03847471 4379 +n02796207 4383 +n04087709 4383 +n03527444 4340 +n04141327 4340 +n04207763 4340 +n03548086 4341 +n04423845 4341 +n03213538 4341 +n03657121 4341 +n03424325 4342 +n03314378 4342 +n04229816 4400 +n02983189 4400 +n02862048 4346 +n04192698 4346 +n03000247 4403 +n02916936 4403 +n03112719 4403 +n03146219 4403 +n02933340 4349 +n04045255 4349 +n02873520 4349 +n04589190 4350 +n03592669 4350 +n03151077 4350 +n04211356 4350 +n04525584 4412 +n04590129 4412 +n04102285 4412 +n04418357 4414 +n04209239 4414 +n02925107 4351 +n02890513 4351 +n03436549 4260 +n03291741 4260 +n02992368 4260 +n07248320 4260 +n03590306 4260 +n03958752 4260 +n04207151 4262 +n03885293 4262 +n03654576 4262 +n02767665 4262 +n03114379 4262 +n02785648 4262 +n02876084 4262 +n04240752 4262 +n02820210 4262 +n04236377 4262 +n02851939 4262 +n03309356 4262 +n04231272 4262 +n04162433 4262 +n02786058 4434 +n04369025 4434 +n02979836 4434 +n03267821 4434 +n04033995 4437 +n02683323 4437 +n02849154 4437 +n02822220 4437 +n03731483 4437 +n03898633 4447 +n03266749 4447 +n03128427 4447 +n03123553 4450 +n04034262 4450 +n04046400 4438 +n03688405 4438 +n04118021 4265 +n03223299 4265 +n03727837 4265 +n04144539 4459 +n04183217 4459 +n03998194 4459 +n02904233 4459 +n04297847 4459 +n04066270 4459 +n02908773 4459 +n03353951 4266 +n03445326 4266 +n04528079 4266 +n03875218 4266 +n03805725 4266 +n03437430 4266 +n03115897 4266 +n03284743 4266 +n04525417 4266 +n03342015 4472 +n03284886 4472 +n03285578 4472 +n03844233 4472 +n04557308 4472 +n03646020 4482 +n04581102 4482 +n03261019 4268 +n03973402 4268 +n03642444 4268 +n04450994 4268 +n04084889 4268 +n04412097 4268 +n03337383 4270 +n03729308 4270 +n03970546 1057 +n03802393 1057 +n04395024 1057 +n04525038 1057 +n02809105 1057 +n03615406 1057 +n02828427 1057 +n04123567 1057 +n03188725 1057 +n04539794 1057 +n03253796 1057 +n03013850 1057 +n03115400 1057 +n04459610 1057 +n03132666 1057 +n03885194 1057 +n03019938 1057 +n03326795 1057 +n03115180 1057 +n04525191 1057 +n04138261 1057 +n03625355 1057 +n04137355 1057 +n04003856 1057 +n03356982 1057 +n04568841 1057 +n03409297 1057 +n02944579 1057 +n04605163 1057 +n02977330 1057 +n04395106 1057 +n03779128 1057 +n02904803 1057 +n04524941 1057 +n04198453 1057 +n02878425 1057 +n03703862 1057 +n03819595 1057 +n03877351 1057 +n04613015 1057 +n03914831 1057 +n03932670 1057 +n03785237 1057 +n04414476 1057 +n04056932 1057 +n02675219 1057 +n03106722 1057 +n03917814 1057 +n03016868 1057 +n02922798 1057 +n04432662 1057 +n02802990 1057 +n03631177 1057 +n04189282 1057 +n03435743 1057 +n03983612 1057 +n03175189 1057 +n03357267 1057 +n04184316 1057 +n02942460 1057 +n03836906 1057 +n03233123 1057 +n03430091 1057 +n03855214 1057 +n03386726 1057 +n03437741 1057 +n04599235 1057 +n04350458 1057 +n04383839 1057 +n03653110 1057 +n04502502 1057 +n03854421 1057 +n02952109 1057 +n03298858 1057 +n03160740 1057 +n03843438 1057 +n04393549 1057 +n02903852 1057 +n03947798 1057 +n03529444 1057 +n04482297 4514 +n03227317 4514 +n03595523 4514 +n03429914 4530 +n04496614 4530 +n03016609 4530 +n03485794 4534 +n03463666 4534 +n03258330 4534 +n03207743 4534 +n04459362 4534 +n02786198 4534 +n03471190 4534 +n02834397 4534 +n04127904 4534 +n03897943 4534 +n03490006 4583 +n03887697 4583 +n03207835 4583 +n03381776 4587 +n03383099 4587 +n04278447 4587 +n03505383 4587 +n04455652 4587 +n03712337 4587 +n02782602 4587 +n03598151 4592 +n03775747 4592 +n03410571 4592 +n03696568 4592 +n04307767 4592 +n03645577 4592 +n03358380 4588 +n04208065 4588 +n03809603 4539 +n02820556 4539 +n03703730 4545 +n03938522 4545 +n04045397 1059 +n03663531 1059 +n03662719 4612 +n03703945 4612 +n03662887 4612 +n04326084 1060 +n02897820 1060 +n14943580 1060 +n14785065 1060 +n15074568 1060 +n14820180 1060 +n04035912 1060 +n03766935 4616 +n04313628 4616 +n03530511 4616 +n03460297 4616 +n03149686 4616 +n03455488 4616 +n03344642 4617 +n03796522 4617 +n03043693 4617 +n02681392 4617 +n04339638 4618 +n15102455 4618 +n04234455 4633 +n03341297 4633 +n04453390 4633 +n14908027 4620 +n14976759 4620 +n03111177 1061 +n03282401 1061 +n03451798 1061 +n03292603 1061 +n03815149 1061 +n03723267 1061 +n02892304 1061 +n07621618 1061 +n02732572 1061 +n03178782 1061 +n02681518 1061 +n03397087 1061 +n03635108 1061 +n04395651 4649 +n03762602 4649 +n03282591 4649 +n06883725 4649 +n03516367 4649 +n04682462 4649 +n03354903 4655 +n02788021 4655 +n04458633 4655 +n03140292 4655 +n03362890 4655 +n05244934 4658 +n11487732 4658 +n03597469 4650 +n03397532 4650 +n03649161 4650 +n03914106 4650 +n02787435 4650 +n03030262 4650 +n02685082 4650 +n02887970 4666 +n02852043 4666 +n03909020 4666 +n03814906 4666 +n03436075 1062 +n03899328 1062 +n04096066 1062 +n03895293 1062 +n04215402 4678 +n04461570 4678 +n03904183 4678 +n03519981 4679 +n02969323 4679 +n04426618 4679 +n04466613 4679 +n03215508 4684 +n03306610 4684 +n02744323 4684 +n02762508 4689 +n02758863 4689 +n04335209 4686 +n04334599 4686 +n03948242 4687 +n03539678 4687 +n02680512 4680 +n03089014 4680 +n03895585 4680 +n04493505 4698 +n04244379 4698 +n04250850 4698 +n04562496 4698 +n02984469 4700 +n02795528 4700 +n03944672 4700 +n03533014 4700 +n04385536 4706 +n03231912 4706 +n03147280 4709 +n04257684 4709 +n04497962 4699 +n04298661 4699 +n03415749 4699 +n02981024 4712 +n04048441 4712 +n04391569 1063 +n02784218 1063 +n03572107 4717 +n02680337 4717 +n03957420 4720 +n02992795 4720 +n03506028 4718 +n03438071 4718 +n04440749 4718 +n02739427 4718 +n04040247 4725 +n02971167 4725 +n04381994 1064 +n04087432 1064 +n03153375 4729 +n03438661 4729 +n03527149 4729 +n03963198 4729 +n04284002 4731 +n04380346 4731 +n03383948 4731 +n04284438 4731 +n04263502 4735 +n04398688 4735 +n04350769 4735 +n04597913 4735 +n03557270 4735 +n04381073 4735 +n03180384 4735 +n02976249 4736 +n02928049 4736 +n04307986 4736 +n04380255 4737 +n02973805 4737 +n02687992 1065 +n04406817 1065 +n02693246 1065 +n02692232 1065 +n03745146 1065 +n04329190 1065 +n04306080 1065 +n04551055 4756 +n03452449 4756 +n03131669 4756 +n03768916 1066 +n03214253 1066 +n03587205 4762 +n03406966 4762 +n03093574 1067 +n03672352 1067 +n03051540 4765 +n02729837 4765 +n03655720 4767 +n03456186 4767 +n02855925 4767 +n03825080 4767 +n04015204 4767 +n03859495 4767 +n03815482 4767 +n03625943 4767 +n03692379 4767 +n02728440 4767 +n03068998 4767 +n03763968 4767 +n03502509 4767 +n03877472 4767 +n03419014 4767 +n02742322 4767 +n04596852 4767 +n03863108 4767 +n03441112 4767 +n02671780 4767 +n02846141 4767 +n03381126 4767 +n02756098 4767 +n04059157 4767 +n02814774 4767 +n03746330 4767 +n04335693 4767 +n04241249 4767 +n04194127 4773 +n03863262 4773 +n04001845 4773 +n02738859 4773 +n03386870 4773 +n03216402 4773 +n02730930 4773 +n04207903 4773 +n03121897 4773 +n03015478 4773 +n03268645 4773 +n04266375 4773 +n03623198 4773 +n03450516 4774 +n04532106 4810 +n03010795 4810 +n02669723 4810 +n02811719 4780 +n03324928 4780 +n03239259 4780 +n03615563 4780 +n03513137 4781 +n03531281 4781 +n04498389 4781 +n03497657 4781 +n02954340 4781 +n03124474 4781 +n04432203 4781 +n03379051 4818 +n03492922 4818 +n03127747 4818 +n04356595 4821 +n03404360 4821 +n03124170 4821 +n02817516 4821 +n02859184 4821 +n04248507 4821 +n03325941 4821 +n02987379 4821 +n04259630 4821 +n04482177 4821 +n02818135 4821 +n03984643 4821 +n02869837 4821 +n03950899 4821 +n02881757 4821 +n03766322 4821 +n03046029 4843 +n03937835 4843 +n02799323 4822 +n03103563 4822 +n04209133 4822 +n03610682 4822 +n02776825 4822 +n03331077 4822 +n04387095 4822 +n02831237 4822 +n04232153 4822 +n03049924 4822 +n04228693 4822 +n04556408 4822 +n02807133 4822 +n03787032 4822 +n04612026 4854 +n02816768 4854 +n03502331 4783 +n04143897 4783 +n04104770 4783 +n03188531 4783 +n04605572 4783 +n04097866 4783 +n04574067 4783 +n03655072 4783 +n04230808 4783 +n04508163 4783 +n04172904 4783 +n04531873 4783 +n04197391 4783 +n03863923 4783 +n03540090 4783 +n02922578 4783 +n04488530 4783 +n04489008 4783 +n04332580 4783 +n03404149 4783 +n03816005 4783 +n04370774 4783 +n03657511 4783 +n04371563 4783 +n03487642 4783 +n04046277 4783 +n04350905 4783 +n04370048 4783 +n03450734 4783 +n03314884 4862 +n03826039 4862 +n02998841 4862 +n03719743 4863 +n03797182 4863 +n03505504 4863 +n04495698 4863 +n03325584 4863 +n04325704 4863 +n03520493 4896 +n03615655 4896 +n03237992 4867 +n03617480 4867 +n02667093 4867 +n02807616 4867 +n03410938 4869 +n04269822 4869 +n03866082 4870 +n03454442 4870 +n03770439 4870 +n03617312 4870 +n03732458 4870 +n02780815 4870 +n03205669 4870 +n04136333 4870 +n03534580 4870 +n03920737 4871 +n02892767 4871 +n03387323 4871 +n04223299 4871 +n03421324 4871 +n03132776 4871 +n04508949 4871 +n02863014 4871 +n02944146 4871 +n04514241 4871 +n03013580 4871 +n04508489 4871 +n03112869 4919 +n03885788 4919 +n04103665 4919 +n03673450 4923 +n03688192 4923 +n02930214 4923 +n04509171 4932 +n03824381 4932 +n02854739 4928 +n04426427 4928 +n02837887 4928 +n02901114 4928 +n03885028 4928 +n03234164 4928 +n04602956 4874 +n03629231 4874 +n03595614 4874 +n03163381 4874 +n03978966 4874 +n03057021 4875 +n03045337 4875 +n04252560 4875 +n04363777 4948 +n03254046 4948 +n04187970 4948 +n03398228 4948 +n03630383 4948 +n03456665 4948 +n03589791 4948 +n04049405 4948 +n02957008 4948 +n04123448 4948 +n03404251 4948 +n03751269 4957 +n04222307 4957 +n02867966 4957 +n03902756 4957 +n04368496 4957 +n03228254 4957 +n02864504 4957 +n03891051 4957 +n03844815 4958 +n04479046 4958 +n03770954 4961 +n04122492 4961 +n03980874 4949 +n04445154 4949 +n04445040 4949 +n03607923 4949 +n04173907 4949 +n04497570 4949 +n04186455 4949 +n02936402 4949 +n04205318 4879 +n03877674 4879 +n04370288 4879 +n04132158 4879 +n02896442 4879 +n03019434 4879 +n04233715 4879 +n03600285 4879 +n03903733 4879 +n03688605 4879 +n03594734 4879 +n03107488 4879 +n03660124 4879 +n04337287 4879 +n02825442 4879 +n02910864 4879 +n03543112 4982 +n02831595 4982 +n03653833 4982 +n03815615 4882 +n03128085 4882 +n02865351 5001 +n04591157 5001 +n02883205 5001 +n02847631 5001 +n03710721 4885 +n04371430 4885 +n02837789 4885 +n03226538 4888 +n03943920 4888 +n04222470 4888 +n03885669 4888 +n02925519 4888 +n04427715 5014 +n04504141 5014 +n04502197 4889 +n02963159 4889 +n04370456 4889 +n04021028 4889 +n04453666 4785 +n03464053 4785 +n02944075 4785 +n03236735 4785 +n02861387 5021 +n02854926 5021 +n03480579 5021 +n03062015 5024 +n04136161 5024 +n02936570 5024 +n04355511 5024 +n03013438 5024 +n04334105 5024 +n03450230 5024 +n03604400 5024 +n03205574 5024 +n02898585 5034 +n04397645 5034 +n02781121 5034 +n03429682 4787 +n03775071 4787 +n03616979 4787 +n02827606 4788 +n03405595 4788 +n03781683 5043 +n03527565 5043 +n02972397 5043 +n03540267 4790 +n04434932 5048 +n04254777 5048 +n04323819 5048 +n03885904 5049 +n03710637 5049 +n02752496 5050 +n04378956 5050 +n03622931 5050 +n02736798 5050 +n03836976 5051 +n03026506 5051 +n03384891 4791 +n03289985 4791 +n03859958 4791 +n02726017 4791 +n03113657 4791 +n03320519 4791 +n03113835 4791 +n03398153 4791 +n04285803 4791 +n02669534 4791 +n03206718 4791 +n03476083 4791 +n03201776 5060 +n02780704 5060 +n03201638 5060 +n03239054 5060 +n02683454 5071 +n04459018 5071 +n04584207 5071 +n03237416 4794 +n02887489 4794 +n02752615 4794 +n03528263 4768 +n03251766 4768 +n04517823 5082 +n03584829 5082 +n04488857 5082 +n03150511 5082 +n04580493 5082 +n04179913 5082 +n04174101 5082 +n03620052 5082 +n03534776 5082 +n04475631 5085 +n04309833 5085 +n03207941 5088 +n04070727 5088 +n04554684 5088 +n03102654 5096 +n03273913 5096 +n03557590 5099 +n03170635 5099 +n04442312 5091 +n03761084 5091 +n04442441 5091 +n03063338 5091 +n03543254 5091 +n04542943 5091 +n03212114 5091 +n03297495 5091 +n04330340 5091 +n03862676 5091 +n03378174 5091 +n03557692 5091 +n03102371 5110 +n03273740 5110 +n03425595 5110 +n04003241 5110 +n02905036 5111 +n04111531 5111 +n03259280 5111 +n03425241 5111 +n03483316 5083 +n03050655 5083 +n04277826 5123 +n04496726 5123 +n04607242 5123 +n02808304 4766 +n03219010 4766 +n04499446 4766 +n02821030 4766 +n03938725 5130 +n04188179 5130 +n04439712 1068 +n03971218 1068 +n03223553 1068 +n02856463 1068 +n03250279 1068 +n03882058 1068 +n03635668 1068 +n02846511 1068 +n04251791 5136 +n04189816 5136 +n02731900 5136 +n04225987 5136 +n04214046 5136 +n04149813 5136 +n04543996 5138 +n03502200 5138 +n03005285 1069 +n03969259 1069 +n04254009 1069 +n04446521 5150 +n04208936 5150 +n04559451 5150 +n03371875 5152 +n03993053 5152 +n04108268 1071 +n03106110 1071 +n03644378 5157 +n02919890 5157 +n04290079 5157 +n03107046 5157 +n04426788 5158 +n02874537 5158 +n04581829 5158 +n03641569 5158 +n03367545 5163 +n04598965 5163 +n04605321 5163 +n00004475 1042 +n00006484 1042 +n12739332 5170 +n00017222 5170 +n00015388 5170 +n01326291 5170 +n11537327 5170 +n00007846 5170 +n12992868 5170 +n00005787 5170 +n12172906 5173 +n13083586 5173 +n13123431 5173 +n11536673 5173 +n11552806 5173 +n13083023 5173 +n13100156 5173 +n12476510 5181 +n11545524 5181 +n11552386 5181 +n13121544 5181 +n12205694 5181 +n13100677 5181 +n13103136 5181 +n13085113 5181 +n13084834 5181 +n13134302 5181 +n13084184 5181 +n12477163 5187 +n12477583 5187 +n12477747 5187 +n12480895 5187 +n12479537 5187 +n12481458 5187 +n11547562 5188 +n11545714 5188 +n13221529 5204 +n13220122 5204 +n13223265 5206 +n13223588 5208 +n13223710 5208 +n12953206 5205 +n13194572 5205 +n13205058 5205 +n12961879 5205 +n12953484 5205 +n13186654 5205 +n13197274 5205 +n13173882 5205 +n13229543 5205 +n13192625 5205 +n13185269 5205 +n13193642 5205 +n13207335 5205 +n13183056 5205 +n13200651 5205 +n13195341 5205 +n13206817 5205 +n13199970 5205 +n12957924 5205 +n13198914 5205 +n13199717 5205 +n13215586 5216 +n13190747 5216 +n13193856 5222 +n13194036 5222 +n11665372 5189 +n11596108 5189 +n12694486 5236 +n11666854 5236 +n11669921 5236 +n11672400 5236 +n12606438 5240 +n12799776 5240 +n11736694 5240 +n12008487 5240 +n11955896 5240 +n12879527 5240 +n12884260 5240 +n12034141 5240 +n12290748 5240 +n12026476 5240 +n12833149 5240 +n11892817 5240 +n12914923 5240 +n11969607 5240 +n11794024 5240 +n12026018 5240 +n11672269 5240 +n12830222 5240 +n11811473 5240 +n12022054 5240 +n11971406 5240 +n11826198 5240 +n12950314 5240 +n11857875 5240 +n11988596 5240 +n11939699 5240 +n11915214 5240 +n11821184 5240 +n12293723 5240 +n11814584 5240 +n11725015 5240 +n12890265 5240 +n11733312 5240 +n11859472 5240 +n11971248 5240 +n11888800 5240 +n11971927 5240 +n12898774 5240 +n11810358 5240 +n11904109 5240 +n11943407 5240 +n11978233 5240 +n12683407 5240 +n12950126 5240 +n11726707 5240 +n11813077 5240 +n11889619 5240 +n11905749 5240 +n11812910 5240 +n11900569 5240 +n12020184 5240 +n11960245 5240 +n11859737 5240 +n12909421 5240 +n12041446 5240 +n12909917 5240 +n11992806 5240 +n11807979 5240 +n11925303 5240 +n11971783 5240 +n11939491 5240 +n11918473 5240 +n11989869 5240 +n11727091 5240 +n11793779 5240 +n11891175 5240 +n11792341 5240 +n11839568 5240 +n11943660 5240 +n11947802 5240 +n12475242 5240 +n11815491 5240 +n12480456 5240 +n11839823 5240 +n11732567 5240 +n12475035 5240 +n12360108 5240 +n12833985 5240 +n11941924 5240 +n11883328 5240 +n11719286 5240 +n11736851 5240 +n11887119 5240 +n12001707 5240 +n11950345 5240 +n11892637 5240 +n11805956 5240 +n11892029 5240 +n11806219 5240 +n12008252 5240 +n11918286 5240 +n11962272 5240 +n12093600 5240 +n12836862 5240 +n12093329 5240 +n11733054 5240 +n12020507 5240 +n11931918 5240 +n11958080 5240 +n12877838 5240 +n11812094 5260 +n11811706 5260 +n11923174 5268 +n12023726 5268 +n12023407 5268 +n11923637 5268 +n11990313 5268 +n11915899 5268 +n12030908 5268 +n12015221 5268 +n11990167 5268 +n11981192 5349 +n11980318 5349 +n11972759 5349 +n11921395 5349 +n12294124 5270 +n12295796 5270 +n12294723 5270 +n12294331 5270 +n12294871 5270 +n12296432 5270 +n12295033 5270 +n11726269 5272 +n11725821 5272 +n11725973 5272 +n12891305 5273 +n12891643 5273 +n11978713 5283 +n11979527 5283 +n11978961 5283 +n11979715 5283 +n12683571 5284 +n12683791 5284 +n11901759 5291 +n11908549 5291 +n11901294 5291 +n11903671 5291 +n11901977 5291 +n11902389 5291 +n11908846 5291 +n11901597 5291 +n11905392 5291 +n11902200 5291 +n11906917 5291 +n12044467 5296 +n12052787 5296 +n12056217 5296 +n12075830 5296 +n12055516 5296 +n12083113 5296 +n12047884 5296 +n12048056 5296 +n12080820 5296 +n12070381 5296 +n12061380 5296 +n12080395 5296 +n12061614 5296 +n12074408 5296 +n12070583 5296 +n12071744 5296 +n12049282 5296 +n12047345 5296 +n12064389 5296 +n12075010 5296 +n12052447 5296 +n12053405 5296 +n12050533 5296 +n12077944 5296 +n12086539 5296 +n12064591 5296 +n12058822 5296 +n12046028 5296 +n12083591 5296 +n12073991 5296 +n12043444 5296 +n12086012 5296 +n12073554 5296 +n12046815 5296 +n12063639 5296 +n12058630 5296 +n12084890 5296 +n12070016 5296 +n12076223 5296 +n12069679 5296 +n12048399 5296 +n12049562 5296 +n12076577 5296 +n12086192 5296 +n12074867 5296 +n12075299 5296 +n12072722 5296 +n12066018 5296 +n12084555 5296 +n12070712 5296 +n12079963 5296 +n12065316 5296 +n12059314 5296 +n12085664 5296 +n12050959 5296 +n12062468 5296 +n12085267 5296 +n12078172 5296 +n12057211 5388 +n12057447 5388 +n12056758 5388 +n12056601 5388 +n12043836 5416 +n12043673 5416 +n12067193 5437 +n12066630 5437 +n12062781 5441 +n12062626 5441 +n11808299 5299 +n11808721 5299 +n11808932 5299 +n11808468 5299 +n11809594 5299 +n11809094 5299 +n11727358 5305 +n11727738 5305 +n11727540 5305 +n11816649 5313 +n11816336 5313 +n11816829 5313 +n11816121 5313 +n11815918 5313 +n11815721 5313 +n12362274 5318 +n12362668 5318 +n12361946 5318 +n11950877 5326 +n11950686 5326 +n11961100 5326 +n12020736 5338 +n12020941 5338 +n11934616 5339 +n11933546 5339 +n11934807 5339 +n12879963 5241 +n12015959 5241 +n11836722 5241 +n11860555 5241 +n12258885 5241 +n11980682 5241 +n12016567 5241 +n11737534 5241 +n11965627 5241 +n11991263 5241 +n11989393 5241 +n12006766 5241 +n12887293 5241 +n12937130 5241 +n12291959 5241 +n11972291 5241 +n11927215 5241 +n12012111 5241 +n11970586 5241 +n11963932 5241 +n11966215 5488 +n11966083 5488 +n12006930 5491 +n12007196 5491 +n11600372 5237 +n11599324 5237 +n11603246 5504 +n11602873 5504 +n11603835 5504 +n11601333 5504 +n12484784 5190 +n12610328 5190 +n11791569 5190 +n11714853 5190 +n13122364 5190 +n11715430 5513 +n11715678 5513 +n12801781 5514 +n11728099 5514 +n11786131 5514 +n12150028 5514 +n12801520 5514 +n11789066 5514 +n11792742 5514 +n12152532 5520 +n12151615 5520 +n12152722 5520 +n11733548 5191 +n11720353 5191 +n12810595 5191 +n12342299 5191 +n13238375 5191 +n12867826 5191 +n12665048 5191 +n11973341 5191 +n12312728 5191 +n11818069 5191 +n12848499 5191 +n11779300 5191 +n12822955 5191 +n12816508 5191 +n12719684 5191 +n12350758 5191 +n12095020 5191 +n11861641 5191 +n11962667 5191 +n12870891 5191 +n12939282 5191 +n12812478 5191 +n12031927 5191 +n12023108 5191 +n12858150 5191 +n12861892 5191 +n12841007 5191 +n12212361 5191 +n12869061 5191 +n12906214 5191 +n12910285 5191 +n12486574 5191 +n12090890 5191 +n12702948 5191 +n12437513 5191 +n11968931 5191 +n11817914 5191 +n11772408 5191 +n12932173 5191 +n12817694 5191 +n11910460 5191 +n12603449 5191 +n12939874 5191 +n12002428 5191 +n12015525 5191 +n11807108 5191 +n12835331 5191 +n12168565 5191 +n12840362 5191 +n12352287 5191 +n11969166 5191 +n11968704 5191 +n12821895 5191 +n12344283 5191 +n11866248 5191 +n11995092 5191 +n12622875 5191 +n11735053 5191 +n12548280 5191 +n13150894 5191 +n12685431 5191 +n12387633 5191 +n12171966 5191 +n12796022 5191 +n12934036 5191 +n12443323 5191 +n12870535 5191 +n12682668 5191 +n12778605 5191 +n12623077 5191 +n12836212 5191 +n11982115 5191 +n12003696 5191 +n12005656 5191 +n12098403 5191 +n12606545 5191 +n11902709 5191 +n12882945 5191 +n12785889 5191 +n11986511 5191 +n12682411 5191 +n12469517 5191 +n12029635 5191 +n12860365 5191 +n12552309 5191 +n11977303 5191 +n11825351 5191 +n12836337 5191 +n12844939 5191 +n12925179 5191 +n11926833 5191 +n12604228 5191 +n11752578 5191 +n12855042 5191 +n11956850 5191 +n12092262 5191 +n12506991 5191 +n12882779 5191 +n11747468 5191 +n12385429 5191 +n12822115 5191 +n12821505 5191 +n12607456 5191 +n12819728 5191 +n12817464 5191 +n12811027 5191 +n12024445 5191 +n12573474 5191 +n12864545 5191 +n11949402 5191 +n11868814 5191 +n11953038 5191 +n12599435 5191 +n12840749 5191 +n13233727 5191 +n12342498 5191 +n12795555 5191 +n11984542 5191 +n12847008 5191 +n12719944 5191 +n11855274 5191 +n12095647 5191 +n12441183 5191 +n12942572 5191 +n12602980 5191 +n12684379 5191 +n12441390 5191 +n12785724 5191 +n11916696 5191 +n12574320 5191 +n12092417 5191 +n12036939 5191 +n11700058 5191 +n12845413 5191 +n11824146 5191 +n11910271 5191 +n11916467 5191 +n11807525 5191 +n12101870 5191 +n11939180 5191 +n12353754 5191 +n12104501 5191 +n12794985 5191 +n12355760 5191 +n12793015 5191 +n12932966 5191 +n12931542 5191 +n12889713 5191 +n12849061 5191 +n11722466 5528 +n11720643 5528 +n12665857 5533 +n12665271 5533 +n11785668 5538 +n11780148 5538 +n11784497 5538 +n11782036 5538 +n11786539 5538 +n11782761 5538 +n12858871 5551 +n12858397 5551 +n11959632 5554 +n11959862 5554 +n12911673 5557 +n12911440 5557 +n12091213 5559 +n12091550 5559 +n12091377 5559 +n12091953 5559 +n12703557 5560 +n12703190 5560 +n12703383 5560 +n12437930 5561 +n12437769 5561 +n12352639 5576 +n12352844 5576 +n12352990 5576 +n12344700 5580 +n12344483 5580 +n12687957 5587 +n12685831 5587 +n12687698 5587 +n12687462 5587 +n12686274 5707 +n12686077 5707 +n12687044 5707 +n12686676 5707 +n12388989 5588 +n12388143 5588 +n12387839 5588 +n12388858 5716 +n12390099 5716 +n12389501 5716 +n12390314 5716 +n12782915 5595 +n12779603 5595 +n12781940 5595 +n12782530 5595 +n11753700 5619 +n11753355 5619 +n11753143 5619 +n12856680 5620 +n12855494 5620 +n12540250 5625 +n12515711 5625 +n12575322 5625 +n12575812 5625 +n12556307 5625 +n12539306 5625 +n12557681 5734 +n12558425 5734 +n12866162 5635 +n12865824 5635 +n12865037 5635 +n12866635 5635 +n12865562 5635 +n12866002 5635 +n11879054 5637 +n11878283 5637 +n11875691 5637 +n11876634 5637 +n11877193 5637 +n11876803 5637 +n11876432 5637 +n11870418 5637 +n11875938 5637 +n11894327 5637 +n11881742 5637 +n11870747 5637 +n11896722 5745 +n11879722 5745 +n11895092 5753 +n11894770 5753 +n11882074 5754 +n11882426 5754 +n13235503 5641 +n13234678 5641 +n12039317 5658 +n12037691 5658 +n12038406 5658 +n12038585 5658 +n12148757 5665 +n12102133 5665 +n12121610 5769 +n12139575 5769 +n12113195 5769 +n12112918 5769 +n12116429 5769 +n12141495 5769 +n12133462 5769 +n12108871 5769 +n12104238 5769 +n12141167 5769 +n12115180 5769 +n12112008 5769 +n12128071 5769 +n12146311 5769 +n12124627 5769 +n12110778 5769 +n12129134 5769 +n12134025 5775 +n12145477 5775 +n12142085 5775 +n12135898 5775 +n12137120 5790 +n12127030 5790 +n12127768 5792 +n12127460 5792 +n12356023 5670 +n12357485 5670 +n12793494 5671 +n12794135 5671 +n12849279 5675 +n12849416 5675 +n12847374 5192 +n12517642 5192 +n11731659 5192 +n12813189 5192 +n11838916 5192 +n12517445 5192 +n12513172 5192 +n12823859 5192 +n12566954 5192 +n13148208 5192 +n12158798 5192 +n12485981 5192 +n13237188 5192 +n12826516 5192 +n13120211 5192 +n12580654 5192 +n11769621 5192 +n12824053 5192 +n11769803 5192 +n12383402 5192 +n12823717 5192 +n12157769 5192 +n13144794 5192 +n12371439 5192 +n12159055 5811 +n12160490 5811 +n12158443 5811 +n12160303 5825 +n12159388 5825 +n12160857 5826 +n12161969 5826 +n12827270 5814 +n12828791 5814 +n12827537 5814 +n11788727 5815 +n11789589 5815 +n12571781 5815 +n11792029 5815 +n12384839 5820 +n12384227 5820 +n12384037 5820 +n12164363 5822 +n12166128 5822 +n12165170 5842 +n12164881 5842 +n12164656 5842 +n13146583 5823 +n13145040 5823 +n12509476 5193 +n13112664 5193 +n13104059 5193 +n12655869 5193 +n12546183 5193 +n12671651 5850 +n12215579 5850 +n12901724 5850 +n12938193 5850 +n12680864 5850 +n12329260 5850 +n12924623 5850 +n12659356 5850 +n12788201 5850 +n12343480 5850 +n13142504 5850 +n11830906 5850 +n12504783 5850 +n12659539 5850 +n12214789 5850 +n11699442 5850 +n12217453 5850 +n12574866 5850 +n12374418 5850 +n12249542 5850 +n13118707 5850 +n12215022 5850 +n12342852 5850 +n12762896 5850 +n12306717 5850 +n11769176 5850 +n12805146 5850 +n12519089 5850 +n11754893 5850 +n12772908 5850 +n12624381 5850 +n12482031 5850 +n12243109 5850 +n12223764 5850 +n12170585 5850 +n12230794 5850 +n12791329 5850 +n12674120 5850 +n12917901 5850 +n12237486 5850 +n12185859 5850 +n12681893 5850 +n12905412 5850 +n12899537 5850 +n12899752 5850 +n12806015 5850 +n12011620 5850 +n12922763 5850 +n12651229 5850 +n12303083 5850 +n11928352 5850 +n11926365 5850 +n12223569 5850 +n12791064 5850 +n12311579 5850 +n11834654 5850 +n11760785 5850 +n12749679 5850 +n12489815 5850 +n12666965 5850 +n12929403 5850 +n12902662 5850 +n12620196 5850 +n12237641 5850 +n12625383 5850 +n12244153 5850 +n11774513 5850 +n12520864 5850 +n12516828 5850 +n12849717 5850 +n12485653 5850 +n12790430 5862 +n12788854 5862 +n11924445 5874 +n12632335 5874 +n11947251 5874 +n12099342 5874 +n11931540 5874 +n12545635 5874 +n11778257 5874 +n11924849 5874 +n12367611 5874 +n12602262 5874 +n12328567 5874 +n12328398 5874 +n12629305 5874 +n11907689 5874 +n11940006 5874 +n12546962 5874 +n11925898 5874 +n11947629 5929 +n11948864 5929 +n11948264 5929 +n12368451 5935 +n12369309 5935 +n12368028 5935 +n12307240 5878 +n12307076 5878 +n12483427 5885 +n12483625 5885 +n12482893 5885 +n12483841 5885 +n12173664 5888 +n12173912 5888 +n12171316 5888 +n12174521 5888 +n12171098 5888 +n12177844 5888 +n12174311 5888 +n12178896 5961 +n12179122 5961 +n12676534 5891 +n12676703 5891 +n12675876 5891 +n12920204 5892 +n12921868 5892 +n12621410 5916 +n12622297 5916 +n12245319 5919 +n12244650 5919 +n12244819 5919 +n12521394 5921 +n12530818 5921 +n12849952 5923 +n12850336 5923 +n12850168 5923 +n12495146 5851 +n12570972 5851 +n12196129 5851 +n13107694 5851 +n12202936 5851 +n13111881 5851 +n13103877 5851 +n12409231 5851 +n12765115 5851 +n12265600 5851 +n12409470 5851 +n12713866 5851 +n12281241 5851 +n11709205 5851 +n12189429 5851 +n12562785 5851 +n12284821 5851 +n12401335 5851 +n12570394 5851 +n11759224 5851 +n12286988 5851 +n12491826 5851 +n12527738 5851 +n12696492 5851 +n12325234 5851 +n12198286 5851 +n12330891 5851 +n11650558 5851 +n12405714 5851 +n12284262 5851 +n12714755 5851 +n13109733 5851 +n12262553 5851 +n12506341 5851 +n12303462 5851 +n12260799 5851 +n12302071 5851 +n12492106 5851 +n11762433 5851 +n12582231 5851 +n12774299 5851 +n13108481 5851 +n12267411 5851 +n11756092 5851 +n12662772 5851 +n13108662 5851 +n12528549 5851 +n12690653 5851 +n12180885 5851 +n13108545 5851 +n13108323 5851 +n12334293 5851 +n12670758 5851 +n12286826 5851 +n12724942 5851 +n12155009 5851 +n12570703 5851 +n12523475 5851 +n12154773 5851 +n12915811 5851 +n12268246 5851 +n13108131 5851 +n12806732 5851 +n12524188 5851 +n11758799 5851 +n12496427 5851 +n12568186 5980 +n12495895 5980 +n12196527 5982 +n12196336 5982 +n12196694 5982 +n12203529 5984 +n12204175 5984 +n12282933 5992 +n12282527 5992 +n12283542 5992 +n12282737 5992 +n12282235 5992 +n12402051 5997 +n12402840 5997 +n12401684 5997 +n12402348 5997 +n12402596 5997 +n11759853 5999 +n11759404 5999 +n12406715 6008 +n12406488 6008 +n12407890 6008 +n12406902 6008 +n12330469 6011 +n12345899 6011 +n11709674 6011 +n12329473 6011 +n12200143 6011 +n11712282 6011 +n12752205 6011 +n13110915 6011 +n12513933 6011 +n12189987 6011 +n12731401 6011 +n12717224 6011 +n12717072 6011 +n12946849 6011 +n12756457 6011 +n12201580 6011 +n11703669 6011 +n12491017 6011 +n12190410 6011 +n12242409 6011 +n07754894 6011 +n12818346 6011 +n12658308 6011 +n12658118 6011 +n12494794 6011 +n12317296 6011 +n12651821 6011 +n11711764 6071 +n11710136 6071 +n11711537 6071 +n11710393 6071 +n12755225 6075 +n12753573 6075 +n12754648 6075 +n12754781 6075 +n12755727 6075 +n12754981 6075 +n12755387 6075 +n12753007 6075 +n12753245 6075 +n12754003 6075 +n12759273 6076 +n12318378 6076 +n12288823 6076 +n12319204 6111 +n12319414 6111 +n12732491 6079 +n12733647 6079 +n12732756 6079 +n12732009 6079 +n12733870 6079 +n12732966 6117 +n12733218 6117 +n12948495 6082 +n12948251 6082 +n12948053 6082 +n12947313 6082 +n12757303 6083 +n12757458 6083 +n11704093 6085 +n11705171 6085 +n12707781 6095 +n12399132 6095 +n12400720 6095 +n12345280 6095 +n11695599 6095 +n12771192 6095 +n12704343 6095 +n12638218 6095 +n12644902 6095 +n12190869 6095 +n12373100 6095 +n12300840 6095 +n12743352 6095 +n12651611 6095 +n12629666 6095 +n12636224 6095 +n12648045 6095 +n12399384 6095 +n12301180 6095 +n12744387 6095 +n12640839 6095 +n12745386 6095 +n12633638 6095 +n12771390 6095 +n12761284 6095 +n12400489 6095 +n12333530 6095 +n12333771 6095 +n12333053 6095 +n12641413 6095 +n12332030 6095 +n12711984 6130 +n12709901 6130 +n12708293 6130 +n12713063 6130 +n12711596 6130 +n12709103 6130 +n12709688 6130 +n12710415 6162 +n12710295 6162 +n12710693 6163 +n12708654 6163 +n12708941 6163 +n12643313 6137 +n12638753 6137 +n12646740 6138 +n12645174 6138 +n12650379 6138 +n12634429 6152 +n12633994 6152 +n12634211 6152 +n12635532 6152 +n12635955 6180 +n12635744 6180 +n12643473 6159 +n12649065 6159 +n12641931 6159 +n12642200 6159 +n12650556 6159 +n12649539 6185 +n12649317 6185 +n12646605 6185 +n12647560 6186 +n12648888 6186 +n12263987 6012 +n12263038 6012 +n12306089 6014 +n12305986 6014 +n12305293 6014 +n12304703 6014 +n12305475 6014 +n12262018 6015 +n12261808 6015 +n12261571 6015 +n12595699 6019 +n12587132 6019 +n12583126 6019 +n12596709 6019 +n12591351 6019 +n12596849 6019 +n12582665 6019 +n12596148 6019 +n12595964 6019 +n12582846 6019 +n12587803 6019 +n12591017 6019 +n12588320 6206 +n12588780 6206 +n12585629 6206 +n12597134 6206 +n12598027 6206 +n12597466 6206 +n12583401 6206 +n12593994 6213 +n12590232 6213 +n11757653 6023 +n11756669 6023 +n11757851 6023 +n11664418 6025 +n13108841 6025 +n11647703 6229 +n11628793 6229 +n11658331 6229 +n11623105 6229 +n11630017 6229 +n11628456 6229 +n11658544 6229 +n11643835 6229 +n11624531 6229 +n11661372 6229 +n11645914 6229 +n11630489 6229 +n11640132 6229 +n11608250 6229 +n11620673 6229 +n11618861 6229 +n11627168 6229 +n11623815 6233 +n11624192 6233 +n11623967 6233 +n11635152 6234 +n11634736 6234 +n11635433 6234 +n11636204 6234 +n11644462 6237 +n11644226 6237 +n11644046 6237 +n11626585 6238 +n11625632 6238 +n11625003 6238 +n11626826 6238 +n11625804 6238 +n11626152 6238 +n11626409 6238 +n11646694 6240 +n11646167 6240 +n11632167 6241 +n11631854 6241 +n11632619 6241 +n11616662 6243 +n11611561 6243 +n11611356 6243 +n11617631 6243 +n11612575 6243 +n11611758 6243 +n11614713 6243 +n11615387 6243 +n11612018 6243 +n11611087 6243 +n11612923 6243 +n11616486 6243 +n11618290 6243 +n11612349 6243 +n11611233 6243 +n11617090 6243 +n11614250 6243 +n11618525 6243 +n11615026 6243 +n11617272 6243 +n11614039 6279 +n11613459 6279 +n11615967 6285 +n11614420 6285 +n11621029 6244 +n11622184 6293 +n11622591 6293 +n11621281 6293 +n11622368 6293 +n11621950 6293 +n11621547 6293 +n11621727 6293 +n11619455 6245 +n11619227 6245 +n11627512 6246 +n11628087 6246 +n11627908 6246 +n12691661 6027 +n12691428 6027 +n12316572 6031 +n12334891 6031 +n12340755 6031 +n12316444 6031 +n12336727 6309 +n12338796 6309 +n12338454 6309 +n12336973 6309 +n12336092 6309 +n12336224 6309 +n12337617 6309 +n12725521 6034 +n12727101 6034 +n12729521 6034 +n12726670 6034 +n12729315 6034 +n12729729 6319 +n12731029 6319 +n12270741 6040 +n12271643 6040 +n12278650 6040 +n12279458 6040 +n12269241 6040 +n12275489 6040 +n12273114 6040 +n12276872 6040 +n12278371 6040 +n12272883 6040 +n12269652 6040 +n12273768 6040 +n12277800 6327 +n12271933 6327 +n12279772 6330 +n12270946 6330 +n12269406 6330 +n12275675 6331 +n12276628 6331 +n12275131 6331 +n12274358 6336 +n12272239 6336 +n12277578 6336 +n12501202 6041 +n12814643 6041 +n12493208 6041 +n12807773 6042 +n12807409 6042 +n12807251 6042 +n11758122 6043 +n12915568 6043 +n12656369 5852 +n12656685 5852 +n12547215 5853 +n12547503 5853 +n11944196 5194 +n11984144 5194 +n11805544 5194 +n11874081 5194 +n11965218 5194 +n12392549 5194 +n11956348 5194 +n11945514 6361 +n11944954 6361 +n11998888 6361 +n11953884 6361 +n11954345 6361 +n11955153 6371 +n11954161 6371 +n12421137 5196 +n12421467 5196 +n12411461 5196 +n12451915 5196 +n12425281 5196 +n12459629 5196 +n12421683 6376 +n12422129 6376 +n12421917 6376 +n12411922 6377 +n12418221 6377 +n12416073 6377 +n12413165 6384 +n12414932 6384 +n12412606 6384 +n12412355 6384 +n12414035 6384 +n12413880 6384 +n12453186 6378 +n12452836 6378 +n12450344 6379 +n12426248 6379 +n12429352 6379 +n12460697 6379 +n12449526 6379 +n12473840 6379 +n12458550 6379 +n12449296 6379 +n12472024 6379 +n12457091 6379 +n12465557 6379 +n12461466 6379 +n12454159 6379 +n12431434 6379 +n12451240 6395 +n12451399 6395 +n12450840 6395 +n12428076 6396 +n12428747 6396 +n12427566 6396 +n12427184 6396 +n12426623 6396 +n12427757 6396 +n12461109 6398 +n12460957 6398 +n12454705 6407 +n12454949 6407 +n12435777 6408 +n12435649 6408 +n11819509 5197 +n11819912 5197 +n11842204 5197 +n11852028 6426 +n11851258 6426 +n11847169 6426 +n11853813 6426 +n11848479 6426 +n11844892 6426 +n11851839 6426 +n11845557 6426 +n11849871 6426 +n11849983 6426 +n11851578 6426 +n11854479 6426 +n11844371 6426 +n11853356 6426 +n11845793 6434 +n11845913 6434 +n11784126 5185 +n11783920 5185 +n12832315 5185 +n11723770 5186 +n11724109 5186 +n12766869 5186 +n12455950 5186 +n11723227 5186 +n12757816 5186 +n11773987 5186 +n12766595 5186 +n01324610 5174 +n02153109 5174 +n01323599 5174 +n01314781 5174 +n01321579 5174 +n01317541 5174 +n01318894 5174 +n01314663 5174 +n02311060 5174 +n01317916 5174 +n01321230 5174 +n01314388 5174 +n02075612 5174 +n02152740 5174 +n01466257 5174 +n01316949 5174 +n01905661 5174 +n01320872 5174 +n01319467 5174 +n01316422 5174 +n02157206 5174 +n10300303 5174 +n02152881 5174 +n01324431 5174 +n01321854 6458 +n01321770 6458 +n01956344 6458 +n01613615 6458 +n01318279 6458 +n02376542 6478 +n02122948 6478 +n01888045 6478 +n01322343 6478 +n01887896 6478 +n02412440 6478 +n01322221 6478 +n01322604 6478 +n01323261 6478 +n01322685 6478 +n02395694 6478 +n01504344 6481 +n01504179 6481 +n01318381 6459 +n02122580 6459 +n01317813 6459 +n02469472 6462 +n02309337 6462 +n02311617 6462 +n02264232 6462 +n02299157 6500 +n02310585 6500 +n02299505 6500 +n02302620 6500 +n02295390 6500 +n02310717 6500 +n02288268 6500 +n02297442 6500 +n02300797 6500 +n02285801 6500 +n02307325 6500 +n02376791 6464 +n02377063 6464 +n01323355 6464 +n01469103 6468 +n01468712 6468 +n01471682 6468 +n01473806 6519 +n01627424 6519 +n01861778 6519 +n09828216 6519 +n01459791 6519 +n02156871 6519 +n01661091 6519 +n01503061 6519 +n02512053 6520 +n01477525 6520 +n02528163 6528 +n02512938 6528 +n01482071 6528 +n02638596 6530 +n01457852 6530 +n01455778 6530 +n01456756 6530 +n02552171 6530 +n01428580 6530 +n02549989 6530 +n02640857 6533 +n02641379 6533 +n02639087 6533 +n02639605 6533 +n02640242 6533 +n02554730 6537 +n02618827 6537 +n02549248 6537 +n02603317 6537 +n01451426 6537 +n02548247 6537 +n02642107 6537 +n02657368 6537 +n02603540 6537 +n02652668 6537 +n02560110 6545 +n02556846 6545 +n02555863 6545 +n02581957 6545 +n02564270 6545 +n02623445 6545 +n02565573 6545 +n02610664 6545 +n02590702 6545 +n02588286 6545 +n02620167 6545 +n02573704 6545 +n02576223 6545 +n02606384 6545 +n02605316 6545 +n02619550 6545 +n02561108 6545 +n02619165 6545 +n02610066 6545 +n02562315 6545 +n02586543 6545 +n02593019 6545 +n02594250 6545 +n02616851 6545 +n02585872 6545 +n02607862 6545 +n02557182 6556 +n02557318 6556 +n02557749 6556 +n02624167 6560 +n02628062 6560 +n02631475 6560 +n02630281 6560 +n02631041 6560 +n02629230 6560 +n02626762 6560 +n02625258 6584 +n02625612 6584 +n02624807 6584 +n02626265 6592 +n02625851 6592 +n02627292 6590 +n02627532 6590 +n02576575 6567 +n02579928 6567 +n02580336 6567 +n02576906 6598 +n02579303 6598 +n02578771 6598 +n02578928 6598 +n02580679 6600 +n02580830 6600 +n02607201 6568 +n02607470 6568 +n02607072 6568 +n02605703 6569 +n02606052 6569 +n02605936 6569 +n02561381 6571 +n02561661 6571 +n02561514 6571 +n02564720 6574 +n02563648 6574 +n02563182 6574 +n02563792 6574 +n02562796 6574 +n02565072 6616 +n02565324 6616 +n02599052 6577 +n02596381 6577 +n02597608 6577 +n02596067 6577 +n02595702 6577 +n02598573 6624 +n02598878 6624 +n02642644 6551 +n02649546 6551 +n02643112 6630 +n02643566 6630 +n02643836 6630 +n02644113 6630 +n02658531 6552 +n02657694 6552 +n02660208 6552 +n02654745 6554 +n02654425 6554 +n02656670 6554 +n02655020 6554 +n02655523 6554 +n02653145 6554 +n02656032 6643 +n02655848 6643 +n02541687 6538 +n02542432 6538 +n02524202 6538 +n02533834 6538 +n02543565 6538 +n02517442 6538 +n01438208 6538 +n02526121 6538 +n02529772 6538 +n02518324 6652 +n02520147 6652 +n02519686 6652 +n02519862 6652 +n02583567 6653 +n01444339 6653 +n01446589 6653 +n01438581 6653 +n01439121 6653 +n01448951 6653 +n02584449 6660 +n02584145 6660 +n02583890 6660 +n01446760 6662 +n01447331 6662 +n01448594 6662 +n01448291 6662 +n01439514 6664 +n01442972 6664 +n01440764 6664 +n01443831 6664 +n01443537 6664 +n01443243 6664 +n01449712 6665 +n01449374 6665 +n02527622 6654 +n02527057 6654 +n02527271 6654 +n02532602 6655 +n02533209 6655 +n02566834 6531 +n02537085 6531 +n02534734 6531 +n02514041 6531 +n02568959 6686 +n02568087 6686 +n02570164 6690 +n02569484 6690 +n02537716 6687 +n02538216 6687 +n02537525 6687 +n02537319 6687 +n02538010 6687 +n02536456 6688 +n02535537 6688 +n02535258 6688 +n02536864 6688 +n02535759 6688 +n01482330 6532 +n01495701 6532 +n01487506 6704 +n01495493 6704 +n01486838 6704 +n01488918 6704 +n01492357 6704 +n01494475 6704 +n01483522 6704 +n01488038 6704 +n01489501 6709 +n01491006 6709 +n01489709 6709 +n01489920 6709 +n01490112 6709 +n01491361 6709 +n01490670 6709 +n01493146 6710 +n01492569 6710 +n01484850 6712 +n01484097 6712 +n01483830 6712 +n01498041 6705 +n01496331 6705 +n01499396 6705 +n01500476 6705 +n01500091 6705 +n01501160 6705 +n01498989 6705 +n01629276 6521 +n01639765 6521 +n01629962 6733 +n01630284 6733 +n01629819 6733 +n01637615 6733 +n01632047 6733 +n01631663 6736 +n01630670 6736 +n01630901 6736 +n01632458 6739 +n01632777 6739 +n01632601 6739 +n01645776 6734 +n01640846 6734 +n01644900 6734 +n01643896 6734 +n01650167 6734 +n01644373 6734 +n01646648 6746 +n01646902 6746 +n01646292 6746 +n01646802 6746 +n01646388 6746 +n01647640 6746 +n01646555 6746 +n01642539 6747 +n01641206 6747 +n01641577 6747 +n01641391 6747 +n01642257 6747 +n01641739 6747 +n01650690 6750 +n01652026 6750 +n01886756 6522 +n01871265 6522 +n01871875 6522 +n01874434 6522 +n01862399 6522 +n02082791 6767 +n01887474 6767 +n01889074 6767 +n02372584 6767 +n01888411 6767 +n02453611 6767 +n02430559 6767 +n01887623 6767 +n02469914 6767 +n02075296 6767 +n02139199 6767 +n02062017 6767 +n02323449 6767 +n02372952 6767 +n01888181 6767 +n02329401 6767 +n01887787 6767 +n02453108 6767 +n01888264 6767 +n02461830 6767 +n02370806 6767 +n01891633 6774 +n01893825 6774 +n02454794 6777 +n02456962 6777 +n02454379 6777 +n02460009 6777 +n02458135 6796 +n02457945 6796 +n02457408 6796 +n02460451 6798 +n02461128 6798 +n02470238 6780 +n02501583 6780 +n02472293 6780 +n02470325 6780 +n02496913 6780 +n02484322 6780 +n02475669 6806 +n02474777 6806 +n02475078 6806 +n02470899 6807 +n02483092 6813 +n02480153 6813 +n02483708 6814 +n02483362 6814 +n02481823 6815 +n02480495 6815 +n02480855 6815 +n02482650 6818 +n02482474 6818 +n02481103 6820 +n02481366 6820 +n02481500 6820 +n02500267 6808 +n02497673 6808 +n02499316 6808 +n02499808 6808 +n02499022 6808 +n02484473 6809 +n02489589 6809 +n02486410 6831 +n02485536 6831 +n02489166 6831 +n02488702 6831 +n02486261 6831 +n02487347 6831 +n02484975 6831 +n02488291 6831 +n02486657 6833 +n02486908 6833 +n02487847 6838 +n02487547 6838 +n02493793 6832 +n02490219 6832 +n02494079 6832 +n02493509 6832 +n02492035 6832 +n02492660 6832 +n02491107 6846 +n02490811 6846 +n02507649 6781 +n02120997 6781 +n02134971 6781 +n02083346 6781 +n02441326 6781 +n02131653 6781 +n02509515 6853 +n02508213 6853 +n02509815 6853 +n02508021 6853 +n02509197 6853 +n02510455 6853 +n02127808 6854 +n02121620 6854 +n02128925 6865 +n02129604 6865 +n02128385 6865 +n02130308 6865 +n02129165 6865 +n02128757 6865 +n02129923 6868 +n02129837 6868 +n01323068 6868 +n02129463 6871 +n01322898 6871 +n02121808 6866 +n02124623 6866 +n02122878 6878 +n02123159 6878 +n02123045 6878 +n02123242 6878 +n02124484 6878 +n02124075 6878 +n02124313 6878 +n02122298 6878 +n02123478 6878 +n02123394 6878 +n02123917 6878 +n02123597 6878 +n02122510 6878 +n02122725 6878 +n02122430 6878 +n02126640 6879 +n02125494 6879 +n02127052 6879 +n02125311 6879 +n02125081 6879 +n02126139 6879 +n02126787 6879 +n02125010 6879 +n02127292 6897 +n02127482 6897 +n02127678 6897 +n02127381 6897 +n02138441 6855 +n02137015 6855 +n02137549 6855 +n02138647 6907 +n02138777 6907 +n02084071 6856 +n02115335 6856 +n02114100 6856 +n02083672 6856 +n02115096 6856 +n02118333 6856 +n02117135 6856 +n02110958 6912 +n02112826 6912 +n02111500 6912 +n02112706 6912 +n02113335 6912 +n02084861 6912 +n02111129 6912 +n02112497 6912 +n02110341 6912 +n02084732 6912 +n02111626 6912 +n02085374 6912 +n02087122 6912 +n02103406 6912 +n02110806 6912 +n02113978 6912 +n02111277 6912 +n02085272 6912 +n02113186 6920 +n02113023 6920 +n02113799 6923 +n02113624 6923 +n02113712 6923 +n02112018 6929 +n02112350 6929 +n02112137 6929 +n02111889 6929 +n02086346 6930 +n02086240 6930 +n02087046 6930 +n02085936 6930 +n02085782 6930 +n02085620 6930 +n02086079 6930 +n02086753 6946 +n02086646 6946 +n02086910 6946 +n02092468 6931 +n02087394 6931 +n02089468 6931 +n02098550 6931 +n02087551 6931 +n02089232 6931 +n02096437 6956 +n02096756 6956 +n02095412 6956 +n02096051 6956 +n02098286 6956 +n02093859 6956 +n02094114 6956 +n02093754 6956 +n02094433 6956 +n02095314 6956 +n02093647 6956 +n02097474 6956 +n02097658 6956 +n02098413 6956 +n02097298 6956 +n02096177 6956 +n02096585 6956 +n02095050 6956 +n02096294 6956 +n02093056 6956 +n02094258 6956 +n02093991 6956 +n02094562 6956 +n02098105 6956 +n02097209 6963 +n02097130 6963 +n02097047 6963 +n02095570 6964 +n02095727 6964 +n02095889 6964 +n02093256 6981 +n02093428 6981 +n02094721 6984 +n02094931 6984 +n02098906 6959 +n02099997 6959 +n02098806 6959 +n02100399 6959 +n02101108 6959 +n02099029 6959 +n02100583 6997 +n02100236 6997 +n02101006 6999 +n02100735 6999 +n02100877 6999 +n02102318 7000 +n02102605 7000 +n02101861 7000 +n02101388 7000 +n02101556 7000 +n02102480 7000 +n02102973 7000 +n02102040 7009 +n02102177 7009 +n02099267 7001 +n02099601 7001 +n02099429 7001 +n02099849 7001 +n02099712 7001 +n02091635 6960 +n02088466 6960 +n02090475 6960 +n02088238 6960 +n02091244 6960 +n02091467 6960 +n02088839 6960 +n02091831 6960 +n02088094 6960 +n02089078 6960 +n02088632 6960 +n02092002 6960 +n02090379 6960 +n02089555 6960 +n02088364 6960 +n02092339 6960 +n02090827 6960 +n02090622 7023 +n02090721 7023 +n02089973 7034 +n02089867 7034 +n02091134 7037 +n02091032 7037 +n02109047 6932 +n02103841 6932 +n02109961 6932 +n02108551 6932 +n02109811 6932 +n02109525 6932 +n02108915 6932 +n02106854 6932 +n02108672 6932 +n02107420 6932 +n02108422 6932 +n02104523 6932 +n02108089 6932 +n02108254 6932 +n02104029 7045 +n02104280 7045 +n02106966 7045 +n02104365 7045 +n02107142 7060 +n02107312 7060 +n02110627 7060 +n02110185 7048 +n02110063 7048 +n02107574 7053 +n02108000 7053 +n02107683 7053 +n02107908 7053 +n02104882 7055 +n02105412 7055 +n02105855 7055 +n02105505 7055 +n02106166 7055 +n02106030 7055 +n02106550 7055 +n02105641 7055 +n02106662 7055 +n02105251 7055 +n02106382 7055 +n02105056 7071 +n02105162 7071 +n02116738 6913 +n02115641 6913 +n02115913 6913 +n02114855 6914 +n01322508 6914 +n02114712 6914 +n02114548 6914 +n02114367 6914 +n02119022 6917 +n02119477 6917 +n02119789 6917 +n02120079 6917 +n02120505 6917 +n02119634 6917 +n02117900 6918 +n02117512 6918 +n02442845 6857 +n02443484 6857 +n02446206 6857 +n02450295 6857 +n02445394 6857 +n02444819 6857 +n02441942 6857 +n02443114 6857 +n02449350 6857 +n02445715 6857 +n02447366 6857 +n02443346 6857 +n02445004 7105 +n02445171 7105 +n02134084 6858 +n02133161 6858 +n01322983 6858 +n02133704 6858 +n02132136 6858 +n02134418 6858 +n02132580 7118 +n02132788 7118 +n02141306 6782 +n02140049 6782 +n02139671 6782 +n02146371 7122 +n02145424 7122 +n02147591 7126 +n02147947 7126 +n02062430 6783 +n02073250 6783 +n02075927 6783 +n02062744 7129 +n02066707 7132 +n02063224 7132 +n02068974 7133 +n02068541 7133 +n02070430 7135 +n02069412 7135 +n02069701 7135 +n02071636 7135 +n02071294 7135 +n02072798 7135 +n02070174 7139 +n02069974 7139 +n02066245 7134 +n02064338 7134 +n02064816 7134 +n02065407 7146 +n02065026 7146 +n02073831 7130 +n02074367 7130 +n02081571 7131 +n02076196 7131 +n02079389 7153 +n02076779 7153 +n02080415 7154 +n02079851 7154 +n02080146 7154 +n02077658 7155 +n02077152 7155 +n02077923 7155 +n02078574 7161 +n02078738 7161 +n02079005 7161 +n02328429 6784 +n02323902 6784 +n02324045 7166 +n02326432 7166 +n02325722 7167 +n02325366 7167 +n02324587 7167 +n02324850 7167 +n02324514 7167 +n02328150 7167 +n02324431 7167 +n02327842 7168 +n02326862 7168 +n02327028 7168 +n02367492 6787 +n02331046 6787 +n02365480 6787 +n02343320 6787 +n02341974 6787 +n02346627 6787 +n02366959 6787 +n02339376 6787 +n02363005 6787 +n02342885 6787 +n02359324 6787 +n02355227 6787 +n02361337 6787 +n02359556 6787 +n02364520 6787 +n02343772 6787 +n02330245 6787 +n02338145 6787 +n02353861 7180 +n02333546 7180 +n02333909 7180 +n02360282 7190 +n02358091 7190 +n02359915 7190 +n02355477 7190 +n02358890 7201 +n02358390 7201 +n02356381 7203 +n02357111 7203 +n02356977 7203 +n02357401 7203 +n02356798 7203 +n02361706 7191 +n02361587 7191 +n02364840 7193 +n02364673 7193 +n02332755 7195 +n02332156 7195 +n02503517 6789 +n02504458 7217 +n02504013 7217 +n02394477 6792 +n02373336 6792 +n02399000 7220 +n02437136 7220 +n02395003 7220 +n02437616 7220 +n02438580 7220 +n02397744 7220 +n02398521 7220 +n02397529 7220 +n02429456 7222 +n02430045 7222 +n02401031 7222 +n02439033 7222 +n02439398 7222 +n02434190 7231 +n02433925 7231 +n02433318 7231 +n02432983 7231 +n02431337 7231 +n02432511 7231 +n02430830 7231 +n02431122 7231 +n02434954 7231 +n02432291 7231 +n02431785 7231 +n02431976 7231 +n02433546 7231 +n02432704 7231 +n02414578 7232 +n02410509 7232 +n02411206 7232 +n02407959 7232 +n02402010 7232 +n02419796 7232 +n02411705 7232 +n02418064 7232 +n02416519 7232 +n02416104 7249 +n02415435 7249 +n02415253 7249 +n02415577 7259 +n02415829 7259 +n02410702 7250 +n02410900 7250 +n02408817 7252 +n02408429 7252 +n02409508 7252 +n02404573 7253 +n02402175 7253 +n02404906 7253 +n02402425 7253 +n02405302 7269 +n02410011 7269 +n02404186 7271 +n02403003 7271 +n02403325 7271 +n02403231 7271 +n02403740 7271 +n02403454 7271 +n02406174 7271 +n02404432 7274 +n02406647 7274 +n02407625 7274 +n02407071 7274 +n02405929 7274 +n02407276 7274 +n02407390 7280 +n02406533 7280 +n02424305 7254 +n02421136 7254 +n02420509 7254 +n02427724 7254 +n02426813 7254 +n02426481 7254 +n02421792 7254 +n02421449 7254 +n02424695 7254 +n02420828 7254 +n02422391 7254 +n02422699 7254 +n02424486 7254 +n02425887 7254 +n02422106 7254 +n02424085 7254 +n02428508 7254 +n02428349 7254 +n02423022 7254 +n02424909 7297 +n02425228 7297 +n02423218 7307 +n02423589 7307 +n02413131 7255 +n02413050 7255 +n02411999 7255 +n02412210 7255 +n02412080 7255 +n02418465 7256 +n02419336 7256 +n02419634 7256 +n02416964 7257 +n02416820 7257 +n02417914 7257 +n02417387 7257 +n02417070 7257 +n02416880 7257 +n02417534 7257 +n02437482 7223 +n02437312 7223 +n02396427 7224 +n02397096 7224 +n02396014 7224 +n02395406 7224 +n02438173 7225 +n02438272 7225 +n02391994 7221 +n02393580 7221 +n02374149 7221 +n02393940 7221 +n02392434 7335 +n02393161 7335 +n02392824 7335 +n02374451 7337 +n02391049 7337 +n02389346 7337 +n02388917 7342 +n02377603 7342 +n02382948 7342 +n02389128 7342 +n02381460 7342 +n02389261 7342 +n02382204 7342 +n02375302 7342 +n02376918 7342 +n02387722 7342 +n02388832 7342 +n02381609 7342 +n02377703 7342 +n02388735 7342 +n02386014 7342 +n02380464 7342 +n02386310 7342 +n02377480 7342 +n02380335 7342 +n02382437 7342 +n02389026 7342 +n02385214 7347 +n02383231 7347 +n02388276 7347 +n02377291 7353 +n02377181 7353 +n02377388 7353 +n02379430 7357 +n02378969 7357 +n02378541 7357 +n02381364 7357 +n02379329 7357 +n02381004 7357 +n02381261 7357 +n02379908 7357 +n02379183 7357 +n02386141 7359 +n02386224 7359 +n02382338 7361 +n02387254 7361 +n02386496 7361 +n02386853 7385 +n02387093 7385 +n02386968 7385 +n02387346 7385 +n02382039 7363 +n02380745 7363 +n02380583 7363 +n02382750 7364 +n02382635 7364 +n02382850 7364 +n02391234 7343 +n02391373 7343 +n02391508 7343 +n02390015 7344 +n02389779 7344 +n02389559 7344 +n01872401 6769 +n01873310 6769 +n01872772 6769 +n01877134 6770 +n01882714 6770 +n01883070 6770 +n01875313 6770 +n01874928 6770 +n01883513 6770 +n01881171 6770 +n01877606 7405 +n01877812 7405 +n01878929 7413 +n01879509 7413 +n01884834 7410 +n01885498 7410 +n01662622 6526 +n01661818 6526 +n01662784 7418 +n01669372 7420 +n01669191 7420 +n01666228 7420 +n01667778 7420 +n01672032 7420 +n01669654 7420 +n01663401 7420 +n01665932 7420 +n01668665 7420 +n01670092 7420 +n01667114 7420 +n01668892 7420 +n01664990 7427 +n01664065 7427 +n01663782 7427 +n01665541 7427 +n01664369 7427 +n01664674 7437 +n01664492 7437 +n01670802 7430 +n01671125 7430 +n01670535 7430 +n01671479 7430 +n01696633 7419 +n01726692 7419 +n01673282 7419 +n01674464 7419 +n01699831 7419 +n01698434 7444 +n01697178 7444 +n01698640 7444 +n01699040 7444 +n01697611 7450 +n01697457 7450 +n01740551 7445 +n01752165 7445 +n01751748 7445 +n01745125 7445 +n01741562 7445 +n01727646 7445 +n01753488 7456 +n01752736 7456 +n01752585 7456 +n01753032 7456 +n01753959 7456 +n01754533 7465 +n01754370 7465 +n01754876 7465 +n01757901 7468 +n01757677 7468 +n01755581 7468 +n01757115 7468 +n01755740 7468 +n01756089 7468 +n01756508 7468 +n01756291 7468 +n01756733 7468 +n01757343 7468 +n01747885 7458 +n01749939 7458 +n01751472 7458 +n01747589 7458 +n01749582 7458 +n01746359 7458 +n01745484 7458 +n01748264 7479 +n01748906 7479 +n01741943 7459 +n01743605 7488 +n01742821 7488 +n01742172 7488 +n01743086 7488 +n01744100 7489 +n01743936 7489 +n01744401 7489 +n01730960 7460 +n01735189 7460 +n01733757 7460 +n01729322 7460 +n01732244 7460 +n01731545 7460 +n01737021 7460 +n01729977 7460 +n01730812 7460 +n01730563 7460 +n01728572 7460 +n01728920 7460 +n01739381 7460 +n01734418 7460 +n01740131 7460 +n01735577 7497 +n01735439 7497 +n01734104 7498 +n01733957 7498 +n01732614 7500 +n01732789 7500 +n01737875 7502 +n01737472 7502 +n01737728 7502 +n01730185 7503 +n01730307 7503 +n01734808 7509 +n01734637 7509 +n01675722 7447 +n01693783 7447 +n01694709 7447 +n01684133 7447 +n01692333 7447 +n01695060 7447 +n01685808 7447 +n01676755 7447 +n01687665 7447 +n01674990 7447 +n01694178 7447 +n01692864 7447 +n01689411 7447 +n01681940 7531 +n01681653 7531 +n01678343 7531 +n01682714 7531 +n01682435 7531 +n01681328 7531 +n01680264 7531 +n01679626 7531 +n01677366 7531 +n01677747 7531 +n01679962 7531 +n01680655 7543 +n01680478 7543 +n01687978 7532 +n01689081 7532 +n01688243 7532 +n01693334 7535 +n01693175 7535 +n01690149 7536 +n01689811 7536 +n01700470 7448 +n01713764 7448 +n01701859 7557 +n01704323 7557 +n01515303 6527 +n01844917 6527 +n01524359 6527 +n01514668 6527 +n01833805 6527 +n01838038 6527 +n01825930 6527 +n01844551 6527 +n01604330 6527 +n01834918 6527 +n01822602 6527 +n01514752 6527 +n01517565 6527 +n01789386 6527 +n01844231 6527 +n01816887 6527 +n01517966 6527 +n01503976 6527 +n01514859 6527 +n02000954 7562 +n01858441 7562 +n02016358 7562 +n02021795 7562 +n01845132 7562 +n02008041 7580 +n02014237 7580 +n02021050 7580 +n02018795 7580 +n02005790 7580 +n02002075 7580 +n02013177 7580 +n02012849 7580 +n02013706 7580 +n02014524 7580 +n02007558 7580 +n02014941 7580 +n02006656 7580 +n02005399 7580 +n02022684 7580 +n02008497 7585 +n02010453 7585 +n02009229 7585 +n02011281 7585 +n02008643 7585 +n02008796 7585 +n02011460 7585 +n02010728 7601 +n02011016 7601 +n02009750 7605 +n02009508 7605 +n02009380 7605 +n02009912 7605 +n02010272 7605 +n02012185 7606 +n02011805 7606 +n02006063 7589 +n02006364 7589 +n02003204 7590 +n02002724 7590 +n02002556 7590 +n02004131 7590 +n02003839 7590 +n02004492 7590 +n02004855 7590 +n02017725 7596 +n02015357 7596 +n02016066 7596 +n02015554 7596 +n02018027 7596 +n02018368 7629 +n02018207 7629 +n02006985 7597 +n02007284 7597 +n02023341 7599 +n02034129 7599 +n02034295 7599 +n02036053 7599 +n02040266 7599 +n02037110 7599 +n02034661 7599 +n02031585 7599 +n02031934 7599 +n02030996 7599 +n02036711 7599 +n02026059 7599 +n02033779 7599 +n02038993 7599 +n02033561 7599 +n02037464 7599 +n02024479 7634 +n02025239 7634 +n02023992 7634 +n02024763 7634 +n02025043 7634 +n02023855 7634 +n02034971 7640 +n02035210 7640 +n02032222 7642 +n02032355 7642 +n02032480 7642 +n02033041 7642 +n02030287 7645 +n02027897 7645 +n02030837 7645 +n02029087 7645 +n02029378 7645 +n02028035 7645 +n02027075 7645 +n02028900 7645 +n02027492 7645 +n02029706 7645 +n02027357 7645 +n02028727 7645 +n02030035 7645 +n02026948 7645 +n02028175 7645 +n02028342 7676 +n02028451 7676 +n02037869 7649 +n02038466 7649 +n01858845 7581 +n01858906 7581 +n01860002 7581 +n01858281 7581 +n01859190 7581 +n01858780 7581 +n01859325 7581 +n01860187 7581 +n01859496 7581 +n01859689 7689 +n01859852 7689 +n02016956 7582 +n02017213 7582 +n02016816 7582 +n02040505 7583 +n02057731 7583 +n02050004 7583 +n02045369 7583 +n02049088 7583 +n02051474 7583 +n02055658 7583 +n02047614 7583 +n02041085 7695 +n02044178 7695 +n02043808 7695 +n02043333 7703 +n02041246 7703 +n02043063 7703 +n02042472 7707 +n02041678 7707 +n02042180 7707 +n02041875 7707 +n02042759 7707 +n02042046 7707 +n02044778 7704 +n02044517 7704 +n02059162 7696 +n02058221 7696 +n02058594 7696 +n02060411 7717 +n02060889 7717 +n02060133 7717 +n02050442 7697 +n02050313 7697 +n02051059 7697 +n02050586 7697 +n02050809 7697 +n02045864 7698 +n02046759 7698 +n02045596 7698 +n02047260 7729 +n02046939 7729 +n02047411 7729 +n02047045 7729 +n02052775 7700 +n02054036 7700 +n02054502 7700 +n02051845 7700 +n02053083 7700 +n02054711 7700 +n02055107 7700 +n02052204 7738 +n02052365 7738 +n02053425 7739 +n02053584 7739 +n02055803 7701 +n02056728 7746 +n02057035 7746 +n02056570 7746 +n02057330 7746 +n02056228 7746 +n02048115 7702 +n02048353 7702 +n02047975 7702 +n01845477 7584 +n01855672 7755 +n01846331 7755 +n01856890 7756 +n01857851 7756 +n01857079 7756 +n01856380 7756 +n01857512 7756 +n01857325 7756 +n01856072 7756 +n01856553 7756 +n01856155 7756 +n01857632 7756 +n01847253 7757 +n01851375 7757 +n01849676 7757 +n01852329 7757 +n01850192 7757 +n01847978 7757 +n01852400 7757 +n01848840 7757 +n01849157 7757 +n01847806 7757 +n01849466 7757 +n01848123 7757 +n01850553 7757 +n01847089 7757 +n01851895 7757 +n01849863 7757 +n01852142 7757 +n01847000 7757 +n01852671 7757 +n01848976 7757 +n01847407 7757 +n01848648 7757 +n01852861 7757 +n01851207 7757 +n01851038 7757 +n01850373 7757 +n01850873 7757 +n01847170 7757 +n01851573 7769 +n01851731 7769 +n01848555 7779 +n01848323 7779 +n01848453 7779 +n01853195 7790 +n01853870 7790 +n01854415 7790 +n01853498 7790 +n01853666 7790 +n01854838 7803 +n01855032 7803 +n01855476 7803 +n01855188 7803 +n01854700 7803 +n01584225 7563 +n01546506 7563 +n01546921 7563 +n01525720 7563 +n01546039 7563 +n01539573 7563 +n01585121 7811 +n01585715 7811 +n01584695 7811 +n01586374 7811 +n01584853 7811 +n01586020 7811 +n01552813 7813 +n01551711 7813 +n01555004 7813 +n01554448 7813 +n01547832 7813 +n01548301 7827 +n01549886 7827 +n01549430 7827 +n01550172 7827 +n01549641 7827 +n01555305 7827 +n01549053 7828 +n01548865 7828 +n01548492 7828 +n01563128 7814 +n01589718 7814 +n01578575 7814 +n01576695 7814 +n01528654 7814 +n01591697 7814 +n01594004 7814 +n01557185 7814 +n01527347 7814 +n01597022 7814 +n01598588 7814 +n01527617 7814 +n01576076 7814 +n01555809 7814 +n01587834 7814 +n01602630 7814 +n01597336 7814 +n01538955 7814 +n01529672 7814 +n01600657 7814 +n01601694 7814 +n01527194 7814 +n01586941 7814 +n01588002 7814 +n01527917 7814 +n01587526 7814 +n01601068 7814 +n01603600 7814 +n01602832 7814 +n01571904 7814 +n01575745 7814 +n01566645 7814 +n01594372 7814 +n01589286 7814 +n01526521 7814 +n01582856 7814 +n01528396 7814 +n01528845 7814 +n01556182 7814 +n01542786 7814 +n01590583 7814 +n01564914 7837 +n01567133 7837 +n01563746 7837 +n01564394 7837 +n01563449 7837 +n01565078 7837 +n01570676 7879 +n01570839 7879 +n01570267 7879 +n01567678 7879 +n01569060 7879 +n01568892 7879 +n01568294 7879 +n01569971 7879 +n01569262 7879 +n01567879 7879 +n01568720 7879 +n01569423 7879 +n01563945 7880 +n01564217 7880 +n01566207 7881 +n01565599 7881 +n01565930 7881 +n01564773 7881 +n01579410 7839 +n01581984 7839 +n01579578 7839 +n01582398 7839 +n01580077 7839 +n01579260 7839 +n01579028 7839 +n01582220 7839 +n01579149 7839 +n01580870 7906 +n01581166 7906 +n01577035 7840 +n01578180 7840 +n01577659 7840 +n01593028 7842 +n01592084 7842 +n01592694 7842 +n01592387 7842 +n01592540 7917 +n01592257 7917 +n01562265 7844 +n01558993 7844 +n01559477 7844 +n01558461 7844 +n01558307 7844 +n01558149 7844 +n01560105 7844 +n01558594 7844 +n01557962 7844 +n01558765 7844 +n01561732 7844 +n01562014 7844 +n01560280 7844 +n01562451 7844 +n01561452 7844 +n01560419 7844 +n01560636 7844 +n01559804 7844 +n01560793 7938 +n01560935 7938 +n01598988 7847 +n01599556 7847 +n01600085 7847 +n01599269 7942 +n01599159 7942 +n01597906 7853 +n01598074 7853 +n01597737 7853 +n01533651 7855 +n01534155 7855 +n01540233 7855 +n01531178 7855 +n01534762 7855 +n01533893 7855 +n01537134 7855 +n01531344 7855 +n01541386 7855 +n01531512 7855 +n01533481 7855 +n01541922 7855 +n01533000 7855 +n01544704 7855 +n01530575 7855 +n01532325 7855 +n01532511 7855 +n01531811 7855 +n01534582 7855 +n01532829 7855 +n01530439 7855 +n01533339 7855 +n01531971 7855 +n01534433 7855 +n01541102 7952 +n01540566 7952 +n01540832 7952 +n01536644 7954 +n01535469 7954 +n01536334 7954 +n01536186 7954 +n01535690 7954 +n01536780 7954 +n01536035 7954 +n01537544 7956 +n01538059 7956 +n01538630 7956 +n01537895 7956 +n01538200 7956 +n01603812 7864 +n01603953 7864 +n01573898 7866 +n01573074 7866 +n01572328 7866 +n01572782 7866 +n01574045 7866 +n01573240 7992 +n01573360 7992 +n01572654 7993 +n01572489 7993 +n01574560 7995 +n01575117 7995 +n01574390 7995 +n01575401 7995 +n01595450 7869 +n01595168 7869 +n01595624 7869 +n01594787 7869 +n01594968 7869 +n01595974 8006 +n01596273 8006 +n01583209 7872 +n01583495 7872 +n01543632 7876 +n01544389 7876 +n01591123 7877 +n01591005 7877 +n01591301 7877 +n01539925 7816 +n01540090 7816 +n01834540 7565 +n01834177 7565 +n01843065 7566 +n01838598 7566 +n01842235 7566 +n01843719 7566 +n01843383 7566 +n01839598 8023 +n01839330 8023 +n01839086 8023 +n01841102 8023 +n01841679 8023 +n01840775 8023 +n01839750 8023 +n01841441 8030 +n01841288 8030 +n01827403 7567 +n01826364 7567 +n01830915 7567 +n01830042 7567 +n01829413 7567 +n01826680 7567 +n01829869 7567 +n01828970 7567 +n01828556 8036 +n01827793 8036 +n01828096 8036 +n01616318 7569 +n01605630 7569 +n01618503 7569 +n01613294 7569 +n01621127 7569 +n01616764 8047 +n01618922 8047 +n01617766 8052 +n01617443 8052 +n01618082 8052 +n01617095 8052 +n01620414 8053 +n01619310 8053 +n01620735 8053 +n01619536 8053 +n01619835 8061 +n01620135 8061 +n01609751 8048 +n01606522 8048 +n01607812 8048 +n01608265 8048 +n01610955 8048 +n01610552 8048 +n01606809 8048 +n01616086 8048 +n01608432 8048 +n01607600 8048 +n01607962 8048 +n01606672 8048 +n01609956 8064 +n01610226 8064 +n01613177 8068 +n01611800 8068 +n01611472 8068 +n01612628 8068 +n01612476 8068 +n01612275 8068 +n01611969 8068 +n01612122 8068 +n01609391 8072 +n01609062 8072 +n01608814 8072 +n01613807 8050 +n01614343 8050 +n01615121 8050 +n01614925 8050 +n01614038 8050 +n01614556 8050 +n01615703 8091 +n01615458 8091 +n01622959 8051 +n01621635 8051 +n01623880 8051 +n01623425 8051 +n01622352 8051 +n01623615 8051 +n01622120 8051 +n01625562 8051 +n01623706 8051 +n01624115 8051 +n01624537 8051 +n01622483 8051 +n01623110 8051 +n01624833 8051 +n01622779 8051 +n01837072 7570 +n01835276 7570 +n01825278 7571 +n01823013 7571 +n01824575 8115 +n01824035 8115 +n01521399 7573 +n01521756 7573 +n01518878 7573 +n01519873 7573 +n01519563 7573 +n01789740 7574 +n01810700 7574 +n01801876 7574 +n01791463 7574 +n01791107 7574 +n02153203 7574 +n01794344 8123 +n01791954 8123 +n01794158 8123 +n01809106 8123 +n01791625 8123 +n01792429 8133 +n01792158 8133 +n01793435 8133 +n01792042 8133 +n01793715 8133 +n01792640 8133 +n01793249 8139 +n01792955 8139 +n01815601 8124 +n01811909 8124 +n01814370 8143 +n01812337 8143 +n01813088 8143 +n01812662 8143 +n01814921 8144 +n01814755 8144 +n01813532 8145 +n01813385 8145 +n01813948 8145 +n01814217 8145 +n01802721 8128 +n01810268 8128 +n01795088 8128 +n01803078 8154 +n01806567 8154 +n01807496 8154 +n01807105 8157 +n01803362 8157 +n01804163 8157 +n01805801 8157 +n01806297 8163 +n01806364 8163 +n01806143 8163 +n01806467 8163 +n01804478 8158 +n01806847 8158 +n01804653 8158 +n01808140 8159 +n01807828 8159 +n01797307 8156 +n01798484 8156 +n01797020 8156 +n01797886 8156 +n01797601 8156 +n01796729 8156 +n01795545 8156 +n01796340 8156 +n01819734 7576 +n01821203 7576 +n01819115 7576 +n01817346 7576 +n01818832 7576 +n01817953 7576 +n01818515 7576 +n01818299 7576 +n01820052 7576 +n01820348 7576 +n01817263 7576 +n01821869 8182 +n01822300 8182 +n01819313 8183 +n01819465 8183 +n01821076 8190 +n01820546 8190 +n01317089 6469 +n01317294 6469 +n01918744 6470 +n01922303 6470 +n01940736 6470 +n02316707 6470 +n01909422 6470 +n01767661 6470 +n01906749 6470 +n01930112 8201 +n01934440 8201 +n01924916 8201 +n01938454 8208 +n01935395 8208 +n01955084 8202 +n01955933 8202 +n01968315 8202 +n01942177 8202 +n01960459 8213 +n01963317 8213 +n01956481 8213 +n01963571 8213 +n01959985 8213 +n01965889 8213 +n01961985 8213 +n01957335 8218 +n01958038 8218 +n01959492 8218 +n01964441 8219 +n01964271 8219 +n01965529 8219 +n01969726 8214 +n01968897 8214 +n01972541 8214 +n01970164 8229 +n01970667 8229 +n01951274 8215 +n01953361 8215 +n01943899 8215 +n01945845 8215 +n01943087 8215 +n01953762 8215 +n01950731 8215 +n01945685 8215 +n01944390 8215 +n01949085 8237 +n01947396 8237 +n01946630 8237 +n01944812 8242 +n01945143 8242 +n01944955 8242 +n02317335 8203 +n02321170 8203 +n02319555 8203 +n02319095 8203 +n02321529 8203 +n02317781 8203 +n01909906 8204 +n01914163 8204 +n01913166 8204 +n01910747 8204 +n01915700 8256 +n01914609 8256 +n01915811 8256 +n01916925 8261 +n01916187 8261 +n01916481 8261 +n01917882 8262 +n01917289 8262 +n01784675 8205 +n01974773 8205 +n01768244 8205 +n01786646 8205 +n01769347 8205 +n01787835 8205 +n02309242 8205 +n02159955 8205 +n01785667 8205 +n01994910 8268 +n01976868 8268 +n01990007 8268 +n01975687 8268 +n01976146 8268 +n01990800 8279 +n01992773 8279 +n01991520 8281 +n01991028 8281 +n01982650 8280 +n01986806 8280 +n01986214 8280 +n01987545 8280 +n01976957 8280 +n01985128 8280 +n01984245 8285 +n01984695 8285 +n01983481 8285 +n01981276 8289 +n01979874 8289 +n01978455 8289 +n01978287 8289 +n01980166 8289 +n01982068 8289 +n01770393 8271 +n01770081 8271 +n01776192 8271 +n01772222 8271 +n01776313 8302 +n01779629 8302 +n01779148 8302 +n01772664 8303 +n01775370 8303 +n01774750 8303 +n01775062 8303 +n01773797 8303 +n01774384 8303 +n01773157 8303 +n01773549 8303 +n02226183 8274 +n02236896 8274 +n02263378 8274 +n02232951 8274 +n02163297 8274 +n02262449 8274 +n02246011 8274 +n02188699 8274 +n02272871 8274 +n02273392 8274 +n02231052 8274 +n02161457 8274 +n02236355 8274 +n02312427 8274 +n02231487 8274 +n02162561 8274 +n02164464 8274 +n02241569 8274 +n02262803 8274 +n02206270 8274 +n02274024 8274 +n02312640 8274 +n02268148 8274 +n02270623 8274 +n02207805 8274 +n02226429 8315 +n02229544 8315 +n02228341 8340 +n02226970 8340 +n02241426 8316 +n02240517 8316 +n02266050 8317 +n02264885 8317 +n02264363 8317 +n02236044 8318 +n02236241 8318 +n02233338 8318 +n02234355 8351 +n02234848 8351 +n02233943 8351 +n02251775 8321 +n02256656 8321 +n02258198 8321 +n02257284 8321 +n02250822 8321 +n02259212 8321 +n02252226 8321 +n02200198 8322 +n02205219 8322 +n02203152 8322 +n02196344 8322 +n02190166 8322 +n02198859 8322 +n02196119 8322 +n02201000 8362 +n02202006 8362 +n02195819 8366 +n02195526 8366 +n02192513 8366 +n02191773 8366 +n02190790 8366 +n02192252 8374 +n02191979 8374 +n02169974 8331 +n02168245 8331 +n02167151 8331 +n02169023 8331 +n02165456 8331 +n02171453 8331 +n02180875 8331 +n02183096 8331 +n02169497 8331 +n02176261 8331 +n02176439 8331 +n02165105 8331 +n02177972 8331 +n02168699 8331 +n02166567 8382 +n02166826 8382 +n02171869 8383 +n02175916 8383 +n02175569 8394 +n02172870 8394 +n02173373 8394 +n02174001 8394 +n02172182 8394 +n02172518 8394 +n02174659 8394 +n02243562 8332 +n02244797 8332 +n02212062 8334 +n02218371 8334 +n02219486 8334 +n02206856 8334 +n02216211 8405 +n02215770 8405 +n02212602 8405 +n02213107 8411 +n02212958 8411 +n02213543 8411 +n02213239 8412 +n02213788 8412 +n02220804 8407 +n02221083 8407 +n02221414 8407 +n02209354 8408 +n02208280 8408 +n02211627 8408 +n02210427 8408 +n02211444 8408 +n02209624 8408 +n02208498 8421 +n02208848 8421 +n02274259 8335 +n02283201 8335 +n02281787 8428 +n02274822 8428 +n02281406 8428 +n02277742 8428 +n02279972 8428 +n02280649 8428 +n02282257 8430 +n02282903 8430 +n02282385 8430 +n02275773 8431 +n02278210 8431 +n02276258 8431 +n02276902 8431 +n02279257 8431 +n02277094 8431 +n02276078 8431 +n02275560 8431 +n02277268 8431 +n02276355 8431 +n02276749 8431 +n02278024 8431 +n02281015 8435 +n02281136 8435 +n02305929 8429 +n02301452 8429 +n02295064 8429 +n02298541 8429 +n02284611 8429 +n02287004 8429 +n02291572 8429 +n02305085 8454 +n02301935 8454 +n02304432 8454 +n02303284 8454 +n02302969 8454 +n02292692 8459 +n02291748 8459 +n02268443 8337 +n02268853 8337 +n01321123 6471 +n02376679 6471 +n01323493 6471 +n01338685 5175 +n01387065 5175 +n01339083 8472 +n01339336 8472 +n01339801 8472 +n01339471 8472 +n01397114 8473 +n01389507 8473 +n01397871 8478 +n01410457 8478 +n01407798 8478 +n01424420 8479 +n01392380 8479 +n01395254 8479 +n01396048 8479 +n11542137 5176 +n11544015 5176 +n11542640 5176 +n09626238 5177 +n09856671 5177 +n09605289 5177 +n09622049 5177 +n09971273 5177 +n09882716 5177 +n09621232 5177 +n09902954 5177 +n09620794 5177 +n09727440 5177 +n09624168 5177 +n09752519 5177 +n10378026 5177 +n10500217 5177 +n10514429 5177 +n09610405 5177 +n09617867 5177 +n10355449 5177 +n09618957 5177 +n10002760 5177 +n10384496 5177 +n09637339 5177 +n09613191 5177 +n09836160 5177 +n10274815 5177 +n09890749 5177 +n10112591 5177 +n10260706 5177 +n09606527 5177 +n09767197 5177 +n10709529 5177 +n09976429 5177 +n09918554 5177 +n10588074 5177 +n10565667 5177 +n09990415 5177 +n10120330 5177 +n09616922 5177 +n09622302 5177 +n09630641 5177 +n09796809 5177 +n09614684 5177 +n10635788 5177 +n09645091 5177 +n10405694 5177 +n09676884 5177 +n09638875 5177 +n09874428 5177 +n09627906 5177 +n09628382 5177 +n10522759 5177 +n10247880 5177 +n09624980 5177 +n10529231 5177 +n10024362 5177 +n09614315 5177 +n09612848 5177 +n09632518 5177 +n10147935 5177 +n09871867 5177 +n09620078 5177 +n09634494 5177 +n10077593 5177 +n10040945 5177 +n09623038 5177 +n10560106 5177 +n10289039 5177 +n10422405 5177 +n09774783 5177 +n10042845 5177 +n09831962 5177 +n10726031 5177 +n09923673 5177 +n09610660 5177 +n09626031 5177 +n10401331 5177 +n09621545 5177 +n10362319 5177 +n10665698 5177 +n09906449 5177 +n09939313 5177 +n10439373 5177 +n09607630 5177 +n09631463 5177 +n10451450 5177 +n10541229 5177 +n09793141 5177 +n10633450 5177 +n10530959 5177 +n09629752 5177 +n10560637 5177 +n10431625 5177 +n09619168 5177 +n09763784 5177 +n09636339 5177 +n10235549 5177 +n09845401 5177 +n10513823 5177 +n10610465 5177 +n09951274 5177 +n09816771 8490 +n10401829 8590 +n10307234 8590 +n10505613 8590 +n10148035 8591 +n09874725 8591 +n09944022 8592 +n10015485 8592 +n10728624 8592 +n10308168 8592 +n10200781 8492 +n10480253 8492 +n10376523 8492 +n09903153 8600 +n10748620 8600 +n10581890 8601 +n10045713 8601 +n10165109 8601 +n10694258 8606 +n10509063 8606 +n10559996 8606 +n10366966 8607 +n10305802 8607 +n10421470 8607 +n10164492 8611 +n10477713 8611 +n10020890 8612 +n10679174 8616 +n10632576 8616 +n10189278 8616 +n09894445 8618 +n10504206 8618 +n10559288 8493 +n09917593 8493 +n09833441 8623 +n10384392 8623 +n10060352 8495 +n09840217 8495 +n09777012 8495 +n10309896 8495 +n09905185 8495 +n10686885 8628 +n10209731 8628 +n10093818 8629 +n10754189 8629 +n10411551 8629 +n10577284 8629 +n10285313 8500 +n10333439 8500 +n10624074 8500 +n10287213 8500 +n09871229 8637 +n10078719 8637 +n09843443 8637 +n10173771 8640 +n10192839 8640 +n10419785 8640 +n10406266 8640 +n10288964 8640 +n10804287 8640 +n10665587 8640 +n10153414 8640 +n10406765 8640 +n10611613 8506 +n09805324 8506 +n09824361 8506 +n10316360 8506 +n10707233 8506 +n10696508 8506 +n09858165 8506 +n10175248 8655 +n09979321 8655 +n10692482 8661 +n10396106 8661 +n10427764 8657 +n10385566 8657 +n10439851 8512 +n09820263 8512 +n10533013 8512 +n09854421 8666 +n10304914 8666 +n10575463 8666 +n09915651 8666 +n10453184 8666 +n10101634 8667 +n10701180 8667 +n09835230 8667 +n10746931 8667 +n10542888 8667 +n10604491 8667 +n09764381 8667 +n09929298 8667 +n10019406 8667 +n09785659 8667 +n10618342 8667 +n10782471 8667 +n10701644 8667 +n10105733 8667 +n10638922 8667 +n09842047 8667 +n10315561 8667 +n09835506 8667 +n10153594 8667 +n09830194 8674 +n10263411 8674 +n10157128 8693 +n10498816 8693 +n10689306 8693 +n10604380 8679 +n10634849 8679 +n09923561 8680 +n09764598 8680 +n10086568 8691 +n10007684 8691 +n09841696 8691 +n10321340 8691 +n10092488 8702 +n10386984 8702 +n10387196 8702 +n10205457 8702 +n10578021 8668 +n10098710 8668 +n09836519 8513 +n09836786 8513 +n09836343 8513 +n09877951 8516 +n10300154 8516 +n10095769 8516 +n10435988 8520 +n09930257 8718 +n10387324 8718 +n10098862 8525 +n10642596 8721 +n10331167 8721 +n09946814 8527 +n10299250 8527 +n09896170 8527 +n10415638 8527 +n10091450 8727 +n10069296 8727 +n09989502 8727 +n10226413 8727 +n10493685 8727 +n09765278 8727 +n09930876 8727 +n10340312 8727 +n09990777 8730 +n09834699 8730 +n10737103 8733 +n10649197 8733 +n10701962 8735 +n10415037 8735 +n10151760 8735 +n10229883 8735 +n10732010 8735 +n10603851 8735 +n10599806 8735 +n10369317 8735 +n09903501 8735 +n10755080 8735 +n10098245 8735 +n10382825 8735 +n10536416 8735 +n10036929 8735 +n10624310 8746 +n09842528 8746 +n10085869 8528 +n09991867 8528 +n10078131 8528 +n10627252 8528 +n10682953 8528 +n10237196 8528 +n09789566 8529 +n10182190 8529 +n09899671 8529 +n10150071 8531 +n10091651 8531 +n10806113 8531 +n10249459 8531 +n10317500 8768 +n09822830 8768 +n10448983 8768 +n09862621 8771 +n10540114 8771 +n10009276 8771 +n10333838 8771 +n10730728 8771 +n10721321 8771 +n09659188 8533 +n09650729 8533 +n09652149 8533 +n09659039 8533 +n09729530 8536 +n09641002 8536 +n09725653 8782 +n09846469 8782 +n09750770 8782 +n10486166 8538 +n10169147 8538 +n09684901 8539 +n09683757 8539 +n09682291 8539 +n10364198 8539 +n10518602 8539 +n10341573 8791 +n10672371 8791 +n10332861 8793 +n10112129 8793 +n10602470 8793 +n10727256 8542 +n10508141 8542 +n10652605 8799 +n09881265 8799 +n09933098 8545 +n09812338 8545 +n09920283 8545 +n10078806 8545 +n10339966 8804 +n10667477 8804 +n10566072 8804 +n10469874 8804 +n10624540 8807 +n09809925 8807 +n09846755 8806 +n09873899 8806 +n09779790 8806 +n10034614 8546 +n10449664 8546 +n10034201 8546 +n09951616 8546 +n10037385 8818 +n09846894 8818 +n10282672 8547 +n10053808 8547 +n09815790 8547 +n10137825 8547 +n10605985 8547 +n10604979 8547 +n09861946 8547 +n10763383 8823 +n09841188 8823 +n10644598 8823 +n10548681 8823 +n10791221 8823 +n10583790 8823 +n09873473 8823 +n10763620 8823 +n10548537 8823 +n10120671 8823 +n10241300 8833 +n10318293 8833 +n10176679 8839 +n09932508 8839 +n10186216 8841 +n10134178 8841 +n10079399 8841 +n09821831 8824 +n09934337 8824 +n10324560 8824 +n10063461 8846 +n09886403 8846 +n09760609 8846 +n10260800 8846 +n10655594 8846 +n09938449 8849 +n10183931 8849 +n09972458 8848 +n09813219 8848 +n10049363 8826 +n10372373 8826 +n10076604 8826 +n09835348 8826 +n09974648 8826 +n10433164 8826 +n09859152 8826 +n10727171 8826 +n10308732 8826 +n09833536 8826 +n10582746 8826 +n10393909 8826 +n10013927 8859 +n10225219 8859 +n10202624 8859 +n09800964 8859 +n10465831 8859 +n09787534 8870 +n10174445 8870 +n10441962 8870 +n10132035 8862 +n09896685 8862 +n09934774 8862 +n10279018 8862 +n10793570 8862 +n10155849 8862 +n10087434 8863 +n09964202 8863 +n09811852 8868 +n10348526 8868 +n10317007 8868 +n10058777 8868 +n10360747 8888 +n09941964 8888 +n10347446 8888 +n09770359 8888 +n09941787 8888 +n09942970 8888 +n09809749 8888 +n09770179 8888 +n10208950 8888 +n10580772 8890 +n10093475 8899 +n10645017 8899 +n09943239 8895 +n09943541 8895 +n10263790 8895 +n10283170 8902 +n10259348 8902 +n10092978 8902 +n10296176 8902 +n09893191 8902 +n10123844 8902 +n10259780 8902 +n10259997 8903 +n10510245 8903 +n10622053 8889 +n10058585 8889 +n10690648 8914 +n10523341 8914 +n10739391 8914 +n10476467 8915 +n10512372 8915 +n10802507 8915 +n10753442 8550 +n09733793 8550 +n09738708 8550 +n09641757 8550 +n09738400 8550 +n09727826 8550 +n09686536 8550 +n09724533 8550 +n09744834 8924 +n09743792 8924 +n09744161 8924 +n09742101 8924 +n09689435 8925 +n09734450 8925 +n09644152 8925 +n09750282 8925 +n09673495 8925 +n09718811 8925 +n09718217 8925 +n09712696 8925 +n09718936 8925 +n10711766 8925 +n09694771 8925 +n09719794 8925 +n09714694 8925 +n09675922 8938 +n09676247 8938 +n10774440 8926 +n09720256 8926 +n09725229 8926 +n09731571 8926 +n09691729 8949 +n09693982 8949 +n09712448 8949 +n09697401 8951 +n09696585 8951 +n09722658 8956 +n09724656 8956 +n09723067 8956 +n09694664 8952 +n09712324 8952 +n09689958 8928 +n09695979 8928 +n10327987 8928 +n09688804 8928 +n09730204 8928 +n09711435 8928 +n09713108 8928 +n09731343 8928 +n09717233 8928 +n09695620 8928 +n09728285 8928 +n09707289 8928 +n09701833 8928 +n09700964 8928 +n09750891 8928 +n09715427 8928 +n09708750 8928 +n09705784 8551 +n09734185 8551 +n09752023 8551 +n09635534 8551 +n09696456 8551 +n09732170 8551 +n09730824 8551 +n09719309 8551 +n09734535 8551 +n09736945 8551 +n09720842 8551 +n09692915 8551 +n09751895 8551 +n09724785 8551 +n09747495 8551 +n09734639 8551 +n09749386 8551 +n09705124 8551 +n09731436 8551 +n10303814 8554 +n10450303 8554 +n10722575 8554 +n10054657 8554 +n10631309 8554 +n10249270 8554 +n09913455 8554 +n10162991 8554 +n09807754 8554 +n09505153 8554 +n10209082 8554 +n10323634 8554 +n10104064 8554 +n10001481 9000 +n10242328 9000 +n10159045 9001 +n09932098 9001 +n10253995 9004 +n10005934 9016 +n10578471 9016 +n09770949 9006 +n10004718 9006 +n10570019 9006 +n10289462 9019 +n10069645 9019 +n10187990 9019 +n09916348 9023 +n10727458 9023 +n10320863 9023 +n10572706 9021 +n10572889 9021 +n10038409 9007 +n10756148 9007 +n09927451 9008 +n10243664 9008 +n10502329 9008 +n09988493 9008 +n10373390 9032 +n10470779 9032 +n09928136 9032 +n10750031 9037 +n10081204 9037 +n09857200 9037 +n10013811 9041 +n09894143 9041 +n10313239 9041 +n10082997 8558 +n10677713 8558 +n09787765 8558 +n10485883 8558 +n10275395 9046 +n09913593 9046 +n09772930 8560 +n09633969 8560 +n10195593 9052 +n09756049 9052 +n10607478 9052 +n09855433 8563 +n10017272 8563 +n10630188 8563 +n10522035 8563 +n10521662 8563 +n10380672 9058 +n10210911 9058 +n10382710 9059 +n10164747 9059 +n09782397 9059 +n10524076 9059 +n10467395 9064 +n10467179 9064 +n10698368 9060 +n09792969 9060 +n10525617 8564 +n10675010 8564 +n09889941 8564 +n10557854 8566 +n09618760 8566 +n09899929 8566 +n10116702 9074 +n10258786 9074 +n10508710 9074 +n09873348 8570 +n09870208 8570 +n10793168 8570 +n10098517 9081 +n10314517 9081 +n10629939 9081 +n10477077 9081 +n10261624 9086 +n10082687 9086 +n10262445 9086 +n10167152 9082 +n10098624 9082 +n10674713 9082 +n09838621 9082 +n10047459 8573 +n10091564 8573 +n10740868 8573 +n09872066 9094 +n10070711 9094 +n10628644 8575 +n10421016 8575 +n09915434 8575 +n10588357 8575 +n10529965 8579 +n10334009 8579 +n10339717 8579 +n09818022 8579 +n10412055 8579 +n10335931 8579 +n09945745 8579 +n10432441 8579 +n10607291 8579 +n10583387 8579 +n10718131 8579 +n10542761 8579 +n10147121 8579 +n10738111 9103 +n10159533 9103 +n10223177 9103 +n10185793 9103 +n10553235 9107 +n10293332 9107 +n10178216 9108 +n10563403 9108 +n10488656 8580 +n10619642 8580 +n10276477 8580 +n10620758 9125 +n10450161 9125 +n10043643 9125 +n10043491 9129 +n10313724 9129 +n10084295 8582 +n10787470 8582 +n10333601 8582 +n10131151 8582 +n09871681 9132 +n09981939 9132 +n10055410 9133 +n10243137 9133 +n10377021 9133 +n10368528 9133 +n10025635 9133 +n09874862 9133 +n10613996 9133 +n10472129 9133 +n10598181 9133 +n10129825 9133 +n09847543 9133 +n10173410 9133 +n10780284 9133 +n09889065 9133 +n09832456 9133 +n10780632 9133 +n10117851 9147 +n09827363 9147 +n10247358 9147 +n10282482 9147 +n10092794 9153 +n10375314 9153 +n09981278 9153 +n10082043 8585 +n09972010 8585 +n10237069 8585 +n09792555 8585 +n10236946 8585 +n10568358 8585 +n10207169 8585 +n10236304 8585 +n10734394 8585 +n10373998 8585 +n10595164 8585 +n10357613 9163 +n09823502 9163 +n10146104 9163 +n10602985 9163 +n10145239 9163 +n10267865 9175 +n09854218 9175 +n10399491 9164 +n10102800 9164 +n10102369 9164 +n10406391 9164 +n10300500 9179 +n10080869 9179 +n10332385 9179 +n09988063 9184 +n10375402 9184 +n10145774 9181 +n10143172 9181 +n10145590 9181 +n10345015 9189 +n10142747 9189 +n10142391 9189 +n10146002 9165 +n10267311 9165 +n10141590 9170 +n10092643 9170 +n09918248 9170 +n10671613 9170 +n10141732 9196 +n10145340 9196 +n10145902 9201 +n10145480 9201 +n09827683 9198 +n10135129 9204 +n10465451 9204 +n10353016 9204 +n13001930 5178 +n13040629 5178 +n12969131 5178 +n12985420 5178 +n13052670 5178 +n13037406 5178 +n13077295 5178 +n12987056 5178 +n12979829 5178 +n12975804 5178 +n12974987 5178 +n12985773 5178 +n13044778 5178 +n12985857 5178 +n13035241 5178 +n13043926 5178 +n12982468 5178 +n13035707 5178 +n13044375 5178 +n12969425 5178 +n13060190 5178 +n13054073 5178 +n13040303 5178 +n13028611 5178 +n12997654 5178 +n12983048 5178 +n13062421 5178 +n13054560 5178 +n12963628 9214 +n12980840 9214 +n12991184 9215 +n12989938 9215 +n12992177 9215 +n12988158 9215 +n13029326 9231 +n13029760 9231 +n13011595 9232 +n13049953 9232 +n12998815 9232 +n12997919 9232 +n13052931 9245 +n13050397 9245 +n13012253 9246 +n13001041 9246 +n13005984 9246 +n13000891 9246 +n13007417 9246 +n13019835 9246 +n13013764 9246 +n13006894 9246 +n13002750 9246 +n13017102 9246 +n13232779 9246 +n13009429 9246 +n13013534 9246 +n13003522 9246 +n13001366 9246 +n13009085 9246 +n13022210 9246 +n13002925 9246 +n13006171 9246 +n13003712 9246 +n13001206 9246 +n13004423 9246 +n13001529 9246 +n13003254 9246 +n13003061 9246 +n13032115 9247 +n13032381 9275 +n13033577 9275 +n13055577 9235 +n13055949 9235 +n13055423 9235 +n05430628 5171 +n05450617 9281 +n05449959 9281 +n05451384 9283 +n05453657 9283 +n09369169 1043 +n09454412 1043 +n09403211 1043 +n13086908 1043 +n09416076 1043 +n09251407 1043 +n05218119 1043 +n09444100 1043 +n09438940 1043 +n09257949 1043 +n09189157 9286 +n09475044 9286 +n11691857 9289 +n13102775 9289 +n13087625 9289 +n13022709 9289 +n11675842 9300 +n13152742 9300 +n13125117 9300 +n13129165 9300 +n11690254 9300 +n11669335 9302 +n13134947 9302 +n11676500 9302 +n11675025 9307 +n11674332 9307 +n11669786 9307 +n13131028 9311 +n13132338 9311 +n13132656 9311 +n12301445 9308 +n13133613 9308 +n13141415 9308 +n13137409 9308 +n12642090 9308 +n12267677 9308 +n12658481 9308 +n12144313 9308 +n12158031 9308 +n13135832 9308 +n12620546 9308 +n11636835 9308 +n13139055 9308 +n12144580 9325 +n07929351 9325 +n13136556 9325 +n12768682 9325 +n11689483 9325 +n13136316 9325 +n07770571 9325 +n07737081 9331 +n07774842 9336 +n07774596 9336 +n07775050 9336 +n07772788 9336 +n07771212 9336 +n07772147 9336 +n07772274 9336 +n07774719 9336 +n07737745 9336 +n07772935 9336 +n15086247 9333 +n11879895 9333 +n12576323 9334 +n12532564 9334 +n07814634 9335 +n07775197 9335 +n07770763 9335 +n11748002 9328 +n12172364 9328 +n12515925 9354 +n12560282 9354 +n12578916 9354 +n12560621 9354 +n12544539 9354 +n12024690 9303 +n13154494 9303 +n11690455 9303 +n12927013 9304 +n11953610 9304 +n13128365 9305 +n13133932 9305 +n13163991 9305 +n13134059 9305 +n13131618 9305 +n13130726 9305 +n11678010 9305 +n12136392 9305 +n11979964 9366 +n12088223 9366 +n12462805 9369 +n12433081 9369 +n09218494 9290 +n09381242 9290 +n09460046 9290 +n09451237 9293 +n09450163 9293 +n01904182 9295 +n13155095 9295 +n09432283 9295 +n11705387 9295 +n09438844 9295 +n11692265 9295 +n05237755 9295 +n09416890 9295 +n01956764 9383 +n01904806 9383 +n01904886 9383 +n05586759 9389 +n05581932 9389 +n01904029 9389 +n05238282 9389 +n05254795 9389 +n02469248 9389 +n05256862 9398 +n05258051 9398 +n01899894 9398 +n05261404 9398 +n05259914 9400 +n05261310 9400 +n05260240 9400 +n05262185 9403 +n05261566 9403 +n05262534 9407 +n05262422 9407 +n05263183 9408 +n05263448 9408 +n11524662 3 +n11448153 3 +n09247410 3 +n11508382 9413 +n11524451 9413 From 60e952ba694e3e0811db5868d70ad7ebfe676836 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 26 Mar 2017 23:42:30 -0700 Subject: [PATCH 004/118] :eyeofthetiger::noseofthetiger::eyeofthetiger2: --- Makefile | 6 +- cfg/coco.data | 4 +- cfg/go.cfg | 135 +++++ cfg/go.test.cfg | 35 +- cfg/tiny-yolo-voc.cfg | 2 +- cfg/yolo-voc.2.0.cfg | 244 +++++++++ cfg/yolo-voc.cfg | 26 +- cfg/yolo.2.0.cfg | 244 +++++++++ cfg/yolo.cfg | 32 +- scripts/voc_label.py | 13 +- src/batchnorm_layer.c | 150 ++++-- src/blas.c | 33 +- src/blas.h | 8 +- src/blas_kernels.cu | 77 ++- src/box.c | 8 +- src/box.h | 2 +- src/classifier.c | 12 +- src/convolutional_kernels.cu | 52 +- src/convolutional_layer.c | 37 +- src/cost_layer.c | 15 + src/cuda.c | 9 + src/cuda.h | 1 + src/darknet.c | 24 +- src/data.c | 102 ++-- src/data.h | 4 +- src/deconvolutional_kernels.cu | 129 +++-- src/deconvolutional_layer.c | 203 +++++--- src/deconvolutional_layer.h | 29 +- src/detection_layer.c | 8 +- src/detector.c | 202 ++++++- src/go.c | 326 +++++++----- src/image.c | 108 +++- src/image.h | 7 + src/layer.c | 2 - src/layer.h | 13 +- src/local_layer.c | 28 +- src/lsd.c | 924 +++++++++++++++++++++++++++++++++ src/matrix.c | 15 + src/matrix.h | 1 + src/network.c | 39 +- src/network.h | 4 + src/network_kernels.cu | 18 +- src/nightmare.c | 114 +++- src/parser.c | 51 +- src/parser.h | 2 +- src/region_layer.c | 248 +++++---- src/regressor.c | 261 ++++++++++ src/reorg_layer.c | 76 ++- src/reorg_layer.h | 2 +- src/softmax_layer.c | 36 +- src/super.c | 6 +- src/tree.c | 14 +- src/tree.h | 6 +- 53 files changed, 3486 insertions(+), 661 deletions(-) create mode 100644 cfg/go.cfg create mode 100644 cfg/yolo-voc.2.0.cfg create mode 100644 cfg/yolo.2.0.cfg create mode 100644 src/lsd.c create mode 100644 src/regressor.c diff --git a/Makefile b/Makefile index 3d3d5e430ae..f0de805ffb6 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ -gencode arch=compute_52,code=[sm_52,compute_52] # This is what I use, uncomment if you know your arch and want to specify -# ARCH= -gencode arch=compute_52,code=compute_52 +ARCH= -gencode arch=compute_52,code=compute_52 VPATH=./src/ EXEC=darknet @@ -48,10 +48,10 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o detector.o layer.o compare.o classifier.o local_layer.o swag.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o rnn.o rnn_vid.o crnn_layer.o demo.o tag.o cifar.o go.o batchnorm_layer.o art.o region_layer.o reorg_layer.o super.o voxel.o tree.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o detector.o layer.o compare.o regressor.o classifier.o local_layer.o swag.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o rnn.o rnn_vid.o crnn_layer.o demo.o tag.o cifar.o go.o batchnorm_layer.o art.o region_layer.o reorg_layer.o lsd.o super.o voxel.o tree.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ -OBJ+=convolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o network_kernels.o avgpool_layer_kernels.o +OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o network_kernels.o avgpool_layer_kernels.o endif OBJS = $(addprefix $(OBJDIR), $(OBJ)) diff --git a/cfg/coco.data b/cfg/coco.data index 610151dc50b..30038417c27 100644 --- a/cfg/coco.data +++ b/cfg/coco.data @@ -1,7 +1,7 @@ classes= 80 train = /home/pjreddie/data/coco/trainvalno5k.txt -#valid = coco_testdev -valid = data/coco_val_5k.list +valid = coco_testdev +#valid = data/coco_val_5k.list names = data/coco.names backup = /home/pjreddie/backup/ eval=coco diff --git a/cfg/go.cfg b/cfg/go.cfg new file mode 100644 index 00000000000..77d20c4da1b --- /dev/null +++ b/cfg/go.cfg @@ -0,0 +1,135 @@ +[net] +batch=512 +subdivisions=1 +height=19 +width=19 +channels=1 +momentum=0.9 +decay=0.0005 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=10000000 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=256 +size=3 +stride=1 +pad=1 +activation=relu +batch_normalize=1 + +[convolutional] +filters=1 +size=1 +stride=1 +pad=1 +activation=linear + +[reorg] +extra=1 +stride=1 + +[softmax] + +[cost] +type=sse + diff --git a/cfg/go.test.cfg b/cfg/go.test.cfg index 6b92d335cd1..ba15c2e57c4 100644 --- a/cfg/go.test.cfg +++ b/cfg/go.test.cfg @@ -7,13 +7,13 @@ channels=1 momentum=0.9 decay=0.0005 -learning_rate=0.1 +learning_rate=0.01 policy=poly power=4 -max_batches=400000 +max_batches=100000 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -21,7 +21,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -29,7 +29,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -37,7 +37,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -45,7 +45,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -53,7 +53,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -61,7 +61,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -69,7 +69,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -77,7 +77,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -85,7 +85,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -93,7 +93,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -101,7 +101,7 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 @@ -109,14 +109,13 @@ activation=relu batch_normalize=1 [convolutional] -filters=192 +filters=256 size=3 stride=1 pad=1 activation=relu batch_normalize=1 - [convolutional] filters=1 size=1 @@ -124,6 +123,10 @@ stride=1 pad=1 activation=linear +[reorg] +extra=1 +stride=1 + [softmax] [cost] diff --git a/cfg/tiny-yolo-voc.cfg b/cfg/tiny-yolo-voc.cfg index 1f33c35b1f0..ab2c066a216 100644 --- a/cfg/tiny-yolo-voc.cfg +++ b/cfg/tiny-yolo-voc.cfg @@ -12,7 +12,7 @@ exposure = 1.5 hue=.1 learning_rate=0.001 -max_batches = 40100 +max_batches = 40200 policy=steps steps=-1,100,20000,30000 scales=.1,10,.1,.1 diff --git a/cfg/yolo-voc.2.0.cfg b/cfg/yolo-voc.2.0.cfg new file mode 100644 index 00000000000..ceb3f2acf0b --- /dev/null +++ b/cfg/yolo-voc.2.0.cfg @@ -0,0 +1,244 @@ +[net] +batch=64 +subdivisions=8 +height=416 +width=416 +channels=3 +momentum=0.9 +decay=0.0005 +angle=0 +saturation = 1.5 +exposure = 1.5 +hue=.1 + +learning_rate=0.0001 +max_batches = 45000 +policy=steps +steps=100,25000,35000 +scales=10,.1,.1 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + + +####### + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[route] +layers=-9 + +[reorg] +stride=2 + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=125 +activation=linear + +[region] +anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 +bias_match=1 +classes=20 +coords=4 +num=5 +softmax=1 +jitter=.2 +rescore=1 + +object_scale=5 +noobject_scale=1 +class_scale=1 +coord_scale=1 + +absolute=1 +thresh = .6 +random=0 diff --git a/cfg/yolo-voc.cfg b/cfg/yolo-voc.cfg index ceb3f2acf0b..9f3e0d51f9d 100644 --- a/cfg/yolo-voc.cfg +++ b/cfg/yolo-voc.cfg @@ -11,11 +11,12 @@ saturation = 1.5 exposure = 1.5 hue=.1 -learning_rate=0.0001 -max_batches = 45000 +learning_rate=0.001 +burn_in=1000 +max_batches = 80200 policy=steps -steps=100,25000,35000 -scales=10,.1,.1 +steps=40000,60000 +scales=.1,.1 [convolutional] batch_normalize=1 @@ -203,11 +204,19 @@ activation=leaky [route] layers=-9 +[convolutional] +batch_normalize=1 +size=1 +stride=1 +pad=1 +filters=64 +activation=leaky + [reorg] stride=2 [route] -layers=-1,-3 +layers=-1,-4 [convolutional] batch_normalize=1 @@ -224,14 +233,15 @@ pad=1 filters=125 activation=linear + [region] -anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 +anchors = 1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071 bias_match=1 classes=20 coords=4 num=5 softmax=1 -jitter=.2 +jitter=.3 rescore=1 object_scale=5 @@ -241,4 +251,4 @@ coord_scale=1 absolute=1 thresh = .6 -random=0 +random=1 diff --git a/cfg/yolo.2.0.cfg b/cfg/yolo.2.0.cfg new file mode 100644 index 00000000000..fda339a2b00 --- /dev/null +++ b/cfg/yolo.2.0.cfg @@ -0,0 +1,244 @@ +[net] +batch=1 +subdivisions=1 +width=416 +height=416 +channels=3 +momentum=0.9 +decay=0.0005 +angle=0 +saturation = 1.5 +exposure = 1.5 +hue=.1 + +learning_rate=0.001 +max_batches = 120000 +policy=steps +steps=-1,100,80000,100000 +scales=.1,10,.1,.1 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + + +####### + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[route] +layers=-9 + +[reorg] +stride=2 + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=425 +activation=linear + +[region] +anchors = 0.738768,0.874946, 2.42204,2.65704, 4.30971,7.04493, 10.246,4.59428, 12.6868,11.8741 +bias_match=1 +classes=80 +coords=4 +num=5 +softmax=1 +jitter=.2 +rescore=1 + +object_scale=5 +noobject_scale=1 +class_scale=1 +coord_scale=1 + +absolute=1 +thresh = .6 +random=0 diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg index fda339a2b00..2d31027d602 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolo.cfg @@ -1,8 +1,8 @@ [net] -batch=1 -subdivisions=1 -width=416 -height=416 +batch=64 +subdivisions=8 +height=608 +width=608 channels=3 momentum=0.9 decay=0.0005 @@ -12,10 +12,11 @@ exposure = 1.5 hue=.1 learning_rate=0.001 -max_batches = 120000 +burn_in=1000 +max_batches = 500200 policy=steps -steps=-1,100,80000,100000 -scales=.1,10,.1,.1 +steps=400000,450000 +scales=.1,.1 [convolutional] batch_normalize=1 @@ -203,11 +204,19 @@ activation=leaky [route] layers=-9 +[convolutional] +batch_normalize=1 +size=1 +stride=1 +pad=1 +filters=64 +activation=leaky + [reorg] stride=2 [route] -layers=-1,-3 +layers=-1,-4 [convolutional] batch_normalize=1 @@ -224,14 +233,15 @@ pad=1 filters=425 activation=linear + [region] -anchors = 0.738768,0.874946, 2.42204,2.65704, 4.30971,7.04493, 10.246,4.59428, 12.6868,11.8741 +anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 bias_match=1 classes=80 coords=4 num=5 softmax=1 -jitter=.2 +jitter=.3 rescore=1 object_scale=5 @@ -241,4 +251,4 @@ coord_scale=1 absolute=1 thresh = .6 -random=0 +random=1 diff --git a/scripts/voc_label.py b/scripts/voc_label.py index d1e88236f2c..679fc366890 100644 --- a/scripts/voc_label.py +++ b/scripts/voc_label.py @@ -10,10 +10,10 @@ def convert(size, box): - dw = 1./size[0] - dh = 1./size[1] - x = (box[0] + box[1])/2.0 - y = (box[2] + box[3])/2.0 + dw = 1./(size[0]) + dh = 1./(size[1]) + x = (box[0] + box[1])/2.0 - 1 + y = (box[2] + box[3])/2.0 - 1 w = box[1] - box[0] h = box[3] - box[2] x = x*dw @@ -34,7 +34,7 @@ def convert_annotation(year, image_id): for obj in root.iter('object'): difficult = obj.find('difficult').text cls = obj.find('name').text - if cls not in classes or int(difficult) == 1: + if cls not in classes or int(difficult)==1: continue cls_id = classes.index(cls) xmlbox = obj.find('bndbox') @@ -54,3 +54,6 @@ def convert_annotation(year, image_id): convert_annotation(year, image_id) list_file.close() +os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt") +os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt") + diff --git a/src/batchnorm_layer.c b/src/batchnorm_layer.c index b53548bd6dd..1be70aa0ad7 100644 --- a/src/batchnorm_layer.c +++ b/src/batchnorm_layer.c @@ -1,3 +1,4 @@ +#include "convolutional_layer.h" #include "batchnorm_layer.h" #include "blas.h" #include @@ -5,55 +6,67 @@ layer make_batchnorm_layer(int batch, int w, int h, int c) { fprintf(stderr, "Batch Normalization Layer: %d x %d x %d image\n", w,h,c); - layer layer = {0}; - layer.type = BATCHNORM; - layer.batch = batch; - layer.h = layer.out_h = h; - layer.w = layer.out_w = w; - layer.c = layer.out_c = c; - layer.output = calloc(h * w * c * batch, sizeof(float)); - layer.delta = calloc(h * w * c * batch, sizeof(float)); - layer.inputs = w*h*c; - layer.outputs = layer.inputs; - - layer.scales = calloc(c, sizeof(float)); - layer.scale_updates = calloc(c, sizeof(float)); + layer l = {0}; + l.type = BATCHNORM; + l.batch = batch; + l.h = l.out_h = h; + l.w = l.out_w = w; + l.c = l.out_c = c; + l.output = calloc(h * w * c * batch, sizeof(float)); + l.delta = calloc(h * w * c * batch, sizeof(float)); + l.inputs = w*h*c; + l.outputs = l.inputs; + + l.scales = calloc(c, sizeof(float)); + l.scale_updates = calloc(c, sizeof(float)); + l.biases = calloc(c, sizeof(float)); + l.bias_updates = calloc(c, sizeof(float)); int i; for(i = 0; i < c; ++i){ - layer.scales[i] = 1; + l.scales[i] = 1; } - layer.mean = calloc(c, sizeof(float)); - layer.variance = calloc(c, sizeof(float)); + l.mean = calloc(c, sizeof(float)); + l.variance = calloc(c, sizeof(float)); - layer.rolling_mean = calloc(c, sizeof(float)); - layer.rolling_variance = calloc(c, sizeof(float)); + l.rolling_mean = calloc(c, sizeof(float)); + l.rolling_variance = calloc(c, sizeof(float)); - layer.forward = forward_batchnorm_layer; - layer.backward = backward_batchnorm_layer; + l.forward = forward_batchnorm_layer; + l.backward = backward_batchnorm_layer; #ifdef GPU - layer.forward_gpu = forward_batchnorm_layer_gpu; - layer.backward_gpu = backward_batchnorm_layer_gpu; + l.forward_gpu = forward_batchnorm_layer_gpu; + l.backward_gpu = backward_batchnorm_layer_gpu; + + l.output_gpu = cuda_make_array(l.output, h * w * c * batch); + l.delta_gpu = cuda_make_array(l.delta, h * w * c * batch); - layer.output_gpu = cuda_make_array(layer.output, h * w * c * batch); - layer.delta_gpu = cuda_make_array(layer.delta, h * w * c * batch); + l.biases_gpu = cuda_make_array(l.biases, c); + l.bias_updates_gpu = cuda_make_array(l.bias_updates, c); - layer.scales_gpu = cuda_make_array(layer.scales, c); - layer.scale_updates_gpu = cuda_make_array(layer.scale_updates, c); + l.scales_gpu = cuda_make_array(l.scales, c); + l.scale_updates_gpu = cuda_make_array(l.scale_updates, c); - layer.mean_gpu = cuda_make_array(layer.mean, c); - layer.variance_gpu = cuda_make_array(layer.variance, c); + l.mean_gpu = cuda_make_array(l.mean, c); + l.variance_gpu = cuda_make_array(l.variance, c); - layer.rolling_mean_gpu = cuda_make_array(layer.mean, c); - layer.rolling_variance_gpu = cuda_make_array(layer.variance, c); + l.rolling_mean_gpu = cuda_make_array(l.mean, c); + l.rolling_variance_gpu = cuda_make_array(l.variance, c); - layer.mean_delta_gpu = cuda_make_array(layer.mean, c); - layer.variance_delta_gpu = cuda_make_array(layer.variance, c); + l.mean_delta_gpu = cuda_make_array(l.mean, c); + l.variance_delta_gpu = cuda_make_array(l.variance, c); - layer.x_gpu = cuda_make_array(layer.output, layer.batch*layer.outputs); - layer.x_norm_gpu = cuda_make_array(layer.output, layer.batch*layer.outputs); + l.x_gpu = cuda_make_array(l.output, l.batch*l.outputs); + l.x_norm_gpu = cuda_make_array(l.output, l.batch*l.outputs); + #ifdef CUDNN + cudnnCreateTensorDescriptor(&l.normTensorDesc); + cudnnCreateTensorDescriptor(&l.dstTensorDesc); + cudnnSetTensor4dDescriptor(l.dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l.batch, l.out_c, l.out_h, l.out_w); + cudnnSetTensor4dDescriptor(l.normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l.out_c, 1, 1); + + #endif #endif - return layer; + return l; } void backward_scale_cpu(float *x_norm, float *delta, int batch, int n, int size, float *scale_updates) @@ -108,7 +121,7 @@ void normalize_delta_cpu(float *x, float *mean, float *variance, float *mean_del for(f = 0; f < filters; ++f){ for(k = 0; k < spatial; ++k){ int index = j*filters*spatial + f*spatial + k; - delta[index] = delta[index] * 1./(sqrt(variance[f]) + .00001f) + variance_delta[f] * 2. * (x[index] - mean[f]) / (spatial * batch) + mean_delta[f]/(spatial*batch); + delta[index] = delta[index] * 1./(sqrt(variance[f] + .00001f)) + variance_delta[f] * 2. * (x[index] - mean[f]) / (spatial * batch) + mean_delta[f]/(spatial*batch); } } } @@ -130,10 +143,10 @@ void forward_batchnorm_layer(layer l, network_state state) mean_cpu(l.output, l.batch, l.out_c, l.out_h*l.out_w, l.mean); variance_cpu(l.output, l.mean, l.batch, l.out_c, l.out_h*l.out_w, l.variance); - scal_cpu(l.out_c, .9, l.rolling_mean, 1); - axpy_cpu(l.out_c, .1, l.mean, 1, l.rolling_mean, 1); - scal_cpu(l.out_c, .9, l.rolling_variance, 1); - axpy_cpu(l.out_c, .1, l.variance, 1, l.rolling_variance, 1); + scal_cpu(l.out_c, .99, l.rolling_mean, 1); + axpy_cpu(l.out_c, .01, l.mean, 1, l.rolling_mean, 1); + scal_cpu(l.out_c, .99, l.rolling_variance, 1); + axpy_cpu(l.out_c, .01, l.variance, 1, l.rolling_variance, 1); copy_cpu(l.outputs*l.batch, l.output, 1, l.x, 1); normalize_cpu(l.output, l.mean, l.variance, l.batch, l.out_c, l.out_h*l.out_w); @@ -142,10 +155,12 @@ void forward_batchnorm_layer(layer l, network_state state) normalize_cpu(l.output, l.rolling_mean, l.rolling_variance, l.batch, l.out_c, l.out_h*l.out_w); } scale_bias(l.output, l.scales, l.batch, l.out_c, l.out_h*l.out_w); + add_bias(l.output, l.biases, l.batch, l.out_c, l.out_h*l.out_w); } void backward_batchnorm_layer(const layer l, network_state state) { + backward_bias(l.bias_updates, l.delta, l.batch, l.out_c, l.out_w*l.out_h); backward_scale_cpu(l.x_norm, l.delta, l.batch, l.out_c, l.out_w*l.out_h, l.scale_updates); scale_bias(l.delta, l.scales, l.batch, l.out_c, l.out_h*l.out_w); @@ -179,6 +194,28 @@ void forward_batchnorm_layer_gpu(layer l, network_state state) l.out_h = l.out_w = 1; } if (state.train) { +#ifdef CUDNN + copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); + float one = 1; + float zero = 0; + cudnnBatchNormalizationForwardTraining(cudnn_handle(), + CUDNN_BATCHNORM_SPATIAL, + &one, + &zero, + l.dstTensorDesc, + l.x_gpu, + l.dstTensorDesc, + l.output_gpu, + l.normTensorDesc, + l.scales_gpu, + l.biases_gpu, + .01, + l.rolling_mean_gpu, + l.rolling_variance_gpu, + .00001, + l.mean_gpu, + l.variance_gpu); +#else fast_mean_gpu(l.output_gpu, l.batch, l.out_c, l.out_h*l.out_w, l.mean_gpu); fast_variance_gpu(l.output_gpu, l.mean_gpu, l.batch, l.out_c, l.out_h*l.out_w, l.variance_gpu); @@ -190,15 +227,45 @@ void forward_batchnorm_layer_gpu(layer l, network_state state) copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); normalize_gpu(l.output_gpu, l.mean_gpu, l.variance_gpu, l.batch, l.out_c, l.out_h*l.out_w); copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_norm_gpu, 1); + + scale_bias_gpu(l.output_gpu, l.scales_gpu, l.batch, l.out_c, l.out_h*l.out_w); + add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.out_c, l.out_w*l.out_h); +#endif } else { normalize_gpu(l.output_gpu, l.rolling_mean_gpu, l.rolling_variance_gpu, l.batch, l.out_c, l.out_h*l.out_w); + scale_bias_gpu(l.output_gpu, l.scales_gpu, l.batch, l.out_c, l.out_h*l.out_w); + add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.out_c, l.out_w*l.out_h); } - scale_bias_gpu(l.output_gpu, l.scales_gpu, l.batch, l.out_c, l.out_h*l.out_w); } void backward_batchnorm_layer_gpu(const layer l, network_state state) { +#ifdef CUDNN + float one = 1; + float zero = 0; + cudnnBatchNormalizationBackward(cudnn_handle(), + CUDNN_BATCHNORM_SPATIAL, + &one, + &zero, + &one, + &one, + l.dstTensorDesc, + l.x_gpu, + l.dstTensorDesc, + l.delta_gpu, + l.dstTensorDesc, + l.x_norm_gpu, + l.normTensorDesc, + l.scales_gpu, + l.scale_updates_gpu, + l.bias_updates_gpu, + .00001, + l.mean_gpu, + l.variance_gpu); + copy_ongpu(l.outputs*l.batch, l.x_norm_gpu, 1, l.delta_gpu, 1); +#else + backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.out_c, l.out_w*l.out_h); backward_scale_gpu(l.x_norm_gpu, l.delta_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.scale_updates_gpu); scale_bias_gpu(l.delta_gpu, l.scales_gpu, l.batch, l.out_c, l.out_h*l.out_w); @@ -206,6 +273,7 @@ void backward_batchnorm_layer_gpu(const layer l, network_state state) fast_mean_delta_gpu(l.delta_gpu, l.variance_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.mean_delta_gpu); fast_variance_delta_gpu(l.x_gpu, l.delta_gpu, l.mean_gpu, l.variance_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.variance_delta_gpu); normalize_delta_gpu(l.x_gpu, l.mean_gpu, l.variance_gpu, l.mean_delta_gpu, l.variance_delta_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.delta_gpu); +#endif if(l.type == BATCHNORM) copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, state.delta, 1); } #endif diff --git a/src/blas.c b/src/blas.c index 31bd86b236f..1582f5fed10 100644 --- a/src/blas.c +++ b/src/blas.c @@ -179,11 +179,21 @@ void smooth_l1_cpu(int n, float *pred, float *truth, float *delta, float *error) } else { error[i] = 2*abs_val - 1; - delta[i] = (diff < 0) ? -1 : 1; + delta[i] = (diff < 0) ? 1 : -1; } } } +void l1_cpu(int n, float *pred, float *truth, float *delta, float *error) +{ + int i; + for(i = 0; i < n; ++i){ + float diff = truth[i] - pred[i]; + error[i] = fabs(diff); + delta[i] = diff > 0 ? 1 : -1; + } +} + void l2_cpu(int n, float *pred, float *truth, float *delta, float *error) { int i; @@ -202,21 +212,32 @@ float dot_cpu(int N, float *X, int INCX, float *Y, int INCY) return dot; } -void softmax(float *input, int n, float temp, float *output) +void softmax(float *input, int n, float temp, int stride, float *output) { int i; float sum = 0; float largest = -FLT_MAX; for(i = 0; i < n; ++i){ - if(input[i] > largest) largest = input[i]; + if(input[i*stride] > largest) largest = input[i*stride]; } for(i = 0; i < n; ++i){ - float e = exp(input[i]/temp - largest/temp); + float e = exp(input[i*stride]/temp - largest/temp); sum += e; - output[i] = e; + output[i*stride] = e; } for(i = 0; i < n; ++i){ - output[i] /= sum; + output[i*stride] /= sum; + } +} + + +void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output) +{ + int g, b; + for(b = 0; b < batch; ++b){ + for(g = 0; g < groups; ++g){ + softmax(input + b*batch_offset + g*group_offset, n, temp, stride, output + b*batch_offset + g*group_offset); + } } } diff --git a/src/blas.h b/src/blas.h index 3d6ee7d36f0..968bb955237 100644 --- a/src/blas.h +++ b/src/blas.h @@ -33,9 +33,11 @@ void normalize_delta_cpu(float *x, float *mean, float *variance, float *mean_del void smooth_l1_cpu(int n, float *pred, float *truth, float *delta, float *error); void l2_cpu(int n, float *pred, float *truth, float *delta, float *error); +void l1_cpu(int n, float *pred, float *truth, float *delta, float *error); void weighted_sum_cpu(float *a, float *b, float *s, int num, float *c); -void softmax(float *input, int n, float temp, float *output); +void softmax(float *input, int n, float temp, int stride, float *output); +void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output); #ifdef GPU #include "cuda.h" @@ -45,6 +47,7 @@ void axpy_ongpu_offset(int N, float ALPHA, float * X, int OFFX, int INCX, float void copy_ongpu(int N, float * X, int INCX, float * Y, int INCY); void copy_ongpu_offset(int N, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); void scal_ongpu(int N, float ALPHA, float * X, int INCX); +void add_ongpu(int N, float ALPHA, float * X, int INCX); void supp_ongpu(int N, float ALPHA, float * X, int INCX); void mask_ongpu(int N, float * X, float mask_num, float * mask); void const_ongpu(int N, float ALPHA, float *X, int INCX); @@ -72,13 +75,14 @@ void backward_bias_gpu(float *bias_updates, float *delta, int batch, int n, int void smooth_l1_gpu(int n, float *pred, float *truth, float *delta, float *error); void l2_gpu(int n, float *pred, float *truth, float *delta, float *error); +void l1_gpu(int n, float *pred, float *truth, float *delta, float *error); void weighted_delta_gpu(float *a, float *b, float *s, float *da, float *db, float *ds, int num, float *dc); void weighted_sum_gpu(float *a, float *b, float *s, int num, float *c); void mult_add_into_gpu(int num, float *a, float *b, float *c); void reorg_ongpu(float *x, int w, int h, int c, int batch, int stride, int forward, float *out); -void softmax_gpu(float *input, int n, int offset, int groups, float temp, float *output); +void softmax_gpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output); void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rate, float eps, int t); void flatten_ongpu(float *x, int spatial, int layers, int batch, int forward, float *out); diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index d9401766910..a833adbbdd5 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -161,7 +161,7 @@ __global__ void normalize_kernel(int N, float *x, float *mean, float *variance, if (index >= N) return; int f = (index/spatial)%filters; - x[index] = (x[index] - mean[f])/(sqrt(variance[f]) + .000001f); + x[index] = (x[index] - mean[f])/(sqrt(variance[f] + .00001f)); } __global__ void normalize_delta_kernel(int N, float *x, float *mean, float *variance, float *mean_delta, float *variance_delta, int batch, int filters, int spatial, float *delta) @@ -170,7 +170,7 @@ __global__ void normalize_delta_kernel(int N, float *x, float *mean, float *vari if (index >= N) return; int f = (index/spatial)%filters; - delta[index] = delta[index] * 1./(sqrt(variance[f]) + .000001f) + variance_delta[f] * 2. * (x[index] - mean[f]) / (spatial * batch) + mean_delta[f]/(spatial*batch); + delta[index] = delta[index] * 1./(sqrt(variance[f] + .00001f)) + variance_delta[f] * 2. * (x[index] - mean[f]) / (spatial * batch) + mean_delta[f]/(spatial*batch); } extern "C" void normalize_delta_gpu(float *x, float *mean, float *variance, float *mean_delta, float *variance_delta, int batch, int filters, int spatial, float *delta) @@ -192,7 +192,7 @@ __global__ void variance_delta_kernel(float *x, float *delta, float *mean, floa variance_delta[i] += delta[index]*(x[index] - mean[i]); } } - variance_delta[i] *= -.5 * pow(variance[i] + .000001f, (float)(-3./2.)); + variance_delta[i] *= -.5 * pow(variance[i] + .00001f, (float)(-3./2.)); } __global__ void accumulate_kernel(float *x, int n, int groups, float *sum) @@ -224,12 +224,14 @@ __global__ void fast_mean_delta_kernel(float *delta, float *variance, int batch, } } + __syncthreads(); + if(id == 0){ mean_delta[filter] = 0; for(i = 0; i < threads; ++i){ mean_delta[filter] += local[i]; } - mean_delta[filter] *= (-1./sqrt(variance[filter] + .000001f)); + mean_delta[filter] *= (-1./sqrt(variance[filter] + .00001f)); } } @@ -252,12 +254,14 @@ __global__ void fast_variance_delta_kernel(float *x, float *delta, float *mean, } } + __syncthreads(); + if(id == 0){ variance_delta[filter] = 0; for(i = 0; i < threads; ++i){ variance_delta[filter] += local[i]; } - variance_delta[filter] *= -.5 * pow(variance[filter] + .000001f, (float)(-3./2.)); + variance_delta[filter] *= -.5 * pow(variance[filter] + .00001f, (float)(-3./2.)); } } @@ -274,7 +278,7 @@ __global__ void mean_delta_kernel(float *delta, float *variance, int batch, int mean_delta[i] += delta[index]; } } - mean_delta[i] *= (-1./sqrt(variance[i] + .000001f)); + mean_delta[i] *= (-1./sqrt(variance[i] + .00001f)); } extern "C" void mean_delta_gpu(float *delta, float *variance, int batch, int filters, int spatial, float *mean_delta) @@ -391,6 +395,12 @@ __global__ void supp_kernel(int N, float ALPHA, float *X, int INCX) } } +__global__ void add_kernel(int N, float ALPHA, float *X, int INCX) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < N) X[i*INCX] += ALPHA; +} + __global__ void scal_kernel(int N, float ALPHA, float *X, int INCX) { int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; @@ -447,6 +457,8 @@ __global__ void fast_mean_kernel(float *x, int batch, int filters, int spatial, } } + __syncthreads(); + if(id == 0){ mean[filter] = 0; for(i = 0; i < threads; ++i){ @@ -475,6 +487,8 @@ __global__ void fast_variance_kernel(float *x, float *mean, int batch, int filt } } + __syncthreads(); + if(id == 0){ variance[filter] = 0; for(i = 0; i < threads; ++i){ @@ -593,6 +607,12 @@ extern "C" void constrain_ongpu(int N, float ALPHA, float * X, int INCX) } +extern "C" void add_ongpu(int N, float ALPHA, float * X, int INCX) +{ + add_kernel<<>>(N, ALPHA, X, INCX); + check_error(cudaPeekAtLastError()); +} + extern "C" void scal_ongpu(int N, float ALPHA, float * X, int INCX) { scal_kernel<<>>(N, ALPHA, X, INCX); @@ -658,7 +678,7 @@ __global__ void smooth_l1_kernel(int n, float *pred, float *truth, float *delta, } else { error[i] = 2*abs_val - 1; - delta[i] = (diff < 0) ? -1 : 1; + delta[i] = (diff > 0) ? 1 : -1; } } } @@ -685,6 +705,23 @@ extern "C" void l2_gpu(int n, float *pred, float *truth, float *delta, float *er check_error(cudaPeekAtLastError()); } +__global__ void l1_kernel(int n, float *pred, float *truth, float *delta, float *error) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < n){ + float diff = truth[i] - pred[i]; + error[i] = abs(diff); + delta[i] = (diff > 0) ? 1 : -1; + } +} + +extern "C" void l1_gpu(int n, float *pred, float *truth, float *delta, float *error) +{ + l1_kernel<<>>(n, pred, truth, delta, error); + check_error(cudaPeekAtLastError()); +} + + __global__ void weighted_sum_kernel(int n, float *a, float *b, float *s, float *c) @@ -732,36 +769,36 @@ extern "C" void mult_add_into_gpu(int num, float *a, float *b, float *c) } -__device__ void softmax_device(int n, float *input, float temp, float *output) +__device__ void softmax_device(float *input, int n, float temp, int stride, float *output) { int i; float sum = 0; float largest = -INFINITY; for(i = 0; i < n; ++i){ - int val = input[i]; + int val = input[i*stride]; largest = (val>largest) ? val : largest; } for(i = 0; i < n; ++i){ - float e = exp(input[i]/temp - largest/temp); + float e = exp(input[i*stride]/temp - largest/temp); sum += e; - output[i] = e; + output[i*stride] = e; } for(i = 0; i < n; ++i){ - output[i] /= sum; + output[i*stride] /= sum; } } -__global__ void softmax_kernel(int n, int offset, int batch, float *input, float temp, float *output) +__global__ void softmax_kernel(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output) { - int b = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; - if(b >= batch) return; - softmax_device(n, input + b*offset, temp, output + b*offset); + int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if (id >= batch*groups) return; + int b = id / groups; + int g = id % groups; + softmax_device(input + b*batch_offset + g*group_offset, n, temp, stride, output + b*batch_offset + g*group_offset); } -extern "C" void softmax_gpu(float *input, int n, int offset, int groups, float temp, float *output) +extern "C" void softmax_gpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output) { - int inputs = n; - int batch = groups; - softmax_kernel<<>>(inputs, offset, batch, input, temp, output); + softmax_kernel<<>>(input, n, batch, batch_offset, groups, group_offset, stride, temp, output); check_error(cudaPeekAtLastError()); } diff --git a/src/box.c b/src/box.c index 39dea067dfc..88ca71ac865 100644 --- a/src/box.c +++ b/src/box.c @@ -3,13 +3,13 @@ #include #include -box float_to_box(float *f) +box float_to_box(float *f, int stride) { box b; b.x = f[0]; - b.y = f[1]; - b.w = f[2]; - b.h = f[3]; + b.y = f[1*stride]; + b.w = f[2*stride]; + b.h = f[3*stride]; return b; } diff --git a/src/box.h b/src/box.h index c65589b919d..49585ed470c 100644 --- a/src/box.h +++ b/src/box.h @@ -9,7 +9,7 @@ typedef struct{ float dx, dy, dw, dh; } dbox; -box float_to_box(float *f); +box float_to_box(float *f, int stride); float box_iou(box a, box b); float box_rmse(box a, box b); dbox diou(box a, box b); diff --git a/src/classifier.c b/src/classifier.c index 586530aa5ae..2ac0b756e97 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -379,7 +379,7 @@ void validate_classifier_10(char *datacfg, char *filename, char *weightfile) float *pred = calloc(classes, sizeof(float)); for(j = 0; j < 10; ++j){ float *p = network_predict(net, images[j].data); - if(net.hierarchy) hierarchy_predictions(p, net.outputs, net.hierarchy, 1); + if(net.hierarchy) hierarchy_predictions(p, net.outputs, net.hierarchy, 1, 1); axpy_cpu(classes, 1, p, 1, pred, 1); free_image(images[j]); } @@ -440,7 +440,7 @@ void validate_classifier_full(char *datacfg, char *filename, char *weightfile) //show_image(crop, "cropped"); //cvWaitKey(0); float *pred = network_predict(net, resized.data); - if(net.hierarchy) hierarchy_predictions(pred, net.outputs, net.hierarchy, 1); + if(net.hierarchy) hierarchy_predictions(pred, net.outputs, net.hierarchy, 1, 1); free_image(im); free_image(resized); @@ -502,7 +502,7 @@ void validate_classifier_single(char *datacfg, char *filename, char *weightfile) //show_image(crop, "cropped"); //cvWaitKey(0); float *pred = network_predict(net, crop.data); - if(net.hierarchy) hierarchy_predictions(pred, net.outputs, net.hierarchy, 1); + if(net.hierarchy) hierarchy_predictions(pred, net.outputs, net.hierarchy, 1, 1); if(resized.data != im.data) free_image(resized); free_image(im); @@ -563,7 +563,7 @@ void validate_classifier_multi(char *datacfg, char *filename, char *weightfile) image r = resize_min(im, scales[j]); resize_network(&net, r.w, r.h); float *p = network_predict(net, r.data); - if(net.hierarchy) hierarchy_predictions(p, net.outputs, net.hierarchy, 1); + if(net.hierarchy) hierarchy_predictions(p, net.outputs, net.hierarchy, 1 , 1); axpy_cpu(classes, 1, p, 1, pred, 1); flip_image(r); p = network_predict(net, r.data); @@ -703,7 +703,7 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi float *X = r.data; time=clock(); float *predictions = network_predict(net, X); - if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 0); + if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 0, 1); top_k(predictions, net.outputs, top, indexes); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); for(i = 0; i < top; ++i){ @@ -1084,7 +1084,7 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind show_image(in, "Classifier"); float *predictions = network_predict(net, in_s.data); - if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 1); + if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 1, 1); top_predictions(net, top, indexes); printf("\033[2J"); diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index fcaea0313b4..9eb058ce9ef 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -117,26 +117,70 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network_state state) if (l.batch_normalize) { forward_batchnorm_layer_gpu(l, state); + } else { + add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.n, l.out_w*l.out_h); } - add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.n, l.out_w*l.out_h); activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); //if(l.dot > 0) dot_error_gpu(l); if(l.binary || l.xnor) swap_binary(&l); } +__global__ void smooth_kernel(float *x, int n, int w, int h, int c, int size, float rate, float *delta) +{ + int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(id >= n) return; + + int j = id % w; + id /= w; + int i = id % h; + id /= h; + int k = id % c; + id /= c; + int b = id; + + int w_offset = -(size/2.); + int h_offset = -(size/2.); + + int out_index = j + w*(i + h*(k + c*b)); + int l, m; + for(l = 0; l < size; ++l){ + for(m = 0; m < size; ++m){ + int cur_h = h_offset + i + l; + int cur_w = w_offset + j + m; + int index = cur_w + w*(cur_h + h*(k + b*c)); + int valid = (cur_h >= 0 && cur_h < h && + cur_w >= 0 && cur_w < w); + delta[out_index] += valid ? rate*(x[index] - x[out_index]) : 0; + } + } +} + +extern "C" void smooth_layer(layer l, int size, float rate) +{ + int h = l.out_h; + int w = l.out_w; + int c = l.out_c; + + size_t n = h*w*c*l.batch; + + smooth_kernel<<>>(l.output_gpu, n, l.w, l.h, l.c, size, rate, l.delta_gpu); + check_error(cudaPeekAtLastError()); +} + void backward_convolutional_layer_gpu(convolutional_layer l, network_state state) { + if(l.smooth){ + smooth_layer(l, 5, l.smooth); + } //constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); - backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.n, l.out_w*l.out_h); if(l.batch_normalize){ backward_batchnorm_layer_gpu(l, state); - //axpy_ongpu(l.outputs*l.batch, -state.net.decay, l.x_gpu, 1, l.delta_gpu, 1); } else { - //axpy_ongpu(l.outputs*l.batch, -state.net.decay, l.output_gpu, 1, l.delta_gpu, 1); + backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.n, l.out_w*l.out_h); } float *original_input = state.input; diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index 37211ab7d68..04d21310250 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -23,11 +23,11 @@ void swap_binary(convolutional_layer *l) l->weights = l->binary_weights; l->binary_weights = swap; - #ifdef GPU +#ifdef GPU swap = l->weights_gpu; l->weights_gpu = l->binary_weights_gpu; l->binary_weights_gpu = swap; - #endif +#endif } void binarize_weights(float *weights, int n, int size, float *binary) @@ -80,23 +80,15 @@ int convolutional_out_width(convolutional_layer l) image get_convolutional_image(convolutional_layer l) { - int h,w,c; - h = convolutional_out_height(l); - w = convolutional_out_width(l); - c = l.n; - return float_to_image(w,h,c,l.output); + return float_to_image(l.out_w,l.out_h,l.out_c,l.output); } image get_convolutional_delta(convolutional_layer l) { - int h,w,c; - h = convolutional_out_height(l); - w = convolutional_out_width(l); - c = l.n; - return float_to_image(w,h,c,l.delta); + return float_to_image(l.out_w,l.out_h,l.out_c,l.delta); } -size_t get_workspace_size(layer l){ +static size_t get_workspace_size(layer l){ #ifdef CUDNN if(gpu_index >= 0){ size_t most = 0; @@ -127,7 +119,7 @@ size_t get_workspace_size(layer l){ if (s > most) most = s; return most; } - #endif +#endif return (size_t)l.out_h*l.out_w*l.size*l.size*l.c*sizeof(float); } @@ -141,6 +133,7 @@ void cudnn_convolutional_setup(layer *l) cudnnSetTensor4dDescriptor(l->srcTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l->batch, l->c, l->h, l->w); cudnnSetTensor4dDescriptor(l->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l->batch, l->out_c, l->out_h, l->out_w); + cudnnSetTensor4dDescriptor(l->normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l->out_c, 1, 1); cudnnSetFilter4dDescriptor(l->weightDesc, CUDNN_DATA_FLOAT, CUDNN_TENSOR_NCHW, l->n, l->c, l->size, l->size); cudnnSetConvolution2dDescriptor(l->convDesc, l->pad, l->pad, l->stride, l->stride, 1, 1, CUDNN_CROSS_CORRELATION); cudnnGetConvolutionForwardAlgorithm(cudnn_handle(), @@ -198,8 +191,8 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int // float scale = 1./sqrt(size*size*c); float scale = sqrt(2./(size*size*c)); for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_uniform(-1, 1); - int out_h = convolutional_out_height(l); int out_w = convolutional_out_width(l); + int out_h = convolutional_out_height(l); l.out_h = out_h; l.out_w = out_w; l.out_c = n; @@ -291,6 +284,7 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.x_norm_gpu = cuda_make_array(l.output, l.batch*out_h*out_w*n); } #ifdef CUDNN + cudnnCreateTensorDescriptor(&l.normTensorDesc); cudnnCreateTensorDescriptor(&l.srcTensorDesc); cudnnCreateTensorDescriptor(&l.dstTensorDesc); cudnnCreateFilterDescriptor(&l.weightDesc); @@ -426,8 +420,8 @@ void backward_bias(float *bias_updates, float *delta, int batch, int n, int size void forward_convolutional_layer(convolutional_layer l, network_state state) { - int out_h = convolutional_out_height(l); - int out_w = convolutional_out_width(l); + int out_h = l.out_h; + int out_w = l.out_w; int i; fill_cpu(l.outputs*l.batch, 0, l.output, 1); @@ -458,8 +452,9 @@ void forward_convolutional_layer(convolutional_layer l, network_state state) if(l.batch_normalize){ forward_batchnorm_layer(l, state); + } else { + add_bias(l.output, l.biases, l.batch, l.n, out_h*out_w); } - add_bias(l.output, l.biases, l.batch, l.n, out_h*out_w); activate_array(l.output, m*n*l.batch, l.activation); if(l.binary || l.xnor) swap_binary(&l); @@ -470,14 +465,14 @@ void backward_convolutional_layer(convolutional_layer l, network_state state) int i; int m = l.n; int n = l.size*l.size*l.c; - int k = convolutional_out_height(l)* - convolutional_out_width(l); + int k = l.out_w*l.out_h; gradient_array(l.output, m*k*l.batch, l.activation, l.delta); - backward_bias(l.bias_updates, l.delta, l.batch, l.n, k); if(l.batch_normalize){ backward_batchnorm_layer(l, state); + } else { + backward_bias(l.bias_updates, l.delta, l.batch, l.n, k); } for(i = 0; i < l.batch; ++i){ diff --git a/src/cost_layer.c b/src/cost_layer.c index 39d2398b5ec..320f7fe51dc 100644 --- a/src/cost_layer.c +++ b/src/cost_layer.c @@ -12,6 +12,7 @@ COST_TYPE get_cost_type(char *s) if (strcmp(s, "sse")==0) return SSE; if (strcmp(s, "masked")==0) return MASKED; if (strcmp(s, "smooth")==0) return SMOOTH; + if (strcmp(s, "L1")==0) return L1; fprintf(stderr, "Couldn't find cost type %s, going with SSE\n", s); return SSE; } @@ -25,6 +26,8 @@ char *get_cost_string(COST_TYPE a) return "masked"; case SMOOTH: return "smooth"; + case L1: + return "L1"; } return "sse"; } @@ -81,6 +84,8 @@ void forward_cost_layer(cost_layer l, network_state state) } if(l.cost_type == SMOOTH){ smooth_l1_cpu(l.batch*l.inputs, state.input, state.truth, l.delta, l.output); + }else if(l.cost_type == L1){ + l1_cpu(l.batch*l.inputs, state.input, state.truth, l.delta, l.output); } else { l2_cpu(l.batch*l.inputs, state.input, state.truth, l.delta, l.output); } @@ -116,12 +121,18 @@ int float_abs_compare (const void * a, const void * b) void forward_cost_layer_gpu(cost_layer l, network_state state) { if (!state.truth) return; + if(l.smooth){ + scal_ongpu(l.batch*l.inputs, (1-l.smooth), state.truth, 1); + add_ongpu(l.batch*l.inputs, l.smooth * 1./l.inputs, state.truth, 1); + } if (l.cost_type == MASKED) { mask_ongpu(l.batch*l.inputs, state.input, SECRET_NUM, state.truth); } if(l.cost_type == SMOOTH){ smooth_l1_gpu(l.batch*l.inputs, state.input, state.truth, l.delta_gpu, l.output_gpu); + } else if (l.cost_type == L1){ + l1_gpu(l.batch*l.inputs, state.input, state.truth, l.delta_gpu, l.output_gpu); } else { l2_gpu(l.batch*l.inputs, state.input, state.truth, l.delta_gpu, l.output_gpu); } @@ -136,6 +147,10 @@ void forward_cost_layer_gpu(cost_layer l, network_state state) supp_ongpu(l.batch*l.inputs, thresh, l.delta_gpu, 1); } + if(l.thresh){ + supp_ongpu(l.batch*l.inputs, l.thresh*1./l.inputs, l.delta_gpu, 1); + } + cuda_pull_array(l.output_gpu, l.output, l.batch*l.inputs); l.cost[0] = sum_array(l.output, l.batch*l.inputs); } diff --git a/src/cuda.c b/src/cuda.c index 1b51271f71e..af3d412b564 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -157,4 +157,13 @@ void cuda_pull_array(float *x_gpu, float *x, size_t n) check_error(status); } +float cuda_mag_array(float *x_gpu, size_t n) +{ + float *temp = calloc(n, sizeof(float)); + cuda_pull_array(x_gpu, temp, n); + float m = mag_array(temp, n); + free(temp); + return m; +} + #endif diff --git a/src/cuda.h b/src/cuda.h index 29b1eefcae6..a825ded5893 100644 --- a/src/cuda.h +++ b/src/cuda.h @@ -26,6 +26,7 @@ void cuda_free(float *x_gpu); void cuda_random(float *x_gpu, size_t n); float cuda_compare(float *x_gpu, float *x, size_t n, char *s); dim3 cuda_gridsize(size_t n); +float cuda_mag_array(float *x_gpu, size_t n); #ifdef CUDNN cudnnHandle_t cudnn_handle(); diff --git a/src/darknet.c b/src/darknet.c index 6e56072808c..f7b4c225479 100644 --- a/src/darknet.c +++ b/src/darknet.c @@ -24,6 +24,7 @@ extern void run_nightmare(int argc, char **argv); extern void run_dice(int argc, char **argv); extern void run_compare(int argc, char **argv); extern void run_classifier(int argc, char **argv); +extern void run_regressor(int argc, char **argv); extern void run_char_rnn(int argc, char **argv); extern void run_vid_rnn(int argc, char **argv); extern void run_tag(int argc, char **argv); @@ -31,6 +32,7 @@ extern void run_cifar(int argc, char **argv); extern void run_go(int argc, char **argv); extern void run_art(int argc, char **argv); extern void run_super(int argc, char **argv); +extern void run_lsd(int argc, char **argv); void average(int argc, char *argv[]) { @@ -95,7 +97,7 @@ void speed(char *cfgfile, int tics) set_batch_network(&net, 1); int i; time_t start = time(0); - image im = make_image(net.w, net.h, net.c); + image im = make_image(net.w, net.h, net.c*net.batch); for(i = 0; i < tics; ++i){ network_predict(net, im.data); } @@ -150,12 +152,24 @@ void oneoff(char *cfgfile, char *weightfile, char *outfile) save_weights(net, outfile); } +void oneoff2(char *cfgfile, char *weightfile, char *outfile, int l) +{ + gpu_index = -1; + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights_upto(&net, weightfile, 0, net.n); + load_weights_upto(&net, weightfile, l, net.n); + } + *net.seen = 0; + save_weights_upto(net, outfile, net.n); +} + void partial(char *cfgfile, char *weightfile, char *outfile, int max) { gpu_index = -1; network net = parse_network_cfg(cfgfile); if(weightfile){ - load_weights_upto(&net, weightfile, max); + load_weights_upto(&net, weightfile, 0, max); } *net.seen = 0; save_weights_upto(net, outfile, max); @@ -380,6 +394,8 @@ int main(int argc, char **argv) run_voxel(argc, argv); } else if (0 == strcmp(argv[1], "super")){ run_super(argc, argv); + } else if (0 == strcmp(argv[1], "lsd")){ + run_lsd(argc, argv); } else if (0 == strcmp(argv[1], "detector")){ run_detector(argc, argv); } else if (0 == strcmp(argv[1], "detect")){ @@ -400,6 +416,8 @@ int main(int argc, char **argv) predict_classifier("cfg/imagenet1k.data", argv[2], argv[3], argv[4], 5); } else if (0 == strcmp(argv[1], "classifier")){ run_classifier(argc, argv); + } else if (0 == strcmp(argv[1], "regressor")){ + run_regressor(argc, argv); } else if (0 == strcmp(argv[1], "art")){ run_art(argc, argv); } else if (0 == strcmp(argv[1], "tag")){ @@ -436,6 +454,8 @@ int main(int argc, char **argv) speed(argv[2], (argc > 3 && argv[3]) ? atoi(argv[3]) : 0); } else if (0 == strcmp(argv[1], "oneoff")){ oneoff(argv[2], argv[3], argv[4]); + } else if (0 == strcmp(argv[1], "oneoff2")){ + oneoff2(argv[2], argv[3], argv[4], atoi(argv[5])); } else if (0 == strcmp(argv[1], "partial")){ partial(argv[2], argv[3], argv[4], atoi(argv[5])); } else if (0 == strcmp(argv[1], "average")){ diff --git a/src/data.c b/src/data.c index 05e5a91b5f1..f17bd73fc81 100644 --- a/src/data.c +++ b/src/data.c @@ -317,7 +317,7 @@ void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, h = boxes[i].h; id = boxes[i].id; - if ((w < .005 || h < .005)) continue; + if ((w < .001 || h < .001)) continue; truth[i*5+0] = x; truth[i*5+1] = y; @@ -393,7 +393,7 @@ void fill_truth(char *path, char **labels, int k, float *truth) ++count; } } - if(count != 1) printf("Too many or too few labels: %d, %s\n", count, path); + if(count != 1 && (k != 1 || count != 0)) printf("Too many or too few labels: %d, %s\n", count, path); } void fill_hierarchy(float *truth, int k, tree *hierarchy) @@ -428,6 +428,24 @@ void fill_hierarchy(float *truth, int k, tree *hierarchy) } } +matrix load_regression_labels_paths(char **paths, int n) +{ + matrix y = make_matrix(n, 1); + int i; + for(i = 0; i < n; ++i){ + char labelpath[4096]; + find_replace(paths[i], "images", "targets", labelpath); + find_replace(labelpath, "JPEGImages", "targets", labelpath); + find_replace(labelpath, ".jpg", ".txt", labelpath); + find_replace(labelpath, ".png", ".txt", labelpath); + + FILE *file = fopen(labelpath, "r"); + fscanf(file, "%f", &(y.vals[i][0])); + fclose(file); + } + return y; +} + matrix load_labels_paths(char **paths, int n, char **labels, int k, tree *hierarchy) { matrix y = make_matrix(n, k); @@ -673,45 +691,44 @@ data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, in d.y = make_matrix(n, 5*boxes); for(i = 0; i < n; ++i){ image orig = load_image_color(random_paths[i], 0, 0); + image sized = make_image(w, h, orig.c); + fill_image(sized, .5); + + float dw = jitter * orig.w; + float dh = jitter * orig.h; + + float new_ar = (orig.w + rand_uniform(-dw, dw)) / (orig.h + rand_uniform(-dh, dh)); + float scale = rand_uniform(.25, 2); + + float nw, nh; + + if(new_ar < 1){ + nh = scale * h; + nw = nh * new_ar; + } else { + nw = scale * w; + nh = nw / new_ar; + } - int oh = orig.h; - int ow = orig.w; - - int dw = (ow*jitter); - int dh = (oh*jitter); - - int pleft = rand_uniform(-dw, dw); - int pright = rand_uniform(-dw, dw); - int ptop = rand_uniform(-dh, dh); - int pbot = rand_uniform(-dh, dh); - - int swidth = ow - pleft - pright; - int sheight = oh - ptop - pbot; + float dx = rand_uniform(0, w - nw); + float dy = rand_uniform(0, h - nh); - float sx = (float)swidth / ow; - float sy = (float)sheight / oh; + place_image(orig, nw, nh, dx, dy, sized); + random_distort_image(sized, hue, saturation, exposure); int flip = rand()%2; - image cropped = crop_image(orig, pleft, ptop, swidth, sheight); - - float dx = ((float)pleft/ow)/sx; - float dy = ((float)ptop /oh)/sy; - - image sized = resize_image(cropped, w, h); if(flip) flip_image(sized); - random_distort_image(sized, hue, saturation, exposure); d.X.vals[i] = sized.data; - fill_truth_detection(random_paths[i], boxes, d.y.vals[i], classes, flip, dx, dy, 1./sx, 1./sy); + + fill_truth_detection(random_paths[i], boxes, d.y.vals[i], classes, flip, -dx/w, -dy/h, nw/w, nh/h); free_image(orig); - free_image(cropped); } free(random_paths); return d; } - void *load_thread(void *ptr) { //printf("Loading data: %d\n", rand()); @@ -722,6 +739,8 @@ void *load_thread(void *ptr) if (a.type == OLD_CLASSIFICATION_DATA){ *a.d = load_data_old(a.paths, a.n, a.m, a.labels, a.classes, a.w, a.h); + } else if (a.type == REGRESSION_DATA){ + *a.d = load_data_regression(a.paths, a.n, a.m, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } else if (a.type == CLASSIFICATION_DATA){ *a.d = load_data_augment(a.paths, a.n, a.m, a.labels, a.classes, a.hierarchy, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } else if (a.type == SUPER_DATA){ @@ -739,6 +758,9 @@ void *load_thread(void *ptr) } else if (a.type == IMAGE_DATA){ *(a.im) = load_image_color(a.path, 0, 0); *(a.resized) = resize_image(*(a.im), a.w, a.h); + } else if (a.type == LETTERBOX_DATA){ + *(a.im) = load_image_color(a.path, 0, 0); + *(a.resized) = letterbox_image(*(a.im), a.w, a.h); } else if (a.type == TAG_DATA){ *a.d = load_data_tag(a.paths, a.n, a.m, a.classes, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } @@ -863,6 +885,17 @@ data load_data_super(char **paths, int n, int m, int w, int h, int scale) return d; } +data load_data_regression(char **paths, int n, int m, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure) +{ + if(m) paths = get_random_paths(paths, n, m); + data d = {0}; + d.shallow = 0; + d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure); + d.y = load_regression_labels_paths(paths, n); + if(m) free(paths); + return d; +} + data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure) { if(m) paths = get_random_paths(paths, n, m); @@ -962,7 +995,6 @@ data load_cifar10_data(char *filename) X.vals[i][j] = (double)bytes[j+1]; } } - //translate_data_rows(d, -128); scale_data_rows(d, 1./255); //normalize_data_rows(d); fclose(fp); @@ -1029,7 +1061,6 @@ data load_all_cifar10() fclose(fp); } //normalize_data_rows(d); - //translate_data_rows(d, -128); scale_data_rows(d, 1./255); smooth_data(d); return d; @@ -1113,6 +1144,19 @@ void translate_data_rows(data d, float s) } } +data copy_data(data d) +{ + data c = {0}; + c.w = d.w; + c.h = d.h; + c.shallow = 0; + c.num_boxes = d.num_boxes; + c.boxes = d.boxes; + c.X = copy_matrix(d.X); + c.y = copy_matrix(d.y); + return c; +} + void normalize_data_rows(data d) { int i; diff --git a/src/data.h b/src/data.h index 3f6ef610a21..30e025c7966 100644 --- a/src/data.h +++ b/src/data.h @@ -28,7 +28,7 @@ typedef struct{ } data; typedef enum { - CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA + CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA } data_type; typedef struct load_args{ @@ -83,6 +83,7 @@ data load_data_tag(char **paths, int n, int m, int k, int min, int max, int size matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); data load_data_super(char **paths, int n, int m, int w, int h, int scale); data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); +data load_data_regression(char **paths, int n, int m, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); data load_go(char *filename); box_label *read_boxes(char *filename, int *n); @@ -106,5 +107,6 @@ data *split_data(data d, int part, int total); data concat_data(data d1, data d2); data concat_datas(data *d, int n); void fill_truth(char *path, char **labels, int k, float *truth); +data copy_data(data d); #endif diff --git a/src/deconvolutional_kernels.cu b/src/deconvolutional_kernels.cu index d6259fb3973..381be23bd68 100644 --- a/src/deconvolutional_kernels.cu +++ b/src/deconvolutional_kernels.cu @@ -5,6 +5,7 @@ extern "C" { #include "convolutional_layer.h" #include "deconvolutional_layer.h" +#include "batchnorm_layer.h" #include "gemm.h" #include "blas.h" #include "im2col.h" @@ -13,97 +14,119 @@ extern "C" { #include "cuda.h" } -extern "C" void forward_deconvolutional_layer_gpu(deconvolutional_layer layer, network_state state) +extern "C" void forward_deconvolutional_layer_gpu(layer l, network_state state) { int i; - int out_h = deconvolutional_out_height(layer); - int out_w = deconvolutional_out_width(layer); + int out_h = l.out_h; + int out_w = l.out_w; int size = out_h*out_w; - int m = layer.size*layer.size*layer.n; - int n = layer.h*layer.w; - int k = layer.c; + int m = l.size*l.size*l.n; + int n = l.h*l.w; + int k = l.c; - fill_ongpu(layer.outputs*layer.batch, 0, layer.output_gpu, 1); + fill_ongpu(l.outputs*l.batch, 0, l.output_gpu, 1); - for(i = 0; i < layer.batch; ++i){ - float *a = layer.weights_gpu; - float *b = state.input + i*layer.c*layer.h*layer.w; - float *c = layer.col_image_gpu; + for(i = 0; i < l.batch; ++i){ + float *a = l.weights_gpu; + float *b = state.input + i*l.c*l.h*l.w; + float *c = state.workspace; gemm_ongpu(1,0,m,n,k,1,a,m,b,n,0,c,n); - col2im_ongpu(c, layer.n, out_h, out_w, layer.size, layer.stride, 0, layer.output_gpu+i*layer.n*size); + col2im_ongpu(c, l.n, out_h, out_w, l.size, l.stride, l.pad, l.output_gpu+i*l.n*size); } - add_bias_gpu(layer.output_gpu, layer.biases_gpu, layer.batch, layer.n, size); - activate_array(layer.output_gpu, layer.batch*layer.n*size, layer.activation); + if (l.batch_normalize) { + forward_batchnorm_layer_gpu(l, state); + } else { + add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.n, l.out_w*l.out_h); + } + activate_array_ongpu(l.output_gpu, l.batch*l.n*size, l.activation); } -extern "C" void backward_deconvolutional_layer_gpu(deconvolutional_layer layer, network_state state) +extern "C" void backward_deconvolutional_layer_gpu(layer l, network_state state) { - float alpha = 1./layer.batch; - int out_h = deconvolutional_out_height(layer); - int out_w = deconvolutional_out_width(layer); + int out_h = l.out_h; + int out_w = l.out_w; int size = out_h*out_w; int i; - gradient_array(layer.output_gpu, size*layer.n*layer.batch, layer.activation, layer.delta_gpu); - backward_bias(layer.bias_updates_gpu, layer.delta, layer.batch, layer.n, size); + gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); + + if(l.batch_normalize){ + backward_batchnorm_layer_gpu(l, state); + } else { + backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.n, l.out_w*l.out_h); + } - if(state.delta) memset(state.delta, 0, layer.batch*layer.h*layer.w*layer.c*sizeof(float)); + //if(state.delta) memset(state.delta, 0, l.batch*l.h*l.w*l.c*sizeof(float)); - for(i = 0; i < layer.batch; ++i){ - int m = layer.c; - int n = layer.size*layer.size*layer.n; - int k = layer.h*layer.w; + for(i = 0; i < l.batch; ++i){ + int m = l.c; + int n = l.size*l.size*l.n; + int k = l.h*l.w; float *a = state.input + i*m*n; - float *b = layer.col_image_gpu; - float *c = layer.weight_updates_gpu; + float *b = state.workspace; + float *c = l.weight_updates_gpu; - im2col_ongpu(layer.delta_gpu + i*layer.n*size, layer.n, out_h, out_w, - layer.size, layer.stride, 0, b); - gemm_ongpu(0,1,m,n,k,alpha,a,k,b,k,1,c,n); + im2col_ongpu(l.delta_gpu + i*l.n*size, l.n, out_h, out_w, + l.size, l.stride, l.pad, b); + gemm_ongpu(0,1,m,n,k,1,a,k,b,k,1,c,n); if(state.delta){ - int m = layer.c; - int n = layer.h*layer.w; - int k = layer.size*layer.size*layer.n; + int m = l.c; + int n = l.h*l.w; + int k = l.size*l.size*l.n; - float *a = layer.weights_gpu; - float *b = layer.col_image_gpu; + float *a = l.weights_gpu; + float *b = state.workspace; float *c = state.delta + i*n*m; - gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); + gemm_ongpu(0,0,m,n,k,1,a,k,b,n,1,c,n); } } } -extern "C" void pull_deconvolutional_layer(deconvolutional_layer layer) +extern "C" void pull_deconvolutional_layer(layer l) { - cuda_pull_array(layer.weights_gpu, layer.weights, layer.c*layer.n*layer.size*layer.size); - cuda_pull_array(layer.biases_gpu, layer.biases, layer.n); - cuda_pull_array(layer.weight_updates_gpu, layer.weight_updates, layer.c*layer.n*layer.size*layer.size); - cuda_pull_array(layer.bias_updates_gpu, layer.bias_updates, layer.n); + cuda_pull_array(l.weights_gpu, l.weights, l.c*l.n*l.size*l.size); + cuda_pull_array(l.biases_gpu, l.biases, l.n); + cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.c*l.n*l.size*l.size); + cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.n); + if (l.batch_normalize){ + cuda_pull_array(l.scales_gpu, l.scales, l.n); + cuda_pull_array(l.rolling_mean_gpu, l.rolling_mean, l.n); + cuda_pull_array(l.rolling_variance_gpu, l.rolling_variance, l.n); + } } -extern "C" void push_deconvolutional_layer(deconvolutional_layer layer) +extern "C" void push_deconvolutional_layer(layer l) { - cuda_push_array(layer.weights_gpu, layer.weights, layer.c*layer.n*layer.size*layer.size); - cuda_push_array(layer.biases_gpu, layer.biases, layer.n); - cuda_push_array(layer.weight_updates_gpu, layer.weight_updates, layer.c*layer.n*layer.size*layer.size); - cuda_push_array(layer.bias_updates_gpu, layer.bias_updates, layer.n); + cuda_push_array(l.weights_gpu, l.weights, l.c*l.n*l.size*l.size); + cuda_push_array(l.biases_gpu, l.biases, l.n); + cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.c*l.n*l.size*l.size); + cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.n); + if (l.batch_normalize){ + cuda_push_array(l.scales_gpu, l.scales, l.n); + cuda_push_array(l.rolling_mean_gpu, l.rolling_mean, l.n); + cuda_push_array(l.rolling_variance_gpu, l.rolling_variance, l.n); + } } -extern "C" void update_deconvolutional_layer_gpu(deconvolutional_layer layer, float learning_rate, float momentum, float decay) +void update_deconvolutional_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) { - int size = layer.size*layer.size*layer.c*layer.n; + int size = l.size*l.size*l.c*l.n; + axpy_ongpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); + scal_ongpu(l.n, momentum, l.bias_updates_gpu, 1); - axpy_ongpu(layer.n, learning_rate, layer.bias_updates_gpu, 1, layer.biases_gpu, 1); - scal_ongpu(layer.n, momentum, layer.bias_updates_gpu, 1); + if(l.scales_gpu){ + axpy_ongpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); + scal_ongpu(l.n, momentum, l.scale_updates_gpu, 1); + } - axpy_ongpu(size, -decay, layer.weights_gpu, 1, layer.weight_updates_gpu, 1); - axpy_ongpu(size, learning_rate, layer.weight_updates_gpu, 1, layer.weights_gpu, 1); - scal_ongpu(size, momentum, layer.weight_updates_gpu, 1); + axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_ongpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_ongpu(size, momentum, l.weight_updates_gpu, 1); } diff --git a/src/deconvolutional_layer.c b/src/deconvolutional_layer.c index fbef9d58829..7170975cfe9 100644 --- a/src/deconvolutional_layer.c +++ b/src/deconvolutional_layer.c @@ -1,5 +1,6 @@ #include "deconvolutional_layer.h" #include "convolutional_layer.h" +#include "batchnorm_layer.h" #include "utils.h" #include "im2col.h" #include "col2im.h" @@ -8,45 +9,25 @@ #include #include -int deconvolutional_out_height(deconvolutional_layer l) -{ - int h = l.stride*(l.h - 1) + l.size; - return h; -} - -int deconvolutional_out_width(deconvolutional_layer l) -{ - int w = l.stride*(l.w - 1) + l.size; - return w; -} -int deconvolutional_out_size(deconvolutional_layer l) -{ - return deconvolutional_out_height(l) * deconvolutional_out_width(l); +static size_t get_workspace_size(layer l){ + return (size_t)l.h*l.w*l.size*l.size*l.c*sizeof(float); } -image get_deconvolutional_image(deconvolutional_layer l) +int deconvolutional_out_height(layer l) { - int h,w,c; - h = deconvolutional_out_height(l); - w = deconvolutional_out_width(l); - c = l.n; - return float_to_image(w,h,c,l.output); + return (l.h) * l.stride + l.size/2 - l.pad; } -image get_deconvolutional_delta(deconvolutional_layer l) +int deconvolutional_out_width(layer l) { - int h,w,c; - h = deconvolutional_out_height(l); - w = deconvolutional_out_width(l); - c = l.n; - return float_to_image(w,h,c,l.delta); + return (l.w) * l.stride + l.size/2 - l.pad; } -deconvolutional_layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, ACTIVATION activation) +layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, ACTIVATION activation, int batch_normalize) { int i; - deconvolutional_layer l = {0}; + layer l = {0}; l.type = DECONVOLUTIONAL; l.h = h; @@ -67,71 +48,135 @@ deconvolutional_layer make_deconvolutional_layer(int batch, int h, int w, int c, for(i = 0; i < n; ++i){ l.biases[i] = scale; } - int out_h = deconvolutional_out_height(l); - int out_w = deconvolutional_out_width(l); + l.pad = l.size/2; - l.out_h = out_h; - l.out_w = out_w; + l.out_h = (l.h) * l.stride + l.size/2 - l.pad; + l.out_w = (l.w) * l.stride + l.size/2 - l.pad; l.out_c = n; l.outputs = l.out_w * l.out_h * l.out_c; l.inputs = l.w * l.h * l.c; - l.col_image = calloc(h*w*size*size*n, sizeof(float)); - l.output = calloc(l.batch*out_h * out_w * n, sizeof(float)); - l.delta = calloc(l.batch*out_h * out_w * n, sizeof(float)); + l.output = calloc(l.batch*l.out_h * l.out_w * n, sizeof(float)); + l.delta = calloc(l.batch*l.out_h * l.out_w * n, sizeof(float)); l.forward = forward_deconvolutional_layer; l.backward = backward_deconvolutional_layer; l.update = update_deconvolutional_layer; - #ifdef GPU - l.weights_gpu = cuda_make_array(l.weights, c*n*size*size); - l.weight_updates_gpu = cuda_make_array(l.weight_updates, c*n*size*size); + l.batch_normalize = batch_normalize; + + if(batch_normalize){ + l.scales = calloc(n, sizeof(float)); + l.scale_updates = calloc(n, sizeof(float)); + for(i = 0; i < n; ++i){ + l.scales[i] = 1; + } + + l.mean = calloc(n, sizeof(float)); + l.variance = calloc(n, sizeof(float)); + + l.mean_delta = calloc(n, sizeof(float)); + l.variance_delta = calloc(n, sizeof(float)); + + l.rolling_mean = calloc(n, sizeof(float)); + l.rolling_variance = calloc(n, sizeof(float)); + l.x = calloc(l.batch*l.outputs, sizeof(float)); + l.x_norm = calloc(l.batch*l.outputs, sizeof(float)); + } + +#ifdef GPU + l.forward_gpu = forward_deconvolutional_layer_gpu; + l.backward_gpu = backward_deconvolutional_layer_gpu; + l.update_gpu = update_deconvolutional_layer_gpu; + + if(gpu_index >= 0){ + + l.weights_gpu = cuda_make_array(l.weights, c*n*size*size); + l.weight_updates_gpu = cuda_make_array(l.weight_updates, c*n*size*size); + + l.biases_gpu = cuda_make_array(l.biases, n); + l.bias_updates_gpu = cuda_make_array(l.bias_updates, n); + + l.delta_gpu = cuda_make_array(l.delta, l.batch*l.out_h*l.out_w*n); + l.output_gpu = cuda_make_array(l.output, l.batch*l.out_h*l.out_w*n); - l.biases_gpu = cuda_make_array(l.biases, n); - l.bias_updates_gpu = cuda_make_array(l.bias_updates, n); + if(batch_normalize){ + l.mean_gpu = cuda_make_array(l.mean, n); + l.variance_gpu = cuda_make_array(l.variance, n); - l.col_image_gpu = cuda_make_array(l.col_image, h*w*size*size*n); - l.delta_gpu = cuda_make_array(l.delta, l.batch*out_h*out_w*n); - l.output_gpu = cuda_make_array(l.output, l.batch*out_h*out_w*n); + l.rolling_mean_gpu = cuda_make_array(l.mean, n); + l.rolling_variance_gpu = cuda_make_array(l.variance, n); + + l.mean_delta_gpu = cuda_make_array(l.mean, n); + l.variance_delta_gpu = cuda_make_array(l.variance, n); + + l.scales_gpu = cuda_make_array(l.scales, n); + l.scale_updates_gpu = cuda_make_array(l.scale_updates, n); + + l.x_gpu = cuda_make_array(l.output, l.batch*l.out_h*l.out_w*n); + l.x_norm_gpu = cuda_make_array(l.output, l.batch*l.out_h*l.out_w*n); + } + } + #ifdef CUDNN + cudnnCreateTensorDescriptor(&l.dstTensorDesc); + cudnnCreateTensorDescriptor(&l.normTensorDesc); + cudnnSetTensor4dDescriptor(l.dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l.batch, l.out_c, l.out_h, l.out_w); + cudnnSetTensor4dDescriptor(l.normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l.out_c, 1, 1); #endif +#endif l.activation = activation; + l.workspace_size = get_workspace_size(l); - fprintf(stderr, "Deconvolutional Layer: %d x %d x %d image, %d filters -> %d x %d x %d image\n", h,w,c,n, out_h, out_w, n); + fprintf(stderr, "deconv%5d %2d x%2d /%2d %4d x%4d x%4d -> %4d x%4d x%4d\n", n, size, size, stride, w, h, c, l.out_w, l.out_h, l.out_c); return l; } -void resize_deconvolutional_layer(deconvolutional_layer *l, int h, int w) +void resize_deconvolutional_layer(layer *l, int h, int w) { l->h = h; l->w = w; - int out_h = deconvolutional_out_height(*l); - int out_w = deconvolutional_out_width(*l); - - l->col_image = realloc(l->col_image, - out_h*out_w*l->size*l->size*l->c*sizeof(float)); - l->output = realloc(l->output, - l->batch*out_h * out_w * l->n*sizeof(float)); - l->delta = realloc(l->delta, - l->batch*out_h * out_w * l->n*sizeof(float)); - #ifdef GPU - cuda_free(l->col_image_gpu); + l->out_h = (l->h) * l->stride + l->size/2 - l->pad; + l->out_w = (l->w) * l->stride + l->size/2 - l->pad; + + l->outputs = l->out_h * l->out_w * l->out_c; + l->inputs = l->w * l->h * l->c; + + l->output = realloc(l->output, l->batch*l->outputs*sizeof(float)); + l->delta = realloc(l->delta, l->batch*l->outputs*sizeof(float)); + if(l->batch_normalize){ + l->x = realloc(l->x, l->batch*l->outputs*sizeof(float)); + l->x_norm = realloc(l->x_norm, l->batch*l->outputs*sizeof(float)); + } + +#ifdef GPU cuda_free(l->delta_gpu); cuda_free(l->output_gpu); - l->col_image_gpu = cuda_make_array(l->col_image, out_h*out_w*l->size*l->size*l->c); - l->delta_gpu = cuda_make_array(l->delta, l->batch*out_h*out_w*l->n); - l->output_gpu = cuda_make_array(l->output, l->batch*out_h*out_w*l->n); + l->delta_gpu = cuda_make_array(l->delta, l->batch*l->outputs); + l->output_gpu = cuda_make_array(l->output, l->batch*l->outputs); + + if(l->batch_normalize){ + cuda_free(l->x_gpu); + cuda_free(l->x_norm_gpu); + + l->x_gpu = cuda_make_array(l->output, l->batch*l->outputs); + l->x_norm_gpu = cuda_make_array(l->output, l->batch*l->outputs); + } + #ifdef CUDNN + cudnnSetTensor4dDescriptor(l->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l->batch, l->out_c, l->out_h, l->out_w); + cudnnSetTensor4dDescriptor(l->normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l->out_c, 1, 1); #endif +#endif + l->workspace_size = get_workspace_size(*l); } -void forward_deconvolutional_layer(const deconvolutional_layer l, network_state state) +void forward_deconvolutional_layer(const layer l, network_state state) { int i; - int out_h = deconvolutional_out_height(l); - int out_w = deconvolutional_out_width(l); + int out_h = l.out_h; + int out_w = l.out_w; int size = out_h*out_w; int m = l.size*l.size*l.n; @@ -143,17 +188,22 @@ void forward_deconvolutional_layer(const deconvolutional_layer l, network_state for(i = 0; i < l.batch; ++i){ float *a = l.weights; float *b = state.input + i*l.c*l.h*l.w; - float *c = l.col_image; + float *c = state.workspace; gemm(1,0,m,n,k,1,a,m,b,n,0,c,n); col2im_cpu(c, l.n, out_h, out_w, l.size, l.stride, 0, l.output+i*l.n*size); } - add_bias(l.output, l.biases, l.batch, l.n, size); + + if(l.batch_normalize){ + forward_batchnorm_layer(l, state); + } else { + add_bias(l.output, l.biases, l.batch, l.n, l.out_h*l.out_w); + } activate_array(l.output, l.batch*l.n*size, l.activation); } -void backward_deconvolutional_layer(deconvolutional_layer l, network_state state) +void backward_deconvolutional_layer(layer l, network_state state) { float alpha = 1./l.batch; int out_h = deconvolutional_out_height(l); @@ -162,7 +212,11 @@ void backward_deconvolutional_layer(deconvolutional_layer l, network_state state int i; gradient_array(l.output, size*l.n*l.batch, l.activation, l.delta); - backward_bias(l.bias_updates, l.delta, l.batch, l.n, size); + if(l.batch_normalize){ + backward_batchnorm_layer(l, state); + } else { + backward_bias(l.bias_updates, l.delta, l.batch, l.n, l.out_w*l.out_h); + } for(i = 0; i < l.batch; ++i){ int m = l.c; @@ -170,7 +224,7 @@ void backward_deconvolutional_layer(deconvolutional_layer l, network_state state int k = l.h*l.w; float *a = state.input + i*m*n; - float *b = l.col_image; + float *b = state.workspace; float *c = l.weight_updates; im2col_cpu(l.delta + i*l.n*size, l.n, out_h, out_w, @@ -183,7 +237,7 @@ void backward_deconvolutional_layer(deconvolutional_layer l, network_state state int k = l.size*l.size*l.n; float *a = l.weights; - float *b = l.col_image; + float *b = state.workspace; float *c = state.delta + i*n*m; gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); @@ -191,14 +245,19 @@ void backward_deconvolutional_layer(deconvolutional_layer l, network_state state } } -void update_deconvolutional_layer(deconvolutional_layer l, float learning_rate, float momentum, float decay) +void update_deconvolutional_layer(layer l, int batch, float learning_rate, float momentum, float decay) { int size = l.size*l.size*l.c*l.n; - axpy_cpu(l.n, learning_rate, l.bias_updates, 1, l.biases, 1); + axpy_cpu(l.n, learning_rate/batch, l.bias_updates, 1, l.biases, 1); scal_cpu(l.n, momentum, l.bias_updates, 1); - axpy_cpu(size, -decay, l.weights, 1, l.weight_updates, 1); - axpy_cpu(size, learning_rate, l.weight_updates, 1, l.weights, 1); + if(l.scales){ + axpy_cpu(l.n, learning_rate/batch, l.scale_updates, 1, l.scales, 1); + scal_cpu(l.n, momentum, l.scale_updates, 1); + } + + axpy_cpu(size, -decay*batch, l.weights, 1, l.weight_updates, 1); + axpy_cpu(size, learning_rate/batch, l.weight_updates, 1, l.weights, 1); scal_cpu(size, momentum, l.weight_updates, 1); } diff --git a/src/deconvolutional_layer.h b/src/deconvolutional_layer.h index 2d36e02a820..6a57513e74b 100644 --- a/src/deconvolutional_layer.h +++ b/src/deconvolutional_layer.h @@ -7,28 +7,19 @@ #include "layer.h" #include "network.h" -typedef layer deconvolutional_layer; - #ifdef GPU -void forward_deconvolutional_layer_gpu(deconvolutional_layer layer, network_state state); -void backward_deconvolutional_layer_gpu(deconvolutional_layer layer, network_state state); -void update_deconvolutional_layer_gpu(deconvolutional_layer layer, float learning_rate, float momentum, float decay); -void push_deconvolutional_layer(deconvolutional_layer layer); -void pull_deconvolutional_layer(deconvolutional_layer layer); +void forward_deconvolutional_layer_gpu(layer l, network_state state); +void backward_deconvolutional_layer_gpu(layer l, network_state state); +void update_deconvolutional_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); +void push_deconvolutional_layer(layer l); +void pull_deconvolutional_layer(layer l); #endif -deconvolutional_layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, ACTIVATION activation); -void resize_deconvolutional_layer(deconvolutional_layer *layer, int h, int w); -void forward_deconvolutional_layer(const deconvolutional_layer layer, network_state state); -void update_deconvolutional_layer(deconvolutional_layer layer, float learning_rate, float momentum, float decay); -void backward_deconvolutional_layer(deconvolutional_layer layer, network_state state); - -image get_deconvolutional_image(deconvolutional_layer layer); -image get_deconvolutional_delta(deconvolutional_layer layer); -image get_deconvolutional_filter(deconvolutional_layer layer, int i); - -int deconvolutional_out_height(deconvolutional_layer layer); -int deconvolutional_out_width(deconvolutional_layer layer); +layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, ACTIVATION activation, int batch_normalize); +void resize_deconvolutional_layer(layer *l, int h, int w); +void forward_deconvolutional_layer(const layer l, network_state state); +void update_deconvolutional_layer(layer l, int batch, float learning_rate, float momentum, float decay); +void backward_deconvolutional_layer(layer l, network_state state); #endif diff --git a/src/detection_layer.c b/src/detection_layer.c index cd98b4b4ef5..ff0f4c2bf9e 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -58,7 +58,7 @@ void forward_detection_layer(const detection_layer l, network_state state) int index = b*l.inputs; for (i = 0; i < locations; ++i) { int offset = i*l.classes; - softmax(l.output + index + offset, l.classes, 1, + softmax(l.output + index + offset, l.classes, 1, 1, l.output + index + offset); } } @@ -101,13 +101,13 @@ void forward_detection_layer(const detection_layer l, network_state state) avg_allcat += l.output[class_index+j]; } - box truth = float_to_box(state.truth + truth_index + 1 + l.classes); + box truth = float_to_box(state.truth + truth_index + 1 + l.classes, 1); truth.x /= l.side; truth.y /= l.side; for(j = 0; j < l.n; ++j){ int box_index = index + locations*(l.classes + l.n) + (i*l.n + j) * l.coords; - box out = float_to_box(l.output + box_index); + box out = float_to_box(l.output + box_index, 1); out.x /= l.side; out.y /= l.side; @@ -146,7 +146,7 @@ void forward_detection_layer(const detection_layer l, network_state state) int box_index = index + locations*(l.classes + l.n) + (i*l.n + best_index) * l.coords; int tbox_index = truth_index + 1 + l.classes; - box out = float_to_box(l.output + box_index); + box out = float_to_box(l.output + box_index, 1); out.x /= l.side; out.y /= l.side; if (l.sqrt) { diff --git a/src/detector.c b/src/detector.c index 1416c050987..318e5d3c029 100644 --- a/src/detector.c +++ b/src/detector.c @@ -6,6 +6,7 @@ #include "box.h" #include "demo.h" #include "option_list.h" +#include "blas.h" #ifdef OPENCV #include "opencv2/highgui/highgui_c.h" @@ -103,21 +104,28 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i load_thread = load_data(args); /* - int k; - for(k = 0; k < l.max_boxes; ++k){ - box b = float_to_box(train.y.vals[10] + 1 + k*5); - if(!b.x) break; - printf("loaded: %f %f %f %f\n", b.x, b.y, b.w, b.h); - } - image im = float_to_image(448, 448, 3, train.X.vals[10]); - int k; - for(k = 0; k < l.max_boxes; ++k){ - box b = float_to_box(train.y.vals[10] + 1 + k*5); - printf("%d %d %d %d\n", truth.x, truth.y, truth.w, truth.h); - draw_bbox(im, b, 8, 1,0,0); - } - save_image(im, "truth11"); - */ + int k; + for(k = 0; k < l.max_boxes; ++k){ + box b = float_to_box(train.y.vals[10] + 1 + k*5); + if(!b.x) break; + printf("loaded: %f %f %f %f\n", b.x, b.y, b.w, b.h); + } + */ + /* + int zz; + for(zz = 0; zz < train.X.cols; ++zz){ + image im = float_to_image(net.w, net.h, 3, train.X.vals[zz]); + int k; + for(k = 0; k < l.max_boxes; ++k){ + box b = float_to_box(train.y.vals[zz] + k*5); + printf("%f %f %f %f\n", b.x, b.y, b.w, b.h); + draw_bbox(im, b, 1, 1,0,0); + } + show_image(im, "truth11"); + cvWaitKey(0); + save_image(im, "truth11"); + } + */ printf("Loaded: %lf seconds\n", sec(clock()-time)); @@ -192,13 +200,13 @@ void print_detector_detections(FILE **fps, char *id, box *boxes, float **probs, { int i, j; for(i = 0; i < total; ++i){ - float xmin = boxes[i].x - boxes[i].w/2.; - float xmax = boxes[i].x + boxes[i].w/2.; - float ymin = boxes[i].y - boxes[i].h/2.; - float ymax = boxes[i].y + boxes[i].h/2.; + float xmin = boxes[i].x - boxes[i].w/2. + 1; + float xmax = boxes[i].x + boxes[i].w/2. + 1; + float ymin = boxes[i].y - boxes[i].h/2. + 1; + float ymax = boxes[i].y + boxes[i].h/2. + 1; - if (xmin < 0) xmin = 0; - if (ymin < 0) ymin = 0; + if (xmin < 1) xmin = 1; + if (ymin < 1) ymin = 1; if (xmax > w) xmax = w; if (ymax > h) ymax = h; @@ -231,6 +239,142 @@ void print_imagenet_detections(FILE *fp, int id, box *boxes, float **probs, int } } +void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char *outfile) +{ + int j; + list *options = read_data_cfg(datacfg); + char *valid_images = option_find_str(options, "valid", "data/train.list"); + char *name_list = option_find_str(options, "names", "data/names.list"); + char *prefix = option_find_str(options, "results", "results"); + char **names = get_labels(name_list); + char *mapf = option_find_str(options, "map", 0); + int *map = 0; + if (mapf) map = read_map(mapf); + + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + set_batch_network(&net, 2); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + srand(time(0)); + + list *plist = get_paths(valid_images); + char **paths = (char **)list_to_array(plist); + + layer l = net.layers[net.n-1]; + int classes = l.classes; + + char buff[1024]; + char *type = option_find_str(options, "eval", "voc"); + FILE *fp = 0; + FILE **fps = 0; + int coco = 0; + int imagenet = 0; + if(0==strcmp(type, "coco")){ + if(!outfile) outfile = "coco_results"; + snprintf(buff, 1024, "%s/%s.json", prefix, outfile); + fp = fopen(buff, "w"); + fprintf(fp, "[\n"); + coco = 1; + } else if(0==strcmp(type, "imagenet")){ + if(!outfile) outfile = "imagenet-detection"; + snprintf(buff, 1024, "%s/%s.txt", prefix, outfile); + fp = fopen(buff, "w"); + imagenet = 1; + classes = 200; + } else { + if(!outfile) outfile = "comp4_det_test_"; + fps = calloc(classes, sizeof(FILE *)); + for(j = 0; j < classes; ++j){ + snprintf(buff, 1024, "%s/%s%s.txt", prefix, outfile, names[j]); + fps[j] = fopen(buff, "w"); + } + } + + + box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); + float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes, sizeof(float *)); + + int m = plist->size; + int i=0; + int t; + + float thresh = .005; + float nms = .45; + + int nthreads = 4; + image *val = calloc(nthreads, sizeof(image)); + image *val_resized = calloc(nthreads, sizeof(image)); + image *buf = calloc(nthreads, sizeof(image)); + image *buf_resized = calloc(nthreads, sizeof(image)); + pthread_t *thr = calloc(nthreads, sizeof(pthread_t)); + + image input = make_image(net.w, net.h, net.c*2); + + load_args args = {0}; + args.w = net.w; + args.h = net.h; + //args.type = IMAGE_DATA; + args.type = LETTERBOX_DATA; + + for(t = 0; t < nthreads; ++t){ + args.path = paths[i+t]; + args.im = &buf[t]; + args.resized = &buf_resized[t]; + thr[t] = load_data_in_thread(args); + } + time_t start = time(0); + for(i = nthreads; i < m+nthreads; i += nthreads){ + fprintf(stderr, "%d\n", i); + for(t = 0; t < nthreads && i+t-nthreads < m; ++t){ + pthread_join(thr[t], 0); + val[t] = buf[t]; + val_resized[t] = buf_resized[t]; + } + for(t = 0; t < nthreads && i+t < m; ++t){ + args.path = paths[i+t]; + args.im = &buf[t]; + args.resized = &buf_resized[t]; + thr[t] = load_data_in_thread(args); + } + for(t = 0; t < nthreads && i+t-nthreads < m; ++t){ + char *path = paths[i+t-nthreads]; + char *id = basecfg(path); + copy_cpu(net.w*net.h*net.c, val_resized[t].data, 1, input.data, 1); + flip_image(val_resized[t]); + copy_cpu(net.w*net.h*net.c, val_resized[t].data, 1, input.data + net.w*net.h*net.c, 1); + + network_predict(net, input.data); + int w = val[t].w; + int h = val[t].h; + get_region_boxes(l, w, h, thresh, probs, boxes, 0, map, .5); + if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); + if (coco){ + print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); + } else if (imagenet){ + print_imagenet_detections(fp, i+t-nthreads+1, boxes, probs, l.w*l.h*l.n, classes, w, h); + } else { + print_detector_detections(fps, id, boxes, probs, l.w*l.h*l.n, classes, w, h); + } + free(id); + free_image(val[t]); + free_image(val_resized[t]); + } + } + for(j = 0; j < classes; ++j){ + if(fps) fclose(fps[j]); + } + if(coco){ + fseek(fp, -2, SEEK_CUR); + fprintf(fp, "\n]\n"); + fclose(fp); + } + fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start)); +} + + void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *outfile) { int j; @@ -306,7 +450,8 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out load_args args = {0}; args.w = net.w; args.h = net.h; - args.type = IMAGE_DATA; + //args.type = IMAGE_DATA; + args.type = LETTERBOX_DATA; for(t = 0; t < nthreads; ++t){ args.path = paths[i+t]; @@ -467,7 +612,11 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam strtok(input, "\n"); } image im = load_image_color(input,0,0); - image sized = resize_image(im, net.w, net.h); + image sized = letterbox_image(im, net.w, net.h); + //image sized = resize_image(im, net.w, net.h); + //image sized2 = resize_max(im, net.w); + //image sized = crop_image(sized2, -((net.w - sized2.w)/2), -((net.h - sized2.h)/2), net.w, net.h); + //resize_network(&net, sized.w, sized.h); layer l = net.layers[net.n-1]; box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); @@ -481,9 +630,9 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam get_region_boxes(l, 1, 1, thresh, probs, boxes, 0, 0, hier_thresh); if (l.softmax_tree && nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); - draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); - save_image(im, "predictions"); - show_image(im, "predictions"); + draw_detections(sized, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); + save_image(sized, "predictions"); + show_image(sized, "predictions"); free_image(im); free_image(sized); @@ -541,6 +690,7 @@ void run_detector(int argc, char **argv) if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh); else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear); else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile); + else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile); else if(0==strcmp(argv[2], "recall")) validate_detector_recall(cfg, weights); else if(0==strcmp(argv[2], "demo")) { list *options = read_data_cfg(datacfg); diff --git a/src/go.c b/src/go.c index 89297b5e765..39610aa8907 100644 --- a/src/go.c +++ b/src/go.c @@ -3,6 +3,8 @@ #include "parser.h" #include "option_list.h" #include "blas.h" +#include "data.h" +#include #ifdef OPENCV #include "opencv2/highgui/highgui_c.h" @@ -10,7 +12,7 @@ int inverted = 1; int noi = 1; -static const int nind = 5; +static const int nind = 2; typedef struct { char **data; @@ -88,22 +90,30 @@ void board_to_string(char *s, float *board) } } -void random_go_moves(moves m, float *boards, float *labels, int n) +data random_go_moves(moves m, int n) { + data d = {0}; + d.X = make_matrix(n, 19*19); + d.y = make_matrix(n, 19*19+1); int i; - memset(labels, 0, 19*19*n*sizeof(float)); for(i = 0; i < n; ++i){ + float *board = d.X.vals[i]; + float *label = d.y.vals[i]; char *b = m.data[rand()%m.n]; int row = b[0]; int col = b[1]; - labels[col + 19*(row + i*19)] = 1; - string_to_board(b+2, boards+i*19*19); - boards[col + 19*(row + i*19)] = 0; + if(row >= 19 || col >= 19){ + label[19*19] = 1; + } else { + label[col + 19*row] = 1; + string_to_board(b+2, board); + if(board[col + 19*row]) printf("hey\n"); + } int flip = rand()%2; int rotate = rand()%4; - image in = float_to_image(19, 19, 1, boards+i*19*19); - image out = float_to_image(19, 19, 1, labels+i*19*19); + image in = float_to_image(19, 19, 1, board); + image out = float_to_image(19, 19, 1, label); if(flip){ flip_image(in); flip_image(out); @@ -111,36 +121,60 @@ void random_go_moves(moves m, float *boards, float *labels, int n) rotate_image_cw(in, rotate); rotate_image_cw(out, rotate); } + return d; } -void train_go(char *cfgfile, char *weightfile) +void train_go(char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) { - srand(time(0)); + int i; float avg_loss = -1; char *base = basecfg(cfgfile); printf("%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); + printf("%d\n", ngpus); + network *nets = calloc(ngpus, sizeof(network)); + + srand(time(0)); + int seed = rand(); + for(i = 0; i < ngpus; ++i){ + srand(seed); +#ifdef GPU + cuda_set_device(gpus[i]); +#endif + nets[i] = load_network(cfgfile, weightfile, clear); + nets[i].learning_rate *= ngpus; } + network net = nets[0]; printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); char *backup_directory = "/home/pjreddie/backup/"; char buff[256]; - float *board = calloc(19*19*net.batch, sizeof(float)); - float *move = calloc(19*19*net.batch, sizeof(float)); moves m = load_go_moves("/home/pjreddie/backup/go.train"); //moves m = load_go_moves("games.txt"); int N = m.n; + printf("Moves: %d\n", N); int epoch = (*net.seen)/N; while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ clock_t time=clock(); - random_go_moves(m, board, move, net.batch); - float loss = train_network_datum(net, board, move) / net.batch; + data train = random_go_moves(m, net.batch*net.subdivisions*ngpus); + printf("Loaded: %lf seconds\n", sec(clock()-time)); + time=clock(); + + float loss = 0; +#ifdef GPU + if(ngpus == 1){ + loss = train_network(net, train); + } else { + loss = train_networks(nets, ngpus, train, 4); + } +#else + loss = train_network(net, train); +#endif + free_data(train); + if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.95 + loss*.05; printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); @@ -151,7 +185,7 @@ void train_go(char *cfgfile, char *weightfile) save_weights(net, buff); } - if(get_current_batch(net)%100 == 0){ + if(get_current_batch(net)%1000 == 0){ char buff[256]; sprintf(buff, "%s/%s.backup",backup_directory,base); save_weights(net, buff); @@ -204,12 +238,9 @@ int *calculate_liberties(float *board) return lib; } -void print_board(float *board, int swap, int *indexes) +void print_board(FILE *stream, float *board, int swap, int *indexes) { - //FILE *stream = stdout; - FILE *stream = stderr; int i,j,n; - fprintf(stream, "\n\n"); fprintf(stream, " "); for(i = 0; i < 19; ++i){ fprintf(stream, "%c ", 'A' + i + 1*(i > 7 && noi)); @@ -225,12 +256,12 @@ void print_board(float *board, int swap, int *indexes) if(index == indexes[n]){ found = 1; /* - if(n == 0) fprintf(stream, "\uff11"); - else if(n == 1) fprintf(stream, "\uff12"); - else if(n == 2) fprintf(stream, "\uff13"); - else if(n == 3) fprintf(stream, "\uff14"); - else if(n == 4) fprintf(stream, "\uff15"); - */ + if(n == 0) fprintf(stream, "\uff11"); + else if(n == 1) fprintf(stream, "\uff12"); + else if(n == 2) fprintf(stream, "\uff13"); + else if(n == 3) fprintf(stream, "\uff14"); + else if(n == 4) fprintf(stream, "\uff15"); + */ if(n == 0) fprintf(stream, " 1"); else if(n == 1) fprintf(stream, " 2"); else if(n == 2) fprintf(stream, " 3"); @@ -261,7 +292,7 @@ void flip_board(float *board) void predict_move(network net, float *board, float *move, int multi) { float *output = network_predict(net, board); - copy_cpu(19*19, output, 1, move, 1); + copy_cpu(19*19+1, output, 1, move, 1); int i; if(multi){ image bim = float_to_image(19, 19, 1, board); @@ -275,12 +306,12 @@ void predict_move(network net, float *board, float *move, int multi) if(i >= 4) flip_image(oim); rotate_image_cw(oim, -i); - axpy_cpu(19*19, 1, output, 1, move, 1); + axpy_cpu(19*19+1, 1, output, 1, move, 1); if(i >= 4) flip_image(bim); rotate_image_cw(bim, -i); } - scal_cpu(19*19, 1./8., move, 1); + scal_cpu(19*19+1, 1./8., move, 1); } for(i = 0; i < 19*19; ++i){ if(board[i]) move[i] = 0; @@ -350,14 +381,24 @@ int legal_go(float *b, char *ko, int p, int r, int c) int generate_move(network net, int player, float *board, int multi, float thresh, float temp, char *ko, int print) { int i, j; + int empty = 1; + for(i = 0; i < 19*19; ++i){ + if (board[i]) { + empty = 0; + break; + } + } + if(empty) { + return 72; + } for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp; - float move[361]; + float move[362]; if (player < 0) flip_board(board); predict_move(net, board, move, multi); if (player < 0) flip_board(board); - + for(i = 0; i < 19; ++i){ for(j = 0; j < 19; ++j){ if (!legal_go(board, ko, player, i, j)) move[i*19 + j] = 0; @@ -365,40 +406,43 @@ int generate_move(network net, int player, float *board, int multi, float thresh } int indexes[nind]; - top_k(move, 19*19, nind, indexes); + top_k(move, 19*19+1, nind, indexes); if(thresh > move[indexes[0]]) thresh = move[indexes[nind-1]]; - for(i = 0; i < 19; ++i){ - for(j = 0; j < 19; ++j){ - if (move[i*19 + j] < thresh) move[i*19 + j] = 0; - } + for(i = 0; i < 19*19+1; ++i){ + if (move[i] < thresh) move[i] = 0; } - int max = max_index(move, 19*19); + int max = max_index(move, 19*19+1); int row = max / 19; int col = max % 19; - int index = sample_array(move, 19*19); + int index = sample_array(move, 19*19+1); if(print){ - top_k(move, 19*19, nind, indexes); + top_k(move, 19*19+1, nind, indexes); for(i = 0; i < nind; ++i){ if (!move[indexes[i]]) indexes[i] = -1; } - print_board(board, player, indexes); + print_board(stderr, board, player, indexes); for(i = 0; i < nind; ++i){ fprintf(stderr, "%d: %f\n", i+1, move[indexes[i]]); } } + if (row == 19) return -1; - if(suicide_go(board, player, row, col)){ + if (suicide_go(board, player, row, col)){ return -1; } - if(suicide_go(board, player, index/19, index%19)) index = max; + + if (suicide_go(board, player, index/19, index%19)){ + index = max; + } + if (index == 19*19) return -1; return index; } -void valid_go(char *cfgfile, char *weightfile, int multi) +void valid_go(char *cfgfile, char *weightfile, int multi, char *filename) { srand(time(0)); char *base = basecfg(cfgfile); @@ -411,8 +455,9 @@ void valid_go(char *cfgfile, char *weightfile, int multi) printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); float *board = calloc(19*19, sizeof(float)); - float *move = calloc(19*19, sizeof(float)); - moves m = load_go_moves("/home/pjreddie/backup/go.test"); + float *move = calloc(19*19+1, sizeof(float)); + // moves m = load_go_moves("/home/pjreddie/backup/go.test"); + moves m = load_go_moves(filename); int N = m.n; int i; @@ -430,6 +475,23 @@ void valid_go(char *cfgfile, char *weightfile, int multi) } } +int print_game(float *board, FILE *fp) +{ + int i, j; + int count = 3; + fprintf(fp, "komi 6.5\n"); + fprintf(fp, "boardsize 19\n"); + fprintf(fp, "clear_board\n"); + for(j = 0; j < 19; ++j){ + for(i = 0; i < 19; ++i){ + if(board[j*19 + i] == 1) fprintf(fp, "play black %c%d\n", 'A'+i+(i>=8), 19-j); + if(board[j*19 + i] == -1) fprintf(fp, "play white %c%d\n", 'A'+i+(i>=8), 19-j); + if(board[j*19 + i]) ++count; + } + } + return count; +} + void engine_go(char *filename, char *weightfile, int multi) { network net = parse_network_cfg(filename); @@ -456,8 +518,12 @@ void engine_go(char *filename, char *weightfile, int multi) printf("=%s 2\n\n", ids); } else if (!strcmp(buff, "name")){ printf("=%s DarkGo\n\n", ids); + } else if (!strcmp(buff, "time_settings") || !strcmp(buff, "time_left")){ + char *line = fgetl(stdin); + free(line); + printf("=%s \n\n", ids); } else if (!strcmp(buff, "version")){ - printf("=%s 1.0\n\n", ids); + printf("=%s 1.0. Want more DarkGo? You can find me on OGS, unlimited games, no waiting! https://online-go.com/user/view/434218\n\n", ids); } else if (!strcmp(buff, "known_command")){ char comm[256]; scanf("%s", comm); @@ -472,11 +538,14 @@ void engine_go(char *filename, char *weightfile, int multi) !strcmp(comm, "komi") || !strcmp(comm, "final_status_list") || !strcmp(comm, "play") || + !strcmp(comm, "genmove_white") || + !strcmp(comm, "genmove_black") || + !strcmp(comm, "fixed_handicap") || !strcmp(comm, "genmove")); if(known) printf("=%s true\n\n", ids); else printf("=%s false\n\n", ids); } else if (!strcmp(buff, "list_commands")){ - printf("=%s protocol_version\nname\nversion\nknown_command\nlist_commands\nquit\nboardsize\nclear_board\nkomi\nplay\ngenmove\nfinal_status_list\n\n", ids); + printf("=%s protocol_version\nshowboard\nname\nversion\nknown_command\nlist_commands\nquit\nboardsize\nclear_board\nkomi\nplay\ngenmove_black\ngenmove_white\ngenmove\nfinal_status_list\nfixed_handicap\n\n", ids); } else if (!strcmp(buff, "quit")){ break; } else if (!strcmp(buff, "boardsize")){ @@ -486,8 +555,17 @@ void engine_go(char *filename, char *weightfile, int multi) if(boardsize != 19){ printf("?%s unacceptable size\n\n", ids); } else { + memset(board, 0, 19*19*sizeof(float)); printf("=%s \n\n", ids); } + } else if (!strcmp(buff, "fixed_handicap")){ + int handicap = 0; + scanf("%d", &handicap); + int indexes[] = {72, 288, 300, 60, 180, 174, 186, 66, 294}; + int i; + for(i = 0; i < handicap; ++i){ + board[indexes[i]] = 1; + } } else if (!strcmp(buff, "clear_board")){ passed = 0; memset(board, 0, 19*19*sizeof(float)); @@ -496,14 +574,24 @@ void engine_go(char *filename, char *weightfile, int multi) float komi = 0; scanf("%f", &komi); printf("=%s \n\n", ids); - } else if (!strcmp(buff, "play")){ + } else if (!strcmp(buff, "showboard")){ + printf("=%s \n", ids); + print_board(stdout, board, 1, 0); + printf("\n"); + } else if (!strcmp(buff, "play") || !strcmp(buff, "black") || !strcmp(buff, "white")){ char color[256]; - scanf("%s ", color); + if(!strcmp(buff, "play")) + { + scanf("%s ", color); + } else { + scanf(" "); + color[0] = buff[0]; + } char c; int r; int count = scanf("%c%d", &c, &r); int player = (color[0] == 'b' || color[0] == 'B') ? 1 : -1; - if(c == 'p' && count < 2) { + if((c == 'p' || c == 'P') && count < 2) { passed = 1; printf("=%s \n\n", ids); char *line = fgetl(stdin); @@ -527,13 +615,20 @@ void engine_go(char *filename, char *weightfile, int multi) board_to_string(one, board); printf("=%s \n\n", ids); - print_board(board, 1, 0); - } else if (!strcmp(buff, "genmove")){ - char color[256]; - scanf("%s", color); - int player = (color[0] == 'b' || color[0] == 'B') ? 1 : -1; + //print_board(stderr, board, 1, 0); + } else if (!strcmp(buff, "genmove") || !strcmp(buff, "genmove_black") || !strcmp(buff, "genmove_white")){ + int player = 0; + if(!strcmp(buff, "genmove")){ + char color[256]; + scanf("%s", color); + player = (color[0] == 'b' || color[0] == 'B') ? 1 : -1; + } else if (!strcmp(buff, "genmove_black")){ + player = 1; + } else { + player = -1; + } - int index = generate_move(net, player, board, multi, .1, .7, two, 1); + int index = generate_move(net, player, board, multi, .4, 1, two, 0); if(passed || index < 0){ printf("=%s pass\n\n", ids); passed = 0; @@ -550,7 +645,7 @@ void engine_go(char *filename, char *weightfile, int multi) row = 19 - row; if (col >= 8) ++col; printf("=%s %c%d\n\n", ids, 'A' + col, row); - print_board(board, 1, 0); + //print_board(board, 1, 0); } } else if (!strcmp(buff, "p")){ @@ -562,19 +657,10 @@ void engine_go(char *filename, char *weightfile, int multi) char *line = fgetl(stdin); free(line); if(type[0] == 'd' || type[0] == 'D'){ + int i; FILE *f = fopen("game.txt", "w"); - int i, j; - int count = 2; - fprintf(f, "boardsize 19\n"); - fprintf(f, "clear_board\n"); - for(j = 0; j < 19; ++j){ - for(i = 0; i < 19; ++i){ - if(board[j*19 + i] == 1) fprintf(f, "play black %c%d\n", 'A'+i+(i>=8), 19-j); - if(board[j*19 + i] == -1) fprintf(f, "play white %c%d\n", 'A'+i+(i>=8), 19-j); - if(board[j*19 + i]) ++count; - } - } - fprintf(f, "final_status_list dead\n"); + int count = print_game(board, f); + fprintf(f, "%s final_status_list dead\n", ids); fclose(f); FILE *p = popen("./gnugo --mode gtp < game.txt", "r"); for(i = 0; i < count; ++i){ @@ -608,44 +694,25 @@ void test_go(char *cfg, char *weights, int multi) srand(time(0)); set_batch_network(&net, 1); float *board = calloc(19*19, sizeof(float)); - float *move = calloc(19*19, sizeof(float)); + float *move = calloc(19*19+1, sizeof(float)); int color = 1; while(1){ - float *output = network_predict(net, board); - copy_cpu(19*19, output, 1, move, 1); int i; - if(multi){ - image bim = float_to_image(19, 19, 1, board); - for(i = 1; i < 8; ++i){ - rotate_image_cw(bim, i); - if(i >= 4) flip_image(bim); - - float *output = network_predict(net, board); - image oim = float_to_image(19, 19, 1, output); - - if(i >= 4) flip_image(oim); - rotate_image_cw(oim, -i); - - axpy_cpu(19*19, 1, output, 1, move, 1); - - if(i >= 4) flip_image(bim); - rotate_image_cw(bim, -i); - } - scal_cpu(19*19, 1./8., move, 1); - } - for(i = 0; i < 19*19; ++i){ - if(board[i]) move[i] = 0; - } + predict_move(net, board, move, multi); int indexes[nind]; int row, col; - top_k(move, 19*19, nind, indexes); - print_board(board, color, indexes); + top_k(move, 19*19+1, nind, indexes); + print_board(stderr, board, color, indexes); for(i = 0; i < nind; ++i){ int index = indexes[i]; row = index / 19; col = index % 19; - printf("%d: %c %d, %.2f%%\n", i+1, col + 'A' + 1*(col > 7 && noi), (inverted)?19 - row : row+1, move[index]*100); + if(row == 19){ + printf("%d: Pass, %.2f%%\n", i+1, move[index]*100); + } else { + printf("%d: %c %d, %.2f%%\n", i+1, col + 'A' + 1*(col > 7 && noi), (inverted)?19 - row : row+1, move[index]*100); + } } //if(color == 1) printf("\u25EF Enter move: "); //else printf("\u25C9 Enter move: "); @@ -663,7 +730,9 @@ void test_go(char *cfg, char *weights, int multi) int index = indexes[picked]; row = index / 19; col = index % 19; - board[row*19 + col] = 1; + if(row < 19){ + move_go(board, 1, row, col); + } } } else if (cnum){ if (c <= 'T' && c >= 'A'){ @@ -671,7 +740,7 @@ void test_go(char *cfg, char *weights, int multi) row = (inverted)?19 - row : row-1; col = c - 'A'; if (col > 7 && noi) col -= 1; - if (num == 2) board[row*19 + col] = 1; + if (num == 2) move_go(board, 1, row, col); } else if (c == 'p') { // Pass } else if(c=='b' || c == 'w'){ @@ -698,19 +767,9 @@ void test_go(char *cfg, char *weights, int multi) float score_game(float *board) { + int i; FILE *f = fopen("game.txt", "w"); - int i, j; - int count = 3; - fprintf(f, "komi 6.5\n"); - fprintf(f, "boardsize 19\n"); - fprintf(f, "clear_board\n"); - for(j = 0; j < 19; ++j){ - for(i = 0; i < 19; ++i){ - if(board[j*19 + i] == 1) fprintf(f, "play black %c%d\n", 'A'+i+(i>=8), 19-j); - if(board[j*19 + i] == -1) fprintf(f, "play white %c%d\n", 'A'+i+(i>=8), 19-j); - if(board[j*19 + i]) ++count; - } - } + int count = print_game(board, f); fprintf(f, "final_score\n"); fclose(f); FILE *p = popen("./gnugo --mode gtp < game.txt", "r"); @@ -747,7 +806,7 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) } } srand(time(0)); - char boards[300][93]; + char boards[600][93]; int count = 0; set_batch_network(&net, 1); set_batch_network(&net2, 1); @@ -760,13 +819,15 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) int p2 = 0; int total = 0; while(1){ - if (done || count >= 300){ + if (done){ float score = score_game(board); - int i = (score > 0)? 0 : 1; if((score > 0) == (total%2==0)) ++p1; else ++p2; ++total; fprintf(stderr, "Total: %d, Player 1: %f, Player 2: %f\n", total, (float)p1/total, (float)p2/total); + sleep(1); + /* + int i = (score > 0)? 0 : 1; int j; for(; i < count; i += 2){ for(j = 0; j < 93; ++j){ @@ -774,6 +835,7 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) } printf("\n"); } + */ memset(board, 0, 19*19*sizeof(float)); player = 1; done = 0; @@ -781,10 +843,10 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) fflush(stdout); fflush(stderr); } - //print_board(board, 1, 0); + print_board(stderr, board, 1, 0); //sleep(1); network use = ((total%2==0) == (player==1)) ? net : net2; - int index = generate_move(use, player, board, multi, .1, .7, two, 0); + int index = generate_move(use, player, board, multi, .4, 1, two, 0); if(index < 0){ done = 1; continue; @@ -818,13 +880,37 @@ void run_go(int argc, char **argv) return; } + char *gpu_list = find_char_arg(argc, argv, "-gpus", 0); + int *gpus = 0; + int gpu = 0; + int ngpus = 0; + if(gpu_list){ + printf("%s\n", gpu_list); + int len = strlen(gpu_list); + ngpus = 1; + int i; + for(i = 0; i < len; ++i){ + if (gpu_list[i] == ',') ++ngpus; + } + gpus = calloc(ngpus, sizeof(int)); + for(i = 0; i < ngpus; ++i){ + gpus[i] = atoi(gpu_list); + gpu_list = strchr(gpu_list, ',')+1; + } + } else { + gpu = gpu_index; + gpus = &gpu; + ngpus = 1; + } + int clear = find_arg(argc, argv, "-clear"); + char *cfg = argv[3]; char *weights = (argc > 4) ? argv[4] : 0; char *c2 = (argc > 5) ? argv[5] : 0; char *w2 = (argc > 6) ? argv[6] : 0; int multi = find_arg(argc, argv, "-multi"); - if(0==strcmp(argv[2], "train")) train_go(cfg, weights); - else if(0==strcmp(argv[2], "valid")) valid_go(cfg, weights, multi); + if(0==strcmp(argv[2], "train")) train_go(cfg, weights, gpus, ngpus, clear); + else if(0==strcmp(argv[2], "valid")) valid_go(cfg, weights, multi, c2); else if(0==strcmp(argv[2], "self")) self_go(cfg, weights, c2, w2, multi); else if(0==strcmp(argv[2], "test")) test_go(cfg, weights, multi); else if(0==strcmp(argv[2], "engine")) engine_go(cfg, weights, multi); diff --git a/src/image.c b/src/image.c index 5a90efd559f..4ce44f2e4ec 100644 --- a/src/image.c +++ b/src/image.c @@ -613,6 +613,21 @@ image float_to_image(int w, int h, int c, float *data) return out; } +void place_image(image im, int w, int h, int dx, int dy, image canvas) +{ + int x, y, c; + for(c = 0; c < im.c; ++c){ + for(y = 0; y < h; ++y){ + for(x = 0; x < w; ++x){ + int rx = ((float)x / w) * im.w; + int ry = ((float)y / h) * im.h; + float val = bilinear_interpolate(im, rx, ry, c); + set_pixel(canvas, x + dx, y + dy, c, val); + } + } + } +} + image rotate_crop_image(image im, float rad, float s, int w, int h, float dx, float dy, float aspect) { @@ -652,6 +667,12 @@ image rotate_image(image im, float rad) return rot; } +void fill_image(image m, float s) +{ + int i; + for(i = 0; i < m.h*m.w*m.c; ++i) m.data[i] = s; +} + void translate_image(image m, float s) { int i; @@ -753,6 +774,27 @@ void composite_3d(char *f1, char *f2, char *out, int delta) #endif } +image letterbox_image(image im, int w, int h) +{ + int new_w = im.w; + int new_h = im.h; + if (((float)w/im.w) < ((float)h/im.h)) { + new_w = w; + new_h = (im.h * w)/im.w; + } else { + new_h = h; + new_w = (im.w * h)/im.h; + } + image resized = resize_image(im, new_w, new_h); + image boxed = make_image(w, h, im.c); + fill_image(boxed, .5); + //int i; + //for(i = 0; i < boxed.w*boxed.h*boxed.c; ++i) boxed.data[i] = 0; + embed_image(resized, boxed, (w-new_w)/2, (h-new_h)/2); + free_image(resized); + return boxed; +} + image resize_max(image im, int max) { int w = im.w; @@ -824,6 +866,52 @@ float three_way_min(float a, float b, float c) return (a < b) ? ( (a < c) ? a : c) : ( (b < c) ? b : c) ; } +void yuv_to_rgb(image im) +{ + assert(im.c == 3); + int i, j; + float r, g, b; + float y, u, v; + for(j = 0; j < im.h; ++j){ + for(i = 0; i < im.w; ++i){ + y = get_pixel(im, i , j, 0); + u = get_pixel(im, i , j, 1); + v = get_pixel(im, i , j, 2); + + r = y + 1.13983*v; + g = y + -.39465*u + -.58060*v; + b = y + 2.03211*u; + + set_pixel(im, i, j, 0, r); + set_pixel(im, i, j, 1, g); + set_pixel(im, i, j, 2, b); + } + } +} + +void rgb_to_yuv(image im) +{ + assert(im.c == 3); + int i, j; + float r, g, b; + float y, u, v; + for(j = 0; j < im.h; ++j){ + for(i = 0; i < im.w; ++i){ + r = get_pixel(im, i , j, 0); + g = get_pixel(im, i , j, 1); + b = get_pixel(im, i , j, 2); + + y = .299*r + .587*g + .114*b; + u = -.14713*r + -.28886*g + .436*b; + v = .615*r + -.51499*g + -.10001*b; + + set_pixel(im, i, j, 0, y); + set_pixel(im, i, j, 1, u); + set_pixel(im, i, j, 2, v); + } + } +} + // http://www.cs.rit.edu/~ncs/color/t_convert.html void rgb_to_hsv(image im) { @@ -903,12 +991,30 @@ void hsv_to_rgb(image im) } } +void grayscale_image_3c(image im) +{ + assert(im.c == 3); + int i, j, k; + float scale[] = {0.299, 0.587, 0.114}; + for(j = 0; j < im.h; ++j){ + for(i = 0; i < im.w; ++i){ + float val = 0; + for(k = 0; k < 3; ++k){ + val += scale[k]*get_pixel(im, i, j, k); + } + im.data[0*im.h*im.w + im.w*j + i] = val; + im.data[1*im.h*im.w + im.w*j + i] = val; + im.data[2*im.h*im.w + im.w*j + i] = val; + } + } +} + image grayscale_image(image im) { assert(im.c == 3); int i, j, k; image gray = make_image(im.w, im.h, 1); - float scale[] = {0.587, 0.299, 0.114}; + float scale[] = {0.299, 0.587, 0.114}; for(k = 0; k < im.c; ++k){ for(j = 0; j < im.h; ++j){ for(i = 0; i < im.w; ++i){ diff --git a/src/image.h b/src/image.h index 39c3962dec3..d5b228f3596 100644 --- a/src/image.h +++ b/src/image.h @@ -29,25 +29,32 @@ image crop_image(image im, int dx, int dy, int w, int h); image random_crop_image(image im, int w, int h); image random_augment_image(image im, float angle, float aspect, int low, int high, int size); void random_distort_image(image im, float hue, float saturation, float exposure); +image letterbox_image(image im, int w, int h); image resize_image(image im, int w, int h); image resize_min(image im, int min); image resize_max(image im, int max); +void fill_image(image m, float s); void translate_image(image m, float s); void normalize_image(image p); image rotate_image(image m, float rad); void rotate_image_cw(image im, int times); void embed_image(image source, image dest, int dx, int dy); +void place_image(image im, int w, int h, int dx, int dy, image canvas); void saturate_image(image im, float sat); void exposure_image(image im, float sat); void distort_image(image im, float hue, float sat, float val); void saturate_exposure_image(image im, float sat, float exposure); +void rgb_to_hsv(image im); void hsv_to_rgb(image im); +void yuv_to_rgb(image im); +void rgb_to_yuv(image im); void rgbgr_image(image im); void constrain_image(image im); void composite_3d(char *f1, char *f2, char *out, int delta); int best_3d_shift_r(image a, image b, int min, int max); image grayscale_image(image im); +void grayscale_image_3c(image im); image threshold_image(image im, float thresh); image collapse_image_layers(image source, int border); diff --git a/src/layer.c b/src/layer.c index 622cf268c16..791c5e77463 100644 --- a/src/layer.c +++ b/src/layer.c @@ -32,7 +32,6 @@ void free_layer(layer l) if(l.scale_updates) free(l.scale_updates); if(l.weights) free(l.weights); if(l.weight_updates) free(l.weight_updates); - if(l.col_image) free(l.col_image); if(l.delta) free(l.delta); if(l.output) free(l.output); if(l.squared) free(l.squared); @@ -80,7 +79,6 @@ void free_layer(layer l) if(l.rolling_variance_gpu) cuda_free(l.rolling_variance_gpu); if(l.variance_delta_gpu) cuda_free(l.variance_delta_gpu); if(l.mean_delta_gpu) cuda_free(l.mean_delta_gpu); - if(l.col_image_gpu) cuda_free(l.col_image_gpu); if(l.x_gpu) cuda_free(l.x_gpu); if(l.x_norm_gpu) cuda_free(l.x_norm_gpu); if(l.weights_gpu) cuda_free(l.weights_gpu); diff --git a/src/layer.h b/src/layer.h index 806542bbb48..f9ac7247f92 100644 --- a/src/layer.h +++ b/src/layer.h @@ -38,7 +38,7 @@ typedef enum { } LAYER_TYPE; typedef enum{ - SSE, MASKED, SMOOTH + SSE, MASKED, L1, SMOOTH } COST_TYPE; struct layer{ @@ -58,6 +58,7 @@ struct layer{ int flipped; int inputs; int outputs; + int extra; int truths; int h,w,c; int out_h, out_w, out_c; @@ -68,6 +69,7 @@ struct layer{ int side; int stride; int reverse; + int flatten; int pad; int sqrt; int flip; @@ -76,6 +78,8 @@ struct layer{ int xnor; int steps; int hidden; + int truth; + float smooth; float dot; float angle; float jitter; @@ -83,6 +87,7 @@ struct layer{ float exposure; float shift; float ratio; + float learning_rate_scale; int softmax; int classes; int coords; @@ -115,6 +120,8 @@ struct layer{ int classfix; int absolute; + int onlyforward; + int stopbackward; int dontload; int dontloadscales; @@ -149,7 +156,6 @@ struct layer{ float * weights; float * weight_updates; - float * col_image; float * delta; float * output; float * squared; @@ -235,8 +241,6 @@ struct layer{ float * variance_delta_gpu; float * mean_delta_gpu; - float * col_image_gpu; - float * x_gpu; float * x_norm_gpu; float * weights_gpu; @@ -256,6 +260,7 @@ struct layer{ #ifdef CUDNN cudnnTensorDescriptor_t srcTensorDesc, dstTensorDesc; cudnnTensorDescriptor_t dsrcTensorDesc, ddstTensorDesc; + cudnnTensorDescriptor_t normTensorDesc; cudnnFilterDescriptor_t weightDesc; cudnnFilterDescriptor_t dweightDesc; cudnnConvolutionDescriptor_t convDesc; diff --git a/src/local_layer.c b/src/local_layer.c index 31f0ca6ba56..9f8a7ec7df1 100644 --- a/src/local_layer.c +++ b/src/local_layer.c @@ -57,9 +57,10 @@ local_layer make_local_layer(int batch, int h, int w, int c, int n, int size, in float scale = sqrt(2./(size*size*c)); for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_uniform(-1,1); - l.col_image = calloc(out_h*out_w*size*size*c, sizeof(float)); l.output = calloc(l.batch*out_h * out_w * n, sizeof(float)); l.delta = calloc(l.batch*out_h * out_w * n, sizeof(float)); + + l.workspace_size = out_h*out_w*size*size*c; l.forward = forward_local_layer; l.backward = backward_local_layer; @@ -76,7 +77,6 @@ local_layer make_local_layer(int batch, int h, int w, int c, int n, int size, in l.biases_gpu = cuda_make_array(l.biases, l.outputs); l.bias_updates_gpu = cuda_make_array(l.bias_updates, l.outputs); - l.col_image_gpu = cuda_make_array(l.col_image, out_h*out_w*size*size*c); l.delta_gpu = cuda_make_array(l.delta, l.batch*out_h*out_w*n); l.output_gpu = cuda_make_array(l.output, l.batch*out_h*out_w*n); @@ -102,11 +102,11 @@ void forward_local_layer(const local_layer l, network_state state) for(i = 0; i < l.batch; ++i){ float *input = state.input + i*l.w*l.h*l.c; im2col_cpu(input, l.c, l.h, l.w, - l.size, l.stride, l.pad, l.col_image); + l.size, l.stride, l.pad, state.workspace); float *output = l.output + i*l.outputs; for(j = 0; j < locations; ++j){ float *a = l.weights + j*l.size*l.size*l.c*l.n; - float *b = l.col_image + j; + float *b = state.workspace + j; float *c = output + j; int m = l.n; @@ -133,11 +133,11 @@ void backward_local_layer(local_layer l, network_state state) for(i = 0; i < l.batch; ++i){ float *input = state.input + i*l.w*l.h*l.c; im2col_cpu(input, l.c, l.h, l.w, - l.size, l.stride, l.pad, l.col_image); + l.size, l.stride, l.pad, state.workspace); for(j = 0; j < locations; ++j){ float *a = l.delta + i*l.outputs + j; - float *b = l.col_image + j; + float *b = state.workspace + j; float *c = l.weight_updates + j*l.size*l.size*l.c*l.n; int m = l.n; int n = l.size*l.size*l.c; @@ -150,7 +150,7 @@ void backward_local_layer(local_layer l, network_state state) for(j = 0; j < locations; ++j){ float *a = l.weights + j*l.size*l.size*l.c*l.n; float *b = l.delta + i*l.outputs + j; - float *c = l.col_image + j; + float *c = state.workspace + j; int m = l.size*l.size*l.c; int n = 1; @@ -159,7 +159,7 @@ void backward_local_layer(local_layer l, network_state state) gemm(1,0,m,n,k,1,a,m,b,locations,0,c,locations); } - col2im_cpu(l.col_image, l.c, l.h, l.w, l.size, l.stride, l.pad, state.delta+i*l.c*l.h*l.w); + col2im_cpu(state.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, state.delta+i*l.c*l.h*l.w); } } } @@ -192,11 +192,11 @@ void forward_local_layer_gpu(const local_layer l, network_state state) for(i = 0; i < l.batch; ++i){ float *input = state.input + i*l.w*l.h*l.c; im2col_ongpu(input, l.c, l.h, l.w, - l.size, l.stride, l.pad, l.col_image_gpu); + l.size, l.stride, l.pad, state.workspace); float *output = l.output_gpu + i*l.outputs; for(j = 0; j < locations; ++j){ float *a = l.weights_gpu + j*l.size*l.size*l.c*l.n; - float *b = l.col_image_gpu + j; + float *b = state.workspace + j; float *c = output + j; int m = l.n; @@ -222,11 +222,11 @@ void backward_local_layer_gpu(local_layer l, network_state state) for(i = 0; i < l.batch; ++i){ float *input = state.input + i*l.w*l.h*l.c; im2col_ongpu(input, l.c, l.h, l.w, - l.size, l.stride, l.pad, l.col_image_gpu); + l.size, l.stride, l.pad, state.workspace); for(j = 0; j < locations; ++j){ float *a = l.delta_gpu + i*l.outputs + j; - float *b = l.col_image_gpu + j; + float *b = state.workspace + j; float *c = l.weight_updates_gpu + j*l.size*l.size*l.c*l.n; int m = l.n; int n = l.size*l.size*l.c; @@ -239,7 +239,7 @@ void backward_local_layer_gpu(local_layer l, network_state state) for(j = 0; j < locations; ++j){ float *a = l.weights_gpu + j*l.size*l.size*l.c*l.n; float *b = l.delta_gpu + i*l.outputs + j; - float *c = l.col_image_gpu + j; + float *c = state.workspace + j; int m = l.size*l.size*l.c; int n = 1; @@ -248,7 +248,7 @@ void backward_local_layer_gpu(local_layer l, network_state state) gemm_ongpu(1,0,m,n,k,1,a,m,b,locations,0,c,locations); } - col2im_ongpu(l.col_image_gpu, l.c, l.h, l.w, l.size, l.stride, l.pad, state.delta+i*l.c*l.h*l.w); + col2im_ongpu(state.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, state.delta+i*l.c*l.h*l.w); } } } diff --git a/src/lsd.c b/src/lsd.c new file mode 100644 index 00000000000..de29d761b27 --- /dev/null +++ b/src/lsd.c @@ -0,0 +1,924 @@ +#include "network.h" +#include "cost_layer.h" +#include "utils.h" +#include "parser.h" +#include "blas.h" + +#ifdef OPENCV +#include "opencv2/highgui/highgui_c.h" +#endif + +void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg, char *aweight, int clear) +{ +#ifdef GPU + //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; + char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list"; + //char *style_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; + char *style_images = "/home/pjreddie/zelda.txt"; + char *backup_directory = "/home/pjreddie/backup/"; + srand(time(0)); + network fnet = load_network(fcfg, fweight, clear); + network gnet = load_network(gcfg, gweight, clear); + network anet = load_network(acfg, aweight, clear); + char *gbase = basecfg(gcfg); + char *abase = basecfg(acfg); + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet.learning_rate, gnet.momentum, gnet.decay); + int imgs = gnet.batch*gnet.subdivisions; + int i = *gnet.seen/imgs; + data train, tbuffer; + data style, sbuffer; + + + list *slist = get_paths(style_images); + char **spaths = (char **)list_to_array(slist); + + list *tlist = get_paths(train_images); + char **tpaths = (char **)list_to_array(tlist); + + load_args targs= get_base_args(gnet); + targs.paths = tpaths; + targs.n = imgs; + targs.m = tlist->size; + targs.d = &tbuffer; + targs.type = CLASSIFICATION_DATA; + targs.classes = 1; + char *ls[1] = {"zelda"}; + targs.labels = ls; + + load_args sargs = get_base_args(gnet); + sargs.paths = spaths; + sargs.n = imgs; + sargs.m = slist->size; + sargs.d = &sbuffer; + sargs.type = CLASSIFICATION_DATA; + sargs.classes = 1; + sargs.labels = ls; + + pthread_t tload_thread = load_data_in_thread(targs); + pthread_t sload_thread = load_data_in_thread(sargs); + clock_t time; + + float aloss_avg = -1; + float floss_avg = -1; + + network_state fstate = {0}; + fstate.index = 0; + fstate.net = fnet; + int x_size = get_network_input_size(fnet)*fnet.batch; + int y_size = get_network_output_size(fnet)*fnet.batch; + fstate.input = cuda_make_array(0, x_size); + fstate.truth = cuda_make_array(0, y_size); + fstate.delta = cuda_make_array(0, x_size); + fstate.train = 1; + float *X = calloc(x_size, sizeof(float)); + float *y = calloc(y_size, sizeof(float)); + + float *ones = cuda_make_array(0, anet.batch); + float *zeros = cuda_make_array(0, anet.batch); + fill_ongpu(anet.batch, .99, ones, 1); + fill_ongpu(anet.batch, .01, zeros, 1); + + network_state astate = {0}; + astate.index = 0; + astate.net = anet; + int ax_size = get_network_input_size(anet)*anet.batch; + int ay_size = get_network_output_size(anet)*anet.batch; + astate.input = 0; + astate.truth = ones; + astate.delta = cuda_make_array(0, ax_size); + astate.train = 1; + + network_state gstate = {0}; + gstate.index = 0; + gstate.net = gnet; + int gx_size = get_network_input_size(gnet)*gnet.batch; + int gy_size = get_network_output_size(gnet)*gnet.batch; + gstate.input = cuda_make_array(0, gx_size); + gstate.truth = 0; + gstate.delta = 0; + gstate.train = 1; + + while (get_current_batch(gnet) < gnet.max_batches) { + i += 1; + time=clock(); + pthread_join(tload_thread, 0); + pthread_join(sload_thread, 0); + train = tbuffer; + style = sbuffer; + tload_thread = load_data_in_thread(targs); + sload_thread = load_data_in_thread(sargs); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + + data generated = copy_data(train); + time=clock(); + + int j, k; + float floss = 0; + for(j = 0; j < fnet.subdivisions; ++j){ + layer imlayer = gnet.layers[gnet.n - 1]; + get_next_batch(train, fnet.batch, j*fnet.batch, X, y); + + cuda_push_array(fstate.input, X, x_size); + cuda_push_array(gstate.input, X, gx_size); + *gnet.seen += gnet.batch; + + forward_network_gpu(fnet, fstate); + float *feats = fnet.layers[fnet.n - 2].output_gpu; + copy_ongpu(y_size, feats, 1, fstate.truth, 1); + + forward_network_gpu(gnet, gstate); + float *gen = gnet.layers[gnet.n-1].output_gpu; + copy_ongpu(x_size, gen, 1, fstate.input, 1); + + fill_ongpu(x_size, 0, fstate.delta, 1); + forward_network_gpu(fnet, fstate); + backward_network_gpu(fnet, fstate); + //HERE + + astate.input = gen; + fill_ongpu(ax_size, 0, astate.delta, 1); + forward_network_gpu(anet, astate); + backward_network_gpu(anet, astate); + + float *delta = imlayer.delta_gpu; + fill_ongpu(x_size, 0, delta, 1); + scal_ongpu(x_size, 100, astate.delta, 1); + scal_ongpu(x_size, .00001, fstate.delta, 1); + axpy_ongpu(x_size, 1, fstate.delta, 1, delta, 1); + axpy_ongpu(x_size, 1, astate.delta, 1, delta, 1); + + //fill_ongpu(x_size, 0, delta, 1); + //cuda_push_array(delta, X, x_size); + //axpy_ongpu(x_size, -1, imlayer.output_gpu, 1, delta, 1); + //printf("pix error: %f\n", cuda_mag_array(delta, x_size)); + printf("fea error: %f\n", cuda_mag_array(fstate.delta, x_size)); + printf("adv error: %f\n", cuda_mag_array(astate.delta, x_size)); + //axpy_ongpu(x_size, 1, astate.delta, 1, delta, 1); + + backward_network_gpu(gnet, gstate); + + floss += get_network_cost(fnet) /(fnet.subdivisions*fnet.batch); + + cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + for(k = 0; k < gnet.batch; ++k){ + int index = j*gnet.batch + k; + copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); + generated.y.vals[index][0] = .01; + } + } + +/* + image sim = float_to_image(anet.w, anet.h, anet.c, style.X.vals[j]); + show_image(sim, "style"); + cvWaitKey(0); + */ + + harmless_update_network_gpu(anet); + + data merge = concat_data(style, generated); + randomize_data(merge); + float aloss = train_network(anet, merge); + + update_network_gpu(gnet); + + free_data(merge); + free_data(train); + free_data(generated); + free_data(style); + if (aloss_avg < 0) aloss_avg = aloss; + if (floss_avg < 0) floss_avg = floss; + aloss_avg = aloss_avg*.9 + aloss*.1; + floss_avg = floss_avg*.9 + floss*.1; + + printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, floss, aloss, floss_avg, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs); + if(i%1000==0){ + char buff[256]; + sprintf(buff, "%s/%s_%d.weights", backup_directory, gbase, i); + save_weights(gnet, buff); + sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); + save_weights(anet, buff); + } + if(i%100==0){ + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, gbase); + save_weights(gnet, buff); + sprintf(buff, "%s/%s.backup", backup_directory, abase); + save_weights(anet, buff); + } + } +#endif +} + +void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear) +{ +#ifdef GPU + //char *train_images = "/home/pjreddie/data/coco/train1.txt"; + //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; + char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list"; + char *backup_directory = "/home/pjreddie/backup/"; + srand(time(0)); + char *base = basecfg(cfg); + char *abase = basecfg(acfg); + printf("%s\n", base); + network net = load_network(cfg, weight, clear); + network anet = load_network(acfg, aweight, clear); + + int i, j, k; + layer imlayer = {0}; + for (i = 0; i < net.n; ++i) { + if (net.layers[i].out_c == 3) { + imlayer = net.layers[i]; + break; + } + } + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + int imgs = net.batch*net.subdivisions; + i = *net.seen/imgs; + data train, buffer; + + + list *plist = get_paths(train_images); + //int N = plist->size; + char **paths = (char **)list_to_array(plist); + + load_args args = {0}; + args.w = net.w; + args.h = net.h; + args.paths = paths; + args.n = imgs; + args.m = plist->size; + args.d = &buffer; + + args.min = net.min_crop; + args.max = net.max_crop; + args.angle = net.angle; + args.aspect = net.aspect; + args.exposure = net.exposure; + args.saturation = net.saturation; + args.hue = net.hue; + args.size = net.w; + args.type = CLASSIFICATION_DATA; + args.classes = 1; + char *ls[1] = {"coco"}; + args.labels = ls; + + pthread_t load_thread = load_data_in_thread(args); + clock_t time; + + network_state gstate = {0}; + gstate.index = 0; + gstate.net = net; + int x_size = get_network_input_size(net)*net.batch; + int y_size = x_size; + gstate.input = cuda_make_array(0, x_size); + gstate.truth = cuda_make_array(0, y_size); + gstate.delta = 0; + gstate.train = 1; + float *pixs = calloc(x_size, sizeof(float)); + float *graypixs = calloc(x_size, sizeof(float)); + float *y = calloc(y_size, sizeof(float)); + + network_state astate = {0}; + astate.index = 0; + astate.net = anet; + int ay_size = get_network_output_size(anet)*anet.batch; + astate.input = 0; + astate.truth = 0; + astate.delta = 0; + astate.train = 1; + + float *imerror = cuda_make_array(0, imlayer.outputs); + float *ones_gpu = cuda_make_array(0, ay_size); + fill_ongpu(ay_size, .9, ones_gpu, 1); + + float aloss_avg = -1; + float gloss_avg = -1; + + //data generated = copy_data(train); + + while (get_current_batch(net) < net.max_batches) { + i += 1; + time=clock(); + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data_in_thread(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + + data gray = copy_data(train); + for(j = 0; j < imgs; ++j){ + image gim = float_to_image(net.w, net.h, net.c, gray.X.vals[j]); + grayscale_image_3c(gim); + train.y.vals[j][0] = .9; + + image yim = float_to_image(net.w, net.h, net.c, train.X.vals[j]); + //rgb_to_yuv(yim); + } + time=clock(); + float gloss = 0; + + for(j = 0; j < net.subdivisions; ++j){ + get_next_batch(train, net.batch, j*net.batch, pixs, y); + get_next_batch(gray, net.batch, j*net.batch, graypixs, y); + cuda_push_array(gstate.input, graypixs, x_size); + cuda_push_array(gstate.truth, pixs, x_size); + /* + image origi = float_to_image(net.w, net.h, 3, pixs); + image grayi = float_to_image(net.w, net.h, 3, graypixs); + show_image(grayi, "gray"); + show_image(origi, "orig"); + cvWaitKey(0); + */ + *net.seen += net.batch; + forward_network_gpu(net, gstate); + + fill_ongpu(imlayer.outputs, 0, imerror, 1); + astate.input = imlayer.output_gpu; + astate.delta = imerror; + astate.truth = ones_gpu; + forward_network_gpu(anet, astate); + backward_network_gpu(anet, astate); + + scal_ongpu(imlayer.outputs, .1, net.layers[net.n-1].delta_gpu, 1); + + backward_network_gpu(net, gstate); + + scal_ongpu(imlayer.outputs, 100, imerror, 1); + + printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); + printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs)); + + axpy_ongpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); + + gloss += get_network_cost(net) /(net.subdivisions*net.batch); + + cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + for(k = 0; k < net.batch; ++k){ + int index = j*net.batch + k; + copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1); + gray.y.vals[index][0] = .1; + } + } + harmless_update_network_gpu(anet); + + data merge = concat_data(train, gray); + randomize_data(merge); + float aloss = train_network(anet, merge); + + update_network_gpu(net); + update_network_gpu(anet); + free_data(merge); + free_data(train); + free_data(gray); + if (aloss_avg < 0) aloss_avg = aloss; + aloss_avg = aloss_avg*.9 + aloss*.1; + gloss_avg = gloss_avg*.9 + gloss*.1; + + printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs); + if(i%1000==0){ + char buff[256]; + sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); + save_weights(net, buff); + sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); + save_weights(anet, buff); + } + if(i%100==0){ + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, base); + save_weights(net, buff); + sprintf(buff, "%s/%s.backup", backup_directory, abase); + save_weights(anet, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s_final.weights", backup_directory, base); + save_weights(net, buff); +#endif +} + +void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int clear) +{ +#ifdef GPU + //char *train_images = "/home/pjreddie/data/coco/train1.txt"; + //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; + char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list"; + char *backup_directory = "/home/pjreddie/backup/"; + srand(time(0)); + char *base = basecfg(cfg); + char *abase = basecfg(acfg); + printf("%s\n", base); + network net = load_network(cfg, weight, clear); + network anet = load_network(acfg, aweight, clear); + + int i, j, k; + layer imlayer = {0}; + for (i = 0; i < net.n; ++i) { + if (net.layers[i].out_c == 3) { + imlayer = net.layers[i]; + break; + } + } + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + int imgs = net.batch*net.subdivisions; + i = *net.seen/imgs; + data train, buffer; + + + list *plist = get_paths(train_images); + //int N = plist->size; + char **paths = (char **)list_to_array(plist); + + load_args args = {0}; + args.w = net.w; + args.h = net.h; + args.paths = paths; + args.n = imgs; + args.m = plist->size; + args.d = &buffer; + + args.min = net.min_crop; + args.max = net.max_crop; + args.angle = net.angle; + args.aspect = net.aspect; + args.exposure = net.exposure; + args.saturation = net.saturation; + args.hue = net.hue; + args.size = net.w; + args.type = CLASSIFICATION_DATA; + args.classes = 1; + char *ls[1] = {"imagenet"}; + args.labels = ls; + + pthread_t load_thread = load_data_in_thread(args); + clock_t time; + + network_state gstate = {0}; + gstate.index = 0; + gstate.net = net; + int x_size = get_network_input_size(net)*net.batch; + int y_size = x_size; + gstate.input = cuda_make_array(0, x_size); + gstate.truth = cuda_make_array(0, y_size); + gstate.delta = 0; + gstate.train = 1; + float *pixs = calloc(x_size, sizeof(float)); + float *graypixs = calloc(x_size, sizeof(float)); + float *y = calloc(y_size, sizeof(float)); + + network_state astate = {0}; + astate.index = 0; + astate.net = anet; + int ay_size = get_network_output_size(anet)*anet.batch; + astate.input = 0; + astate.truth = 0; + astate.delta = 0; + astate.train = 1; + + float *imerror = cuda_make_array(0, imlayer.outputs); + float *ones_gpu = cuda_make_array(0, ay_size); + fill_ongpu(ay_size, .99, ones_gpu, 1); + + float aloss_avg = -1; + float gloss_avg = -1; + + //data generated = copy_data(train); + + while (get_current_batch(net) < net.max_batches) { + i += 1; + time=clock(); + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data_in_thread(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + + data gray = copy_data(train); + for(j = 0; j < imgs; ++j){ + image gim = float_to_image(net.w, net.h, net.c, gray.X.vals[j]); + grayscale_image_3c(gim); + train.y.vals[j][0] = .99; + + image yim = float_to_image(net.w, net.h, net.c, train.X.vals[j]); + //rgb_to_yuv(yim); + } + time=clock(); + float gloss = 0; + + for(j = 0; j < net.subdivisions; ++j){ + get_next_batch(train, net.batch, j*net.batch, pixs, y); + get_next_batch(gray, net.batch, j*net.batch, graypixs, y); + cuda_push_array(gstate.input, graypixs, x_size); + cuda_push_array(gstate.truth, pixs, x_size); + /* + image origi = float_to_image(net.w, net.h, 3, pixs); + image grayi = float_to_image(net.w, net.h, 3, graypixs); + show_image(grayi, "gray"); + show_image(origi, "orig"); + cvWaitKey(0); + */ + *net.seen += net.batch; + forward_network_gpu(net, gstate); + + fill_ongpu(imlayer.outputs, 0, imerror, 1); + astate.input = imlayer.output_gpu; + astate.delta = imerror; + astate.truth = ones_gpu; + forward_network_gpu(anet, astate); + backward_network_gpu(anet, astate); + + scal_ongpu(imlayer.outputs, .1, net.layers[net.n-1].delta_gpu, 1); + + backward_network_gpu(net, gstate); + + scal_ongpu(imlayer.outputs, 100, imerror, 1); + + printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); + printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs)); + + axpy_ongpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); + + gloss += get_network_cost(net) /(net.subdivisions*net.batch); + + cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + for(k = 0; k < net.batch; ++k){ + int index = j*net.batch + k; + copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1); + gray.y.vals[index][0] = .01; + } + } + harmless_update_network_gpu(anet); + + data merge = concat_data(train, gray); + randomize_data(merge); + float aloss = train_network(anet, merge); + + update_network_gpu(net); + update_network_gpu(anet); + free_data(merge); + free_data(train); + free_data(gray); + if (aloss_avg < 0) aloss_avg = aloss; + aloss_avg = aloss_avg*.9 + aloss*.1; + gloss_avg = gloss_avg*.9 + gloss*.1; + + printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs); + if(i%1000==0){ + char buff[256]; + sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); + save_weights(net, buff); + sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); + save_weights(anet, buff); + } + if(i%100==0){ + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, base); + save_weights(net, buff); + sprintf(buff, "%s/%s.backup", backup_directory, abase); + save_weights(anet, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s_final.weights", backup_directory, base); + save_weights(net, buff); +#endif +} + +void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfile, int clear) +{ +#ifdef GPU + char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; + char *backup_directory = "/home/pjreddie/backup/"; + srand(time(0)); + char *base = basecfg(cfgfile); + printf("%s\n", base); + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + if(clear) *net.seen = 0; + + char *abase = basecfg(acfgfile); + network anet = parse_network_cfg(acfgfile); + if(aweightfile){ + load_weights(&anet, aweightfile); + } + if(clear) *anet.seen = 0; + + int i, j, k; + layer imlayer = {0}; + for (i = 0; i < net.n; ++i) { + if (net.layers[i].out_c == 3) { + imlayer = net.layers[i]; + break; + } + } + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + int imgs = net.batch*net.subdivisions; + i = *net.seen/imgs; + data train, buffer; + + + list *plist = get_paths(train_images); + //int N = plist->size; + char **paths = (char **)list_to_array(plist); + + load_args args = {0}; + args.w = net.w; + args.h = net.h; + args.paths = paths; + args.n = imgs; + args.m = plist->size; + args.d = &buffer; + + args.min = net.min_crop; + args.max = net.max_crop; + args.angle = net.angle; + args.aspect = net.aspect; + args.exposure = net.exposure; + args.saturation = net.saturation; + args.hue = net.hue; + args.size = net.w; + args.type = CLASSIFICATION_DATA; + args.classes = 1; + char *ls[1] = {"coco"}; + args.labels = ls; + + pthread_t load_thread = load_data_in_thread(args); + clock_t time; + + network_state gstate = {0}; + gstate.index = 0; + gstate.net = net; + int x_size = get_network_input_size(net)*net.batch; + int y_size = 1*net.batch; + gstate.input = cuda_make_array(0, x_size); + gstate.truth = 0; + gstate.delta = 0; + gstate.train = 1; + float *X = calloc(x_size, sizeof(float)); + float *y = calloc(y_size, sizeof(float)); + + network_state astate = {0}; + astate.index = 0; + astate.net = anet; + int ay_size = get_network_output_size(anet)*anet.batch; + astate.input = 0; + astate.truth = 0; + astate.delta = 0; + astate.train = 1; + + float *imerror = cuda_make_array(0, imlayer.outputs); + float *ones_gpu = cuda_make_array(0, ay_size); + fill_ongpu(ay_size, 1, ones_gpu, 1); + + float aloss_avg = -1; + float gloss_avg = -1; + + //data generated = copy_data(train); + + while (get_current_batch(net) < net.max_batches) { + i += 1; + time=clock(); + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data_in_thread(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + + data generated = copy_data(train); + time=clock(); + float gloss = 0; + + for(j = 0; j < net.subdivisions; ++j){ + get_next_batch(train, net.batch, j*net.batch, X, y); + cuda_push_array(gstate.input, X, x_size); + *net.seen += net.batch; + forward_network_gpu(net, gstate); + + fill_ongpu(imlayer.outputs, 0, imerror, 1); + astate.input = imlayer.output_gpu; + astate.delta = imerror; + astate.truth = ones_gpu; + forward_network_gpu(anet, astate); + backward_network_gpu(anet, astate); + + scal_ongpu(imlayer.outputs, 1, imerror, 1); + axpy_ongpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); + + backward_network_gpu(net, gstate); + + printf("features %f\n", cuda_mag_array(imlayer.delta_gpu, imlayer.outputs)); + printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); + + gloss += get_network_cost(net) /(net.subdivisions*net.batch); + + cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + for(k = 0; k < net.batch; ++k){ + int index = j*net.batch + k; + copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); + generated.y.vals[index][0] = 0; + } + } + harmless_update_network_gpu(anet); + + data merge = concat_data(train, generated); + randomize_data(merge); + float aloss = train_network(anet, merge); + + update_network_gpu(net); + update_network_gpu(anet); + free_data(merge); + free_data(train); + free_data(generated); + if (aloss_avg < 0) aloss_avg = aloss; + aloss_avg = aloss_avg*.9 + aloss*.1; + gloss_avg = gloss_avg*.9 + gloss*.1; + + printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs); + if(i%1000==0){ + char buff[256]; + sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); + save_weights(net, buff); + sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); + save_weights(anet, buff); + } + if(i%100==0){ + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, base); + save_weights(net, buff); + sprintf(buff, "%s/%s.backup", backup_directory, abase); + save_weights(anet, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s_final.weights", backup_directory, base); + save_weights(net, buff); +#endif +} + +void train_lsd(char *cfgfile, char *weightfile, int clear) +{ + char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; + char *backup_directory = "/home/pjreddie/backup/"; + srand(time(0)); + char *base = basecfg(cfgfile); + printf("%s\n", base); + float avg_loss = -1; + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + if(clear) *net.seen = 0; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + int imgs = net.batch*net.subdivisions; + int i = *net.seen/imgs; + data train, buffer; + + + list *plist = get_paths(train_images); + //int N = plist->size; + char **paths = (char **)list_to_array(plist); + + load_args args = {0}; + args.w = net.w; + args.h = net.h; + args.paths = paths; + args.n = imgs; + args.m = plist->size; + args.d = &buffer; + + args.min = net.min_crop; + args.max = net.max_crop; + args.angle = net.angle; + args.aspect = net.aspect; + args.exposure = net.exposure; + args.saturation = net.saturation; + args.hue = net.hue; + args.size = net.w; + args.type = CLASSIFICATION_DATA; + args.classes = 1; + char *ls[1] = {"coco"}; + args.labels = ls; + + pthread_t load_thread = load_data_in_thread(args); + clock_t time; + //while(i*imgs < N*120){ + while(get_current_batch(net) < net.max_batches){ + i += 1; + time=clock(); + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data_in_thread(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + + time=clock(); + float loss = train_network(net, train); + if (avg_loss < 0) avg_loss = loss; + avg_loss = avg_loss*.9 + loss*.1; + + printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs); + if(i%1000==0){ + char buff[256]; + sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); + save_weights(net, buff); + } + if(i%100==0){ + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, base); + save_weights(net, buff); + } + free_data(train); + } + char buff[256]; + sprintf(buff, "%s/%s_final.weights", backup_directory, base); + save_weights(net, buff); +} + +void test_lsd(char *cfgfile, char *weightfile, char *filename) +{ + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + set_batch_network(&net, 1); + srand(2222222); + + clock_t time; + char buff[256]; + char *input = buff; + int i, imlayer = 0; + + for (i = 0; i < net.n; ++i) { + if (net.layers[i].out_c == 3) { + imlayer = i; + printf("%d\n", i); + break; + } + } + + while(1){ + if(filename){ + strncpy(input, filename, 256); + }else{ + printf("Enter Image Path: "); + fflush(stdout); + input = fgets(input, 256, stdin); + if(!input) return; + strtok(input, "\n"); + } + image im = load_image_color(input, 0, 0); + image resized = resize_min(im, net.w); + image crop = crop_image(resized, (resized.w - net.w)/2, (resized.h - net.h)/2, net.w, net.h); + //grayscale_image_3c(crop); + + float *X = crop.data; + time=clock(); + network_predict(net, X); + image out = get_network_image_layer(net, imlayer); + //yuv_to_rgb(out); + constrain_image(out); + printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + show_image(out, "out"); + show_image(crop, "crop"); + save_image(out, "out"); +#ifdef OPENCV + cvWaitKey(0); +#endif + + free_image(im); + free_image(resized); + free_image(crop); + if (filename) break; + } +} + + +void run_lsd(int argc, char **argv) +{ + if(argc < 4){ + fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]); + return; + } + + int clear = find_arg(argc, argv, "-clear"); + + char *cfg = argv[3]; + char *weights = (argc > 4) ? argv[4] : 0; + char *filename = (argc > 5) ? argv[5] : 0; + char *acfg = argv[5]; + char *aweights = (argc > 6) ? argv[6] : 0; + if(0==strcmp(argv[2], "train")) train_lsd(cfg, weights, clear); + else if(0==strcmp(argv[2], "train2")) train_lsd2(cfg, weights, acfg, aweights, clear); + else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear); + else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear); + else if(0==strcmp(argv[2], "test")) test_lsd(cfg, weights, filename); + /* + else if(0==strcmp(argv[2], "valid")) validate_lsd(cfg, weights); + */ +} diff --git a/src/matrix.c b/src/matrix.c index ee1497991c4..799916bff01 100644 --- a/src/matrix.c +++ b/src/matrix.c @@ -1,5 +1,6 @@ #include "matrix.h" #include "utils.h" +#include "blas.h" #include #include #include @@ -73,6 +74,20 @@ void matrix_add_matrix(matrix from, matrix to) } } +matrix copy_matrix(matrix m) +{ + matrix c = {0}; + c.rows = m.rows; + c.cols = m.cols; + c.vals = calloc(c.rows, sizeof(float *)); + int i; + for(i = 0; i < c.rows; ++i){ + c.vals[i] = calloc(c.cols, sizeof(float)); + copy_cpu(c.cols, m.vals[i], 1, c.vals[i], 1); + } + return c; +} + matrix make_matrix(int rows, int cols) { int i; diff --git a/src/matrix.h b/src/matrix.h index 641b5965d32..d6655eb4f0b 100644 --- a/src/matrix.h +++ b/src/matrix.h @@ -6,6 +6,7 @@ typedef struct matrix{ } matrix; matrix make_matrix(int rows, int cols); +matrix copy_matrix(matrix m); void free_matrix(matrix m); void print_matrix(matrix m); diff --git a/src/network.c b/src/network.c index 0914e37ed08..0d30dd8cc6c 100644 --- a/src/network.c +++ b/src/network.c @@ -27,6 +27,35 @@ #include "dropout_layer.h" #include "route_layer.h" #include "shortcut_layer.h" +#include "parser.h" +#include "data.h" + +load_args get_base_args(network net) +{ + load_args args = {0}; + args.w = net.w; + args.h = net.h; + args.size = net.w; + + args.min = net.min_crop; + args.max = net.max_crop; + args.angle = net.angle; + args.aspect = net.aspect; + args.exposure = net.exposure; + args.saturation = net.saturation; + args.hue = net.hue; + return args; +} + +network load_network(char *cfg, char *weights, int clear) +{ + network net = parse_network_cfg(cfg); + if(weights && weights[0] != 0){ + load_weights(&net, weights); + } + if(clear) *net.seen = 0; + return net; +} int get_current_batch(network net) { @@ -50,6 +79,7 @@ float get_current_rate(network net) int batch_num = get_current_batch(net); int i; float rate; + if (batch_num < net.burn_in) return net.learning_rate * pow((float)batch_num / net.burn_in, net.power); switch (net.policy) { case CONSTANT: return net.learning_rate; @@ -66,7 +96,6 @@ float get_current_rate(network net) case EXP: return net.learning_rate * pow(net.gamma, batch_num); case POLY: - if (batch_num < net.burn_in) return net.learning_rate * pow((float)batch_num / net.burn_in, net.power); return net.learning_rate * pow(1 - (float)batch_num / net.max_batches, net.power); case RANDOM: return net.learning_rate * pow(rand_uniform(0,1), net.power); @@ -150,7 +179,7 @@ void forward_network(network net, network_state state) state.index = i; layer l = net.layers[i]; if(l.delta){ - scal_cpu(l.outputs * l.batch, 0, l.delta, 1); + fill_cpu(l.outputs * l.batch, 0, l.delta, 1); } l.forward(l, state); state.input = l.output; @@ -165,7 +194,7 @@ void update_network(network net) for(i = 0; i < net.n; ++i){ layer l = net.layers[i]; if(l.update){ - l.update(l, update_batch, rate, net.momentum, net.decay); + l.update(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); } } } @@ -218,6 +247,7 @@ void backward_network(network net, network_state state) state.delta = prev.delta; } layer l = net.layers[i]; + if(l.stopbackward) break; l.backward(l, state); } } @@ -414,6 +444,9 @@ detection_layer get_network_detection_layer(network net) image get_network_image_layer(network net, int i) { layer l = net.layers[i]; + #ifdef GPU + cuda_pull_array(l.output_gpu, l.output, l.outputs); + #endif if (l.out_w && l.out_h && l.out_c){ return float_to_image(l.out_w, l.out_h, l.out_c, l.output); } diff --git a/src/network.h b/src/network.h index e48cbc28556..20c75b61f6a 100644 --- a/src/network.h +++ b/src/network.h @@ -43,6 +43,7 @@ typedef struct network{ float eps; int inputs; + int notruth; int h, w, c; int max_crop; int min_crop; @@ -82,6 +83,7 @@ float *get_network_output_gpu(network net); void forward_network_gpu(network net, network_state state); void backward_network_gpu(network net, network_state state); void update_network_gpu(network net); +void harmless_update_network_gpu(network net); #endif float get_current_rate(network net); @@ -121,6 +123,8 @@ int resize_network(network *net, int w, int h); void set_batch_network(network *net, int b); int get_network_input_size(network net); float get_network_cost(network net); +network load_network(char *cfg, char *weights, int clear); +load_args get_base_args(network net); int get_network_nuisance(network net); int get_network_background(network net); diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 313cd6d1686..8088d725c41 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -50,8 +50,10 @@ void forward_network_gpu(network net, network_state state) if(l.delta_gpu){ fill_ongpu(l.outputs * l.batch, 0, l.delta_gpu, 1); } + //if(l.c ==3 && i > 5) state.input = *net.input_gpu; l.forward_gpu(l, state); state.input = l.output_gpu; + if(l.truth) state.truth = l.output_gpu; } } @@ -64,6 +66,7 @@ void backward_network_gpu(network net, network_state state) for(i = net.n-1; i >= 0; --i){ state.index = i; layer l = net.layers[i]; + if(l.stopbackward) break; if(i == 0){ state.input = original_input; state.delta = original_delta; @@ -86,11 +89,18 @@ void update_network_gpu(network net) layer l = net.layers[i]; l.t = get_current_batch(net); if(l.update_gpu){ - l.update_gpu(l, update_batch, rate, net.momentum, net.decay); + l.update_gpu(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); } } } +void harmless_update_network_gpu(network net) +{ + net.learning_rate = 0; + net.momentum = 1; + update_network_gpu(net); +} + void forward_backward_network_gpu(network net, float *x, float *y) { network_state state; @@ -101,10 +111,10 @@ void forward_backward_network_gpu(network net, float *x, float *y) if(net.layers[net.n-1].truths) y_size = net.layers[net.n-1].truths*net.batch; if(!*net.input_gpu){ *net.input_gpu = cuda_make_array(x, x_size); - *net.truth_gpu = cuda_make_array(y, y_size); + if(!net.notruth) *net.truth_gpu = cuda_make_array(y, y_size); }else{ cuda_push_array(*net.input_gpu, x, x_size); - cuda_push_array(*net.truth_gpu, y, y_size); + if(!net.notruth) cuda_push_array(*net.truth_gpu, y, y_size); } state.input = *net.input_gpu; state.delta = 0; @@ -180,7 +190,7 @@ void update_layer(layer l, network net) float rate = get_current_rate(net); l.t = get_current_batch(net); if(l.update_gpu){ - l.update_gpu(l, update_batch, rate, net.momentum, net.decay); + l.update_gpu(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); } } diff --git a/src/nightmare.c b/src/nightmare.c index ec7166ccf99..8a05d21d801 100644 --- a/src/nightmare.c +++ b/src/nightmare.c @@ -52,6 +52,7 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa image delta = make_image(im.w, im.h, im.c); network_state state = {0}; + state.net = *net; #ifdef GPU state.input = cuda_make_array(im.data, im.w*im.h*im.c); @@ -142,6 +143,7 @@ void reconstruct_picture(network net, float *features, image recon, image update image delta = make_image(recon.w, recon.h, recon.c); network_state state = {0}; + state.net = net; #ifdef GPU state.input = cuda_make_array(recon.data, recon.w*recon.h*recon.c); state.delta = cuda_make_array(delta.data, delta.w*delta.h*delta.c); @@ -178,6 +180,113 @@ void reconstruct_picture(network net, float *features, image recon, image update } } +/* +void run_lsd(int argc, char **argv) +{ + srand(0); + if(argc < 3){ + fprintf(stderr, "usage: %s %s [cfg] [weights] [image] [options! (optional)]\n", argv[0], argv[1]); + return; + } + + char *cfg = argv[2]; + char *weights = argv[3]; + char *input = argv[4]; + + int norm = find_int_arg(argc, argv, "-norm", 1); + int rounds = find_int_arg(argc, argv, "-rounds", 1); + int iters = find_int_arg(argc, argv, "-iters", 10); + float rate = find_float_arg(argc, argv, "-rate", .04); + float momentum = find_float_arg(argc, argv, "-momentum", .9); + float lambda = find_float_arg(argc, argv, "-lambda", .01); + char *prefix = find_char_arg(argc, argv, "-prefix", 0); + int reconstruct = find_arg(argc, argv, "-reconstruct"); + int smooth_size = find_int_arg(argc, argv, "-smooth", 1); + + network net = parse_network_cfg(cfg); + load_weights(&net, weights); + char *cfgbase = basecfg(cfg); + char *imbase = basecfg(input); + + set_batch_network(&net, 1); + image im = load_image_color(input, 0, 0); + + float *features = 0; + image update; + if (reconstruct){ + im = letterbox_image(im, net.w, net.h); + + int zz = 0; + network_predict(net, im.data); + image out_im = get_network_image(net); + image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz); + //flip_image(crop); + image f_im = resize_image(crop, out_im.w, out_im.h); + free_image(crop); + printf("%d features\n", out_im.w*out_im.h*out_im.c); + + + im = resize_image(im, im.w, im.h); + f_im = resize_image(f_im, f_im.w, f_im.h); + features = f_im.data; + + int i; + for(i = 0; i < 14*14*512; ++i){ + features[i] += rand_uniform(-.19, .19); + } + + free_image(im); + im = make_random_image(im.w, im.h, im.c); + update = make_image(im.w, im.h, im.c); + + } + + int e; + int n; + for(e = 0; e < rounds; ++e){ + fprintf(stderr, "Iteration: "); + fflush(stderr); + for(n = 0; n < iters; ++n){ + fprintf(stderr, "%d, ", n); + fflush(stderr); + if(reconstruct){ + reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size, 1); + //if ((n+1)%30 == 0) rate *= .5; + show_image(im, "reconstruction"); +#ifdef OPENCV + cvWaitKey(10); +#endif + }else{ + int layer = max_layer + rand()%range - range/2; + int octave = rand()%octaves; + optimize_picture(&net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm); + } + } + fprintf(stderr, "done\n"); + char buff[256]; + if (prefix){ + sprintf(buff, "%s/%s_%s_%d_%06d",prefix, imbase, cfgbase, max_layer, e); + }else{ + sprintf(buff, "%s_%s_%d_%06d",imbase, cfgbase, max_layer, e); + } + printf("%d %s\n", e, buff); + save_image(im, buff); + //show_image(im, buff); + //cvWaitKey(0); + + if(rotate){ + image rot = rotate_image(im, rotate); + free_image(im); + im = rot; + } + image crop = crop_image(im, im.w * (1. - zoom)/2., im.h * (1.-zoom)/2., im.w*zoom, im.h*zoom); + image resized = resize_image(crop, im.w, im.h); + free_image(im); + free_image(crop); + im = resized; + } +} +*/ void run_nightmare(int argc, char **argv) { @@ -224,6 +333,7 @@ void run_nightmare(int argc, char **argv) free_image(im); im = resized; } + im = letterbox_image(im, net.w, net.h); float *features = 0; image update; @@ -246,13 +356,11 @@ void run_nightmare(int argc, char **argv) int i; for(i = 0; i < 14*14*512; ++i){ - features[i] += rand_uniform(-.19, .19); + //features[i] += rand_uniform(-.19, .19); } - free_image(im); im = make_random_image(im.w, im.h, im.c); update = make_image(im.w, im.h, im.c); - } int e; diff --git a/src/parser.c b/src/parser.c index 3f39a13838b..c89d98de58d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -9,6 +9,7 @@ #include "batchnorm_layer.h" #include "blas.h" #include "connected_layer.h" +#include "deconvolutional_layer.h" #include "convolutional_layer.h" #include "cost_layer.h" #include "crnn_layer.h" @@ -48,6 +49,8 @@ LAYER_TYPE string_to_layer_type(char * type) if (strcmp(type, "[local]")==0) return LOCAL; if (strcmp(type, "[conv]")==0 || strcmp(type, "[convolutional]")==0) return CONVOLUTIONAL; + if (strcmp(type, "[deconv]")==0 + || strcmp(type, "[deconvolutional]")==0) return DECONVOLUTIONAL; if (strcmp(type, "[activation]")==0) return ACTIVE; if (strcmp(type, "[net]")==0 || strcmp(type, "[network]")==0) return NETWORK; @@ -135,6 +138,29 @@ local_layer parse_local(list *options, size_params params) return layer; } +layer parse_deconvolutional(list *options, size_params params) +{ + int n = option_find_int(options, "filters",1); + int size = option_find_int(options, "size",1); + int stride = option_find_int(options, "stride",1); + + char *activation_s = option_find_str(options, "activation", "logistic"); + ACTIVATION activation = get_activation(activation_s); + + int batch,h,w,c; + h = params.h; + w = params.w; + c = params.c; + batch=params.batch; + if(!(h && w && c)) error("Layer before deconvolutional layer must output image."); + int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); + + layer l = make_deconvolutional_layer(batch,h,w,c,n,size,stride,activation, batch_normalize); + + return l; +} + + convolutional_layer parse_convolutional(list *options, size_params params) { int n = option_find_int(options, "filters",1); @@ -312,6 +338,7 @@ cost_layer parse_cost(list *options, size_params params) float scale = option_find_float_quiet(options, "scale",1); cost_layer layer = make_cost_layer(params.batch, params.inputs, type, scale); layer.ratio = option_find_float_quiet(options, "ratio",0); + layer.thresh = option_find_float_quiet(options, "thresh",0); return layer; } @@ -343,6 +370,8 @@ layer parse_reorg(list *options, size_params params) { int stride = option_find_int(options, "stride",1); int reverse = option_find_int_quiet(options, "reverse",0); + int flatten = option_find_int_quiet(options, "flatten",0); + int extra = option_find_int_quiet(options, "extra",0); int batch,h,w,c; h = params.h; @@ -351,7 +380,7 @@ layer parse_reorg(list *options, size_params params) batch=params.batch; if(!(h && w && c)) error("Layer before reorg layer must output image."); - layer layer = make_reorg_layer(batch,w,h,c,stride,reverse); + layer layer = make_reorg_layer(batch,w,h,c,stride,reverse, flatten, extra); return layer; } @@ -508,6 +537,7 @@ void parse_net_options(list *options, network *net) net->decay = option_find_float(options, "decay", .0001); int subdivs = option_find_int(options, "subdivisions",1); net->time_steps = option_find_int_quiet(options, "time_steps",1); + net->notruth = option_find_int_quiet(options, "notruth",0); net->batch /= subdivs; net->batch *= net->time_steps; net->subdivisions = subdivs; @@ -537,6 +567,7 @@ void parse_net_options(list *options, network *net) char *policy_s = option_find_str(options, "policy", "constant"); net->policy = get_policy(policy_s); net->burn_in = option_find_int_quiet(options, "burn_in", 0); + net->power = option_find_float_quiet(options, "power", 4); if(net->policy == STEP){ net->step = option_find_int(options, "step", 1); net->scale = option_find_float(options, "scale", 1); @@ -570,7 +601,6 @@ void parse_net_options(list *options, network *net) net->gamma = option_find_float(options, "gamma", 1); net->step = option_find_int(options, "step", 1); } else if (net->policy == POLY || net->policy == RANDOM){ - net->power = option_find_float(options, "power", 1); } net->max_batches = option_find_int(options, "max_batches", 0); } @@ -617,6 +647,8 @@ network parse_network_cfg(char *filename) LAYER_TYPE lt = string_to_layer_type(s->type); if(lt == CONVOLUTIONAL){ l = parse_convolutional(options, params); + }else if(lt == DECONVOLUTIONAL){ + l = parse_deconvolutional(options, params); }else if(lt == LOCAL){ l = parse_local(options, params); }else if(lt == ACTIVE){ @@ -665,8 +697,13 @@ network parse_network_cfg(char *filename) }else{ fprintf(stderr, "Type not recognized: %s\n", s->type); } + l.truth = option_find_int_quiet(options, "truth", 0); + l.onlyforward = option_find_int_quiet(options, "onlyforward", 0); + l.stopbackward = option_find_int_quiet(options, "stopbackward", 0); l.dontload = option_find_int_quiet(options, "dontload", 0); l.dontloadscales = option_find_int_quiet(options, "dontloadscales", 0); + l.learning_rate_scale = option_find_float_quiet(options, "learning_rate", 1); + l.smooth = option_find_float_quiet(options, "smooth", 0); option_unused(options); net.layers[count] = l; if (l.workspace_size > workspace_size) workspace_size = l.workspace_size; @@ -840,7 +877,7 @@ void save_weights_upto(network net, char *filename, int cutoff) int i; for(i = 0; i < net.n && i < cutoff; ++i){ layer l = net.layers[i]; - if(l.type == CONVOLUTIONAL){ + if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ save_convolutional_weights(l, fp); } if(l.type == CONNECTED){ save_connected_weights(l, fp); @@ -1005,7 +1042,7 @@ void load_convolutional_weights(layer l, FILE *fp) } -void load_weights_upto(network *net, char *filename, int cutoff) +void load_weights_upto(network *net, char *filename, int start, int cutoff) { #ifdef GPU if(net->gpu_index >= 0){ @@ -1027,10 +1064,10 @@ void load_weights_upto(network *net, char *filename, int cutoff) int transpose = (major > 1000) || (minor > 1000); int i; - for(i = 0; i < net->n && i < cutoff; ++i){ + for(i = start; i < net->n && i < cutoff; ++i){ layer l = net->layers[i]; if (l.dontload) continue; - if(l.type == CONVOLUTIONAL){ + if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ load_convolutional_weights(l, fp); } if(l.type == CONNECTED){ @@ -1075,6 +1112,6 @@ void load_weights_upto(network *net, char *filename, int cutoff) void load_weights(network *net, char *filename) { - load_weights_upto(net, filename, net->n); + load_weights_upto(net, filename, 0, net->n); } diff --git a/src/parser.h b/src/parser.h index 6cff4fb57d5..473f21a9dac 100644 --- a/src/parser.h +++ b/src/parser.h @@ -8,6 +8,6 @@ void save_weights(network net, char *filename); void save_weights_upto(network net, char *filename, int cutoff); void save_weights_double(network net, char *filename); void load_weights(network *net, char *filename); -void load_weights_upto(network *net, char *filename, int cutoff); +void load_weights_upto(network *net, char *filename, int start, int cutoff); #endif diff --git a/src/region_layer.c b/src/region_layer.c index f5522c3f10b..5a3794a51ca 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -18,6 +18,10 @@ layer make_region_layer(int batch, int w, int h, int n, int classes, int coords) l.batch = batch; l.h = h; l.w = w; + l.c = n*(classes + coords + 1); + l.out_w = l.w; + l.out_h = l.h; + l.out_c = l.c; l.classes = classes; l.coords = coords; l.cost = calloc(1, sizeof(float)); @@ -68,19 +72,19 @@ void resize_region_layer(layer *l, int w, int h) #endif } -box get_region_box(float *x, float *biases, int n, int index, int i, int j, int w, int h) +box get_region_box(float *x, float *biases, int n, int index, int i, int j, int w, int h, int stride) { box b; - b.x = (i + logistic_activate(x[index + 0])) / w; - b.y = (j + logistic_activate(x[index + 1])) / h; - b.w = exp(x[index + 2]) * biases[2*n] / w; - b.h = exp(x[index + 3]) * biases[2*n+1] / h; + b.x = (i + x[index + 0*stride]) / w; + b.y = (j + x[index + 1*stride]) / h; + b.w = exp(x[index + 2*stride]) * biases[2*n] / w; + b.h = exp(x[index + 3*stride]) * biases[2*n+1] / h; return b; } -float delta_region_box(box truth, float *x, float *biases, int n, int index, int i, int j, int w, int h, float *delta, float scale) +float delta_region_box(box truth, float *x, float *biases, int n, int index, int i, int j, int w, int h, float *delta, float scale, int stride) { - box pred = get_region_box(x, biases, n, index, i, j, w, h); + box pred = get_region_box(x, biases, n, index, i, j, w, h, stride); float iou = box_iou(pred, truth); float tx = (truth.x*w - i); @@ -88,34 +92,34 @@ float delta_region_box(box truth, float *x, float *biases, int n, int index, int float tw = log(truth.w*w / biases[2*n]); float th = log(truth.h*h / biases[2*n + 1]); - delta[index + 0] = scale * (tx - logistic_activate(x[index + 0])) * logistic_gradient(logistic_activate(x[index + 0])); - delta[index + 1] = scale * (ty - logistic_activate(x[index + 1])) * logistic_gradient(logistic_activate(x[index + 1])); - delta[index + 2] = scale * (tw - x[index + 2]); - delta[index + 3] = scale * (th - x[index + 3]); + delta[index + 0*stride] = scale * (tx - x[index + 0*stride]); + delta[index + 1*stride] = scale * (ty - x[index + 1*stride]); + delta[index + 2*stride] = scale * (tw - x[index + 2*stride]); + delta[index + 3*stride] = scale * (th - x[index + 3*stride]); return iou; } -void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, float *avg_cat) +void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, int stride, float *avg_cat) { int i, n; if(hier){ float pred = 1; while(class >= 0){ - pred *= output[index + class]; + pred *= output[index + stride*class]; int g = hier->group[class]; int offset = hier->group_offset[g]; for(i = 0; i < hier->group_size[g]; ++i){ - delta[index + offset + i] = scale * (0 - output[index + offset + i]); + delta[index + stride*(offset + i)] = scale * (0 - output[index + stride*(offset + i)]); } - delta[index + class] = scale * (1 - output[index + class]); + delta[index + stride*class] = scale * (1 - output[index + stride*class]); class = hier->parent[class]; } *avg_cat += pred; } else { for(n = 0; n < classes; ++n){ - delta[index + n] = scale * (((n == class)?1 : 0) - output[index + n]); - if(n == class) *avg_cat += output[index + n]; + delta[index + stride*n] = scale * (((n == class)?1 : 0) - output[index + stride*n]); + if(n == class) *avg_cat += output[index + stride*n]; } } } @@ -130,42 +134,35 @@ float tisnan(float x) return (x != x); } +int entry_index(layer l, int batch, int location, int entry) +{ + int n = location / (l.w*l.h); + int loc = location % (l.w*l.h); + return batch*l.outputs + n*l.w*l.h*(l.coords+l.classes+1) + entry*l.w*l.h + loc; +} + void softmax_tree(float *input, int batch, int inputs, float temp, tree *hierarchy, float *output); void forward_region_layer(const layer l, network_state state) { int i,j,b,t,n; - int size = l.coords + l.classes + 1; memcpy(l.output, state.input, l.outputs*l.batch*sizeof(float)); -#ifndef GPU - flatten(l.output, l.w*l.h, size*l.n, l.batch, 1); -#endif - for (b = 0; b < l.batch; ++b){ - for(i = 0; i < l.h*l.w*l.n; ++i){ - int index = size*i + b*l.outputs; - l.output[index + 4] = logistic_activate(l.output[index + 4]); - } - } - #ifndef GPU if (l.softmax_tree){ - for (b = 0; b < l.batch; ++b){ - for(i = 0; i < l.h*l.w*l.n; ++i){ - int index = size*i + b*l.outputs; - softmax_tree(l.output + index + 5, 1, 0, 1, l.softmax_tree, l.output + index + 5); - } + int i; + int count = 5; + for (i = 0; i < l.softmax_tree->groups; ++i) { + int group_size = l.softmax_tree->group_size[i]; + softmax_cpu(state.input + count, group_size, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + count); + count += group_size; } } else if (l.softmax){ - for (b = 0; b < l.batch; ++b){ - for(i = 0; i < l.h*l.w*l.n; ++i){ - int index = size*i + b*l.outputs; - softmax(l.output + index + 5, l.classes, 1, l.output + index + 5); - } - } + softmax_cpu(state.input + 5, l.classes, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + 5); } #endif - if(!state.train) return; + memset(l.delta, 0, l.outputs * l.batch * sizeof(float)); + if(!state.train) return; float avg_iou = 0; float recall = 0; float avg_cat = 0; @@ -178,26 +175,28 @@ void forward_region_layer(const layer l, network_state state) if(l.softmax_tree){ int onlyclass = 0; for(t = 0; t < 30; ++t){ - box truth = float_to_box(state.truth + t*5 + b*l.truths); + box truth = float_to_box(state.truth + t*5 + b*l.truths, 1); if(!truth.x) break; int class = state.truth[t*5 + b*l.truths + 4]; float maxp = 0; int maxi = 0; if(truth.x > 100000 && truth.y > 100000){ for(n = 0; n < l.n*l.w*l.h; ++n){ - int index = size*n + b*l.outputs + 5; - float scale = l.output[index-1]; - l.delta[index - 1] = l.noobject_scale * ((0 - l.output[index - 1]) * logistic_gradient(l.output[index - 1])); - float p = scale*get_hierarchy_probability(l.output + index, l.softmax_tree, class); + int class_index = entry_index(l, b, n, 5); + int obj_index = entry_index(l, b, n, 4); + float scale = l.output[obj_index]; + l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); + float p = scale*get_hierarchy_probability(l.output + class_index, l.softmax_tree, class, l.w*l.h); if(p > maxp){ maxp = p; maxi = n; } } - int index = size*maxi + b*l.outputs + 5; - delta_region_class(l.output, l.delta, index, class, l.classes, l.softmax_tree, l.class_scale, &avg_cat); - if(l.output[index - 1] < .3) l.delta[index - 1] = l.object_scale * ((.3 - l.output[index - 1]) * logistic_gradient(l.output[index - 1])); - else l.delta[index - 1] = 0; + int class_index = entry_index(l, b, maxi, 5); + int obj_index = entry_index(l, b, maxi, 4); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); + if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); + else l.delta[obj_index] = 0; ++class_count; onlyclass = 1; break; @@ -208,21 +207,22 @@ void forward_region_layer(const layer l, network_state state) for (j = 0; j < l.h; ++j) { for (i = 0; i < l.w; ++i) { for (n = 0; n < l.n; ++n) { - int index = size*(j*l.w*l.n + i*l.n + n) + b*l.outputs; - box pred = get_region_box(l.output, l.biases, n, index, i, j, l.w, l.h); + int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); + box pred = get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); float best_iou = 0; for(t = 0; t < 30; ++t){ - box truth = float_to_box(state.truth + t*5 + b*l.truths); + box truth = float_to_box(state.truth + t*5 + b*l.truths, 1); if(!truth.x) break; float iou = box_iou(pred, truth); if (iou > best_iou) { best_iou = iou; } } - avg_anyobj += l.output[index + 4]; - l.delta[index + 4] = l.noobject_scale * ((0 - l.output[index + 4]) * logistic_gradient(l.output[index + 4])); + int obj_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 4); + avg_anyobj += l.output[obj_index]; + l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); if (best_iou > l.thresh) { - l.delta[index + 4] = 0; + l.delta[obj_index] = 0; } if(*(state.net.seen) < 12800){ @@ -231,17 +231,16 @@ void forward_region_layer(const layer l, network_state state) truth.y = (j + .5)/l.h; truth.w = l.biases[2*n]/l.w; truth.h = l.biases[2*n+1]/l.h; - delta_region_box(truth, l.output, l.biases, n, index, i, j, l.w, l.h, l.delta, .01); + delta_region_box(truth, l.output, l.biases, n, box_index, i, j, l.w, l.h, l.delta, .01, l.w*l.h); } } } } for(t = 0; t < 30; ++t){ - box truth = float_to_box(state.truth + t*5 + b*l.truths); + box truth = float_to_box(state.truth + t*5 + b*l.truths, 1); if(!truth.x) break; float best_iou = 0; - int best_index = 0; int best_n = 0; i = (truth.x * l.w); j = (truth.y * l.h); @@ -251,8 +250,8 @@ void forward_region_layer(const layer l, network_state state) truth_shift.y = 0; //printf("index %d %d\n",i, j); for(n = 0; n < l.n; ++n){ - int index = size*(j*l.w*l.n + i*l.n + n) + b*l.outputs; - box pred = get_region_box(l.output, l.biases, n, index, i, j, l.w, l.h); + int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); + box pred = get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); if(l.bias_match){ pred.w = l.biases[2*n]/l.w; pred.h = l.biases[2*n+1]/l.h; @@ -262,80 +261,118 @@ void forward_region_layer(const layer l, network_state state) pred.y = 0; float iou = box_iou(pred, truth_shift); if (iou > best_iou){ - best_index = index; best_iou = iou; best_n = n; } } //printf("%d %f (%f, %f) %f x %f\n", best_n, best_iou, truth.x, truth.y, truth.w, truth.h); - float iou = delta_region_box(truth, l.output, l.biases, best_n, best_index, i, j, l.w, l.h, l.delta, l.coord_scale); + int box_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 0); + float iou = delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, l.delta, l.coord_scale * (2 - truth.w*truth.h), l.w*l.h); if(iou > .5) recall += 1; avg_iou += iou; //l.delta[best_index + 4] = iou - l.output[best_index + 4]; - avg_obj += l.output[best_index + 4]; - l.delta[best_index + 4] = l.object_scale * (1 - l.output[best_index + 4]) * logistic_gradient(l.output[best_index + 4]); + int obj_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 4); + avg_obj += l.output[obj_index]; + l.delta[obj_index] = l.object_scale * (1 - l.output[obj_index]); if (l.rescore) { - l.delta[best_index + 4] = l.object_scale * (iou - l.output[best_index + 4]) * logistic_gradient(l.output[best_index + 4]); + l.delta[obj_index] = l.object_scale * (iou - l.output[obj_index]); } - int class = state.truth[t*5 + b*l.truths + 4]; if (l.map) class = l.map[class]; - delta_region_class(l.output, l.delta, best_index + 5, class, l.classes, l.softmax_tree, l.class_scale, &avg_cat); + int class_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 5); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); ++count; ++class_count; } } //printf("\n"); -#ifndef GPU - flatten(l.delta, l.w*l.h, size*l.n, l.batch, 0); -#endif *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2); printf("Region Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\n", avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, count); } void backward_region_layer(const layer l, network_state state) { - axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, state.delta, 1); + /* + int b; + int size = l.coords + l.classes + 1; + for (b = 0; b < l.batch*l.n; ++b){ + int index = (b*size + 4)*l.w*l.h; + gradient_array(l.output + index, l.w*l.h, LOGISTIC, l.delta + index); + } + axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, state.delta, 1); + */ } void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh) { - int i,j,n; + int i,j,n,z; float *predictions = l.output; + if (l.batch == 2) { + float *flip = l.output + l.outputs; + for (j = 0; j < l.h; ++j) { + for (i = 0; i < l.w/2; ++i) { + for (n = 0; n < l.n; ++n) { + for(z = 0; z < l.classes + 5; ++z){ + int i1 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + i; + int i2 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + (l.w - i - 1); + float swap = flip[i1]; + flip[i1] = flip[i2]; + flip[i2] = swap; + if(z == 0){ + flip[i1] = -flip[i1]; + flip[i2] = -flip[i2]; + } + } + } + } + } + for(i = 0; i < l.outputs; ++i){ + l.output[i] = (l.output[i] + flip[i])/2.; + } + } for (i = 0; i < l.w*l.h; ++i){ int row = i / l.w; int col = i % l.w; for(n = 0; n < l.n; ++n){ - int index = i*l.n + n; - int p_index = index * (l.classes + 5) + 4; - float scale = predictions[p_index]; - int box_index = index * (l.classes + 5); - boxes[index] = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h); + int index = n*l.w*l.h + i; + int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4); + int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); + float scale = predictions[obj_index]; + boxes[index] = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h, l.w*l.h); + if(1){ + int max = w > h ? w : h; + boxes[index].x = (boxes[index].x - (max - w)/2./max) / ((float)w/max); + boxes[index].y = (boxes[index].y - (max - h)/2./max) / ((float)h/max); + boxes[index].w *= (float)max/w; + boxes[index].h *= (float)max/h; + } boxes[index].x *= w; boxes[index].y *= h; boxes[index].w *= w; boxes[index].h *= h; - int class_index = index * (l.classes + 5) + 5; + int class_index = entry_index(l, 0, n*l.w*l.h + i, 5); if(l.softmax_tree){ - hierarchy_predictions(predictions + class_index, l.classes, l.softmax_tree, 0); + hierarchy_predictions(predictions + class_index, l.classes, l.softmax_tree, 0, l.w*l.h); if(map){ for(j = 0; j < 200; ++j){ - float prob = scale*predictions[class_index+map[j]]; + int class_index = entry_index(l, 0, n*l.w*l.h + i, 5 + map[j]); + float prob = scale*predictions[class_index]; probs[index][j] = (prob > thresh) ? prob : 0; } } else { - int j = hierarchy_top_prediction(predictions + class_index, l.softmax_tree, tree_thresh); + int j = hierarchy_top_prediction(predictions + class_index, l.softmax_tree, tree_thresh, l.w*l.h); probs[index][j] = (scale > thresh) ? scale : 0; probs[index][l.classes] = scale; } } else { for(j = 0; j < l.classes; ++j){ - float prob = scale*predictions[class_index+j]; + int class_index = entry_index(l, 0, n*l.w*l.h + i, 5 + j); + float prob = scale*predictions[class_index]; probs[index][j] = (prob > thresh) ? prob : 0; } } @@ -350,23 +387,33 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b void forward_region_layer_gpu(const layer l, network_state state) { - /* - if(!state.train){ - copy_ongpu(l.batch*l.inputs, state.input, 1, l.output_gpu, 1); - return; - } - */ - flatten_ongpu(state.input, l.h*l.w, l.n*(l.coords + l.classes + 1), l.batch, 1, l.output_gpu); - if(l.softmax_tree){ + copy_ongpu(l.batch*l.inputs, state.input, 1, l.output_gpu, 1); + int b, n; + for (b = 0; b < l.batch; ++b){ + for(n = 0; n < l.n; ++n){ + int index = entry_index(l, b, n*l.w*l.h, 0); + activate_array_ongpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC); + index = entry_index(l, b, n*l.w*l.h, 4); + activate_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC); + } + } + if (l.softmax_tree){ int i; int count = 5; for (i = 0; i < l.softmax_tree->groups; ++i) { int group_size = l.softmax_tree->group_size[i]; - softmax_gpu(l.output_gpu+count, group_size, l.classes + 5, l.w*l.h*l.n*l.batch, 1, l.output_gpu + count); + int index = entry_index(l, 0, 0, count); + softmax_gpu(state.input + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); count += group_size; } - }else if (l.softmax){ - softmax_gpu(l.output_gpu+5, l.classes, l.classes + 5, l.w*l.h*l.n*l.batch, 1, l.output_gpu + 5); + } else if (l.softmax) { + int index = entry_index(l, 0, 0, 5); + //printf("%d\n", index); + softmax_gpu(state.input + index, l.classes, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); + } + if(!state.train || l.onlyforward){ + cuda_pull_array(l.output_gpu, l.output, l.batch*l.outputs); + return; } float *in_cpu = calloc(l.batch*l.inputs, sizeof(float)); @@ -382,16 +429,25 @@ void forward_region_layer_gpu(const layer l, network_state state) cpu_state.truth = truth_cpu; cpu_state.input = in_cpu; forward_region_layer(l, cpu_state); - //cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); + cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); free(cpu_state.input); if(!state.train) return; cuda_push_array(l.delta_gpu, l.delta, l.batch*l.outputs); if(cpu_state.truth) free(cpu_state.truth); } -void backward_region_layer_gpu(layer l, network_state state) +void backward_region_layer_gpu(const layer l, network_state state) { - flatten_ongpu(l.delta_gpu, l.h*l.w, l.n*(l.coords + l.classes + 1), l.batch, 0, state.delta); + int b, n; + for (b = 0; b < l.batch; ++b){ + for(n = 0; n < l.n; ++n){ + int index = entry_index(l, b, n*l.w*l.h, 0); + gradient_array_ongpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); + index = entry_index(l, b, n*l.w*l.h, 4); + gradient_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); + } + } + axpy_ongpu(l.batch*l.inputs, 1, l.delta_gpu, 1, state.delta, 1); } #endif diff --git a/src/regressor.c b/src/regressor.c new file mode 100644 index 00000000000..4950e747b51 --- /dev/null +++ b/src/regressor.c @@ -0,0 +1,261 @@ +#include "network.h" +#include "utils.h" +#include "parser.h" +#include "option_list.h" +#include "blas.h" +#include "assert.h" +#include "cuda.h" +#include + +#ifdef OPENCV +#include "opencv2/highgui/highgui_c.h" +image get_image_from_stream(CvCapture *cap); +#endif + +void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) +{ + int i; + + float avg_loss = -1; + char *base = basecfg(cfgfile); + printf("%s\n", base); + printf("%d\n", ngpus); + network *nets = calloc(ngpus, sizeof(network)); + + srand(time(0)); + int seed = rand(); + for(i = 0; i < ngpus; ++i){ + srand(seed); +#ifdef GPU + cuda_set_device(gpus[i]); +#endif + nets[i] = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&nets[i], weightfile); + } + if(clear) *nets[i].seen = 0; + nets[i].learning_rate *= ngpus; + } + srand(time(0)); + network net = nets[0]; + + int imgs = net.batch * net.subdivisions * ngpus; + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + list *options = read_data_cfg(datacfg); + + char *backup_directory = option_find_str(options, "backup", "/backup/"); + char *train_list = option_find_str(options, "train", "data/train.list"); + + list *plist = get_paths(train_list); + char **paths = (char **)list_to_array(plist); + printf("%d\n", plist->size); + int N = plist->size; + clock_t time; + + load_args args = {0}; + args.w = net.w; + args.h = net.h; + args.threads = 32; + + args.min = net.min_crop; + args.max = net.max_crop; + args.angle = net.angle; + args.aspect = net.aspect; + args.exposure = net.exposure; + args.saturation = net.saturation; + args.hue = net.hue; + args.size = net.w; + + args.paths = paths; + args.n = imgs; + args.m = N; + args.type = REGRESSION_DATA; + + data train; + data buffer; + pthread_t load_thread; + args.d = &buffer; + load_thread = load_data(args); + + int epoch = (*net.seen)/N; + while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + time=clock(); + + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + time=clock(); + + float loss = 0; +#ifdef GPU + if(ngpus == 1){ + loss = train_network(net, train); + } else { + loss = train_networks(nets, ngpus, train, 4); + } +#else + loss = train_network(net, train); +#endif + if(avg_loss == -1) avg_loss = loss; + avg_loss = avg_loss*.9 + loss*.1; + printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + free_data(train); + if(*net.seen/N > epoch){ + epoch = *net.seen/N; + char buff[256]; + sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); + save_weights(net, buff); + } + if(get_current_batch(net)%100 == 0){ + char buff[256]; + sprintf(buff, "%s/%s.backup",backup_directory,base); + save_weights(net, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s.weights", backup_directory, base); + save_weights(net, buff); + + free_network(net); + free_ptrs((void**)paths, plist->size); + free_list(plist); + free(base); +} + +void predict_regressor(char *cfgfile, char *weightfile, char *filename) +{ + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + set_batch_network(&net, 1); + srand(2222222); + + clock_t time; + char buff[256]; + char *input = buff; + while(1){ + if(filename){ + strncpy(input, filename, 256); + }else{ + printf("Enter Image Path: "); + fflush(stdout); + input = fgets(input, 256, stdin); + if(!input) return; + strtok(input, "\n"); + } + image im = load_image_color(input, 0, 0); + image sized = letterbox_image(im, net.w, net.h); + + float *X = sized.data; + time=clock(); + float *predictions = network_predict(net, X); + printf("Predicted: %f\n", predictions[0]); + printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + free_image(im); + free_image(sized); + if (filename) break; + } +} + + +void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename) +{ +#ifdef OPENCV + printf("Regressor Demo\n"); + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + set_batch_network(&net, 1); + + srand(2222222); + CvCapture * cap; + + if(filename){ + cap = cvCaptureFromFile(filename); + }else{ + cap = cvCaptureFromCAM(cam_index); + } + + if(!cap) error("Couldn't connect to webcam.\n"); + cvNamedWindow("Regressor", CV_WINDOW_NORMAL); + cvResizeWindow("Regressor", 512, 512); + float fps = 0; + int i; + + while(1){ + struct timeval tval_before, tval_after, tval_result; + gettimeofday(&tval_before, NULL); + + image in = get_image_from_stream(cap); + image in_s = letterbox_image(in, net.w, net.h); + show_image(in, "Regressor"); + + float *predictions = network_predict(net, in_s.data); + + printf("\033[2J"); + printf("\033[1;1H"); + printf("\nFPS:%.0f\n",fps); + + printf("People: %f\n", predictions[0]); + + free_image(in_s); + free_image(in); + + cvWaitKey(10); + + gettimeofday(&tval_after, NULL); + timersub(&tval_after, &tval_before, &tval_result); + float curr = 1000000.f/((long int)tval_result.tv_usec); + fps = .9*fps + .1*curr; + } +#endif +} + + +void run_regressor(int argc, char **argv) +{ + if(argc < 4){ + fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]); + return; + } + + char *gpu_list = find_char_arg(argc, argv, "-gpus", 0); + int *gpus = 0; + int gpu = 0; + int ngpus = 0; + if(gpu_list){ + printf("%s\n", gpu_list); + int len = strlen(gpu_list); + ngpus = 1; + int i; + for(i = 0; i < len; ++i){ + if (gpu_list[i] == ',') ++ngpus; + } + gpus = calloc(ngpus, sizeof(int)); + for(i = 0; i < ngpus; ++i){ + gpus[i] = atoi(gpu_list); + gpu_list = strchr(gpu_list, ',')+1; + } + } else { + gpu = gpu_index; + gpus = &gpu; + ngpus = 1; + } + + int cam_index = find_int_arg(argc, argv, "-c", 0); + int clear = find_arg(argc, argv, "-clear"); + char *data = argv[3]; + char *cfg = argv[4]; + char *weights = (argc > 5) ? argv[5] : 0; + char *filename = (argc > 6) ? argv[6]: 0; + if(0==strcmp(argv[2], "test")) predict_regressor(data, cfg, weights); + else if(0==strcmp(argv[2], "train")) train_regressor(data, cfg, weights, gpus, ngpus, clear); + else if(0==strcmp(argv[2], "demo")) demo_regressor(data, cfg, weights, cam_index, filename); +} + + diff --git a/src/reorg_layer.c b/src/reorg_layer.c index 2abca8fa97d..29ccc0e5fbf 100644 --- a/src/reorg_layer.c +++ b/src/reorg_layer.c @@ -4,15 +4,17 @@ #include -layer make_reorg_layer(int batch, int w, int h, int c, int stride, int reverse) +layer make_reorg_layer(int batch, int w, int h, int c, int stride, int reverse, int flatten, int extra) { layer l = {0}; l.type = REORG; l.batch = batch; l.stride = stride; + l.extra = extra; l.h = h; l.w = w; l.c = c; + l.flatten = flatten; if(reverse){ l.out_w = w*stride; l.out_h = h*stride; @@ -23,10 +25,20 @@ layer make_reorg_layer(int batch, int w, int h, int c, int stride, int reverse) l.out_c = c*(stride*stride); } l.reverse = reverse; - fprintf(stderr, "reorg /%2d %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c); + l.outputs = l.out_h * l.out_w * l.out_c; l.inputs = h*w*c; - int output_size = l.out_h * l.out_w * l.out_c * batch; + if(l.extra){ + l.out_w = l.out_h = l.out_c = 0; + l.outputs = l.inputs + l.extra; + } + + if(extra){ + fprintf(stderr, "reorg %4d -> %4d\n", l.inputs, l.outputs); + } else { + fprintf(stderr, "reorg /%2d %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c); + } + int output_size = l.outputs * batch; l.output = calloc(output_size, sizeof(float)); l.delta = calloc(output_size, sizeof(float)); @@ -77,17 +89,41 @@ void resize_reorg_layer(layer *l, int w, int h) void forward_reorg_layer(const layer l, network_state state) { - if(l.reverse){ + int i; + if(l.flatten){ + memcpy(l.output, state.input, l.outputs*l.batch*sizeof(float)); + if(l.reverse){ + flatten(l.output, l.w*l.h, l.c, l.batch, 0); + }else{ + flatten(l.output, l.w*l.h, l.c, l.batch, 1); + } + } else if (l.extra) { + for(i = 0; i < l.batch; ++i){ + copy_cpu(l.inputs, state.input + i*l.inputs, 1, l.output + i*l.outputs, 1); + } + } else if (l.reverse){ reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output); - }else { + } else { reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output); } } void backward_reorg_layer(const layer l, network_state state) { - if(l.reverse){ + int i; + if(l.flatten){ + memcpy(state.delta, l.delta, l.outputs*l.batch*sizeof(float)); + if(l.reverse){ + flatten(state.delta, l.w*l.h, l.c, l.batch, 1); + }else{ + flatten(state.delta, l.w*l.h, l.c, l.batch, 0); + } + } else if(l.reverse){ reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); + } else if (l.extra) { + for(i = 0; i < l.batch; ++i){ + copy_cpu(l.inputs, l.delta + i*l.outputs, 1, state.delta + i*l.inputs, 1); + } }else{ reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); } @@ -96,7 +132,18 @@ void backward_reorg_layer(const layer l, network_state state) #ifdef GPU void forward_reorg_layer_gpu(layer l, network_state state) { - if(l.reverse){ + int i; + if(l.flatten){ + if(l.reverse){ + flatten_ongpu(state.input, l.w*l.h, l.c, l.batch, 0, l.output_gpu); + }else{ + flatten_ongpu(state.input, l.w*l.h, l.c, l.batch, 1, l.output_gpu); + } + } else if (l.extra) { + for(i = 0; i < l.batch; ++i){ + copy_ongpu(l.inputs, state.input + i*l.inputs, 1, l.output_gpu + i*l.outputs, 1); + } + } else if (l.reverse) { reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); }else { reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output_gpu); @@ -105,9 +152,20 @@ void forward_reorg_layer_gpu(layer l, network_state state) void backward_reorg_layer_gpu(layer l, network_state state) { - if(l.reverse){ + if(l.flatten){ + if(l.reverse){ + flatten_ongpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 1, state.delta); + }else{ + flatten_ongpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 0, state.delta); + } + } else if (l.extra) { + int i; + for(i = 0; i < l.batch; ++i){ + copy_ongpu(l.inputs, l.delta_gpu + i*l.outputs, 1, state.delta + i*l.inputs, 1); + } + } else if(l.reverse){ reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); - }else{ + } else { reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); } } diff --git a/src/reorg_layer.h b/src/reorg_layer.h index 21c22cd87b8..6b9c3040e54 100644 --- a/src/reorg_layer.h +++ b/src/reorg_layer.h @@ -6,7 +6,7 @@ #include "layer.h" #include "network.h" -layer make_reorg_layer(int batch, int h, int w, int c, int stride, int reverse); +layer make_reorg_layer(int batch, int w, int h, int c, int stride, int reverse, int flatten, int extra); void resize_reorg_layer(layer *l, int w, int h); void forward_reorg_layer(const layer l, network_state state); void backward_reorg_layer(const layer l, network_state state); diff --git a/src/softmax_layer.c b/src/softmax_layer.c index 5d1531488e0..88f032fc1ba 100644 --- a/src/softmax_layer.c +++ b/src/softmax_layer.c @@ -32,40 +32,24 @@ softmax_layer make_softmax_layer(int batch, int inputs, int groups) return l; } -void softmax_tree(float *input, int batch, int inputs, float temp, tree *hierarchy, float *output) +void forward_softmax_layer(const softmax_layer l, network_state state) { - int b; - for(b = 0; b < batch; ++b){ + if(l.softmax_tree){ int i; int count = 0; - for(i = 0; i < hierarchy->groups; ++i){ - int group_size = hierarchy->group_size[i]; - softmax(input+b*inputs + count, group_size, temp, output+b*inputs + count); + for (i = 0; i < l.softmax_tree->groups; ++i) { + int group_size = l.softmax_tree->group_size[i]; + softmax_cpu(state.input + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output + count); count += group_size; } - } -} - -void forward_softmax_layer(const softmax_layer l, network_state state) -{ - int b; - int inputs = l.inputs / l.groups; - int batch = l.batch * l.groups; - if(l.softmax_tree){ - softmax_tree(state.input, batch, inputs, l.temperature, l.softmax_tree, l.output); } else { - for(b = 0; b < batch; ++b){ - softmax(state.input+b*inputs, inputs, l.temperature, l.output+b*inputs); - } + softmax_cpu(state.input, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output); } } void backward_softmax_layer(const softmax_layer l, network_state state) { - int i; - for(i = 0; i < l.inputs*l.batch; ++i){ - state.delta[i] += l.delta[i]; - } + axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, state.delta, 1); } #ifdef GPU @@ -77,18 +61,16 @@ void pull_softmax_layer_output(const softmax_layer layer) void forward_softmax_layer_gpu(const softmax_layer l, network_state state) { - int inputs = l.inputs / l.groups; - int batch = l.batch * l.groups; if(l.softmax_tree){ int i; int count = 0; for (i = 0; i < l.softmax_tree->groups; ++i) { int group_size = l.softmax_tree->group_size[i]; - softmax_gpu(state.input+count, group_size, inputs, batch, l.temperature, l.output_gpu + count); + softmax_gpu(state.input + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output_gpu + count); count += group_size; } } else { - softmax_gpu(state.input, inputs, inputs, batch, l.temperature, l.output_gpu); + softmax_gpu(state.input, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output_gpu); } } diff --git a/src/super.c b/src/super.c index 63e9860a83b..5583ac263c3 100644 --- a/src/super.c +++ b/src/super.c @@ -7,7 +7,7 @@ #include "opencv2/highgui/highgui_c.h" #endif -void train_super(char *cfgfile, char *weightfile) +void train_super(char *cfgfile, char *weightfile, int clear) { char *train_images = "/data/imagenet/imagenet1k.train.list"; char *backup_directory = "/home/pjreddie/backup/"; @@ -19,6 +19,7 @@ void train_super(char *cfgfile, char *weightfile) if(weightfile){ load_weights(&net, weightfile); } + if(clear) *net.seen = 0; printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); int imgs = net.batch*net.subdivisions; int i = *net.seen/imgs; @@ -123,7 +124,8 @@ void run_super(int argc, char **argv) char *cfg = argv[3]; char *weights = (argc > 4) ? argv[4] : 0; char *filename = (argc > 5) ? argv[5] : 0; - if(0==strcmp(argv[2], "train")) train_super(cfg, weights); + int clear = find_arg(argc, argv, "-clear"); + if(0==strcmp(argv[2], "train")) train_super(cfg, weights, clear); else if(0==strcmp(argv[2], "test")) test_super(cfg, weights, filename); /* else if(0==strcmp(argv[2], "valid")) validate_super(cfg, weights); diff --git a/src/tree.c b/src/tree.c index dd44515c1dd..f36ca3a1da0 100644 --- a/src/tree.c +++ b/src/tree.c @@ -24,33 +24,33 @@ void change_leaves(tree *t, char *leaf_list) fprintf(stderr, "Found %d leaves.\n", found); } -float get_hierarchy_probability(float *x, tree *hier, int c) +float get_hierarchy_probability(float *x, tree *hier, int c, int stride) { float p = 1; while(c >= 0){ - p = p * x[c]; + p = p * x[c*stride]; c = hier->parent[c]; } return p; } -void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves) +void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves, int stride) { int j; for(j = 0; j < n; ++j){ int parent = hier->parent[j]; if(parent >= 0){ - predictions[j] *= predictions[parent]; + predictions[j*stride] *= predictions[parent*stride]; } } if(only_leaves){ for(j = 0; j < n; ++j){ - if(!hier->leaf[j]) predictions[j] = 0; + if(!hier->leaf[j]) predictions[j*stride] = 0; } } } -int hierarchy_top_prediction(float *predictions, tree *hier, float thresh) +int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int stride) { float p = 1; int group = 0; @@ -61,7 +61,7 @@ int hierarchy_top_prediction(float *predictions, tree *hier, float thresh) for(i = 0; i < hier->group_size[group]; ++i){ int index = i + hier->group_offset[group]; - float val = predictions[i + hier->group_offset[group]]; + float val = predictions[(i + hier->group_offset[group])*stride]; if(val > max){ max_i = index; max = val; diff --git a/src/tree.h b/src/tree.h index dbd4c394141..2e9c81265ea 100644 --- a/src/tree.h +++ b/src/tree.h @@ -15,9 +15,9 @@ typedef struct{ } tree; tree *read_tree(char *filename); -void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves); +void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves, int stride); void change_leaves(tree *t, char *leaf_list); -int hierarchy_top_prediction(float *predictions, tree *hier, float thresh); -float get_hierarchy_probability(float *x, tree *hier, int c); +int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int stride); +float get_hierarchy_probability(float *x, tree *hier, int c, int stride); #endif From 38802ef56ac841bea8312fb07bfb82f035128344 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 27 Mar 2017 00:01:27 -0700 Subject: [PATCH 005/118] fixes --- cfg/yolo.cfg | 4 ++-- src/region_layer.c | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg index 2d31027d602..7c37c3adaaf 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolo.cfg @@ -1,8 +1,8 @@ [net] batch=64 subdivisions=8 -height=608 -width=608 +height=416 +width=416 channels=3 momentum=0.9 decay=0.0005 diff --git a/src/region_layer.c b/src/region_layer.c index 5a3794a51ca..7b57e60921d 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -148,6 +148,14 @@ void forward_region_layer(const layer l, network_state state) memcpy(l.output, state.input, l.outputs*l.batch*sizeof(float)); #ifndef GPU + for (b = 0; b < l.batch; ++b){ + for(n = 0; n < l.n; ++n){ + int index = entry_index(l, b, n*l.w*l.h, 0); + activate_array(l.output + index, 2*l.w*l.h, LOGISTIC); + index = entry_index(l, b, n*l.w*l.h, 4); + activate_array(l.output + index, l.w*l.h, LOGISTIC); + } + } if (l.softmax_tree){ int i; int count = 5; @@ -157,7 +165,8 @@ void forward_region_layer(const layer l, network_state state) count += group_size; } } else if (l.softmax){ - softmax_cpu(state.input + 5, l.classes, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + 5); + int index = entry_index(l, 0, 0, 5); + softmax_cpu(state.input + index, l.classes, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output + index); } #endif @@ -429,7 +438,7 @@ void forward_region_layer_gpu(const layer l, network_state state) cpu_state.truth = truth_cpu; cpu_state.input = in_cpu; forward_region_layer(l, cpu_state); - cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); + //cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); free(cpu_state.input); if(!state.train) return; cuda_push_array(l.delta_gpu, l.delta, l.batch*l.outputs); From 179ed8ec76f329eb22360440c3836fdcb2560330 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 29 Mar 2017 20:27:54 -0700 Subject: [PATCH 006/118] opencv is hell. this is why we can't have nice things. --- cfg/yolo-voc.cfg | 8 +- cfg/yolo.cfg | 8 +- src/art.c | 6 - src/cifar.c | 4 - src/classifier.c | 5 - src/coco.c | 4 - src/connected_layer.c | 16 ++- src/darknet.c | 4 - src/data.c | 2 +- src/demo.c | 3 - src/detector.c | 3 - src/go.c | 10 +- src/gru_layer.c | 9 ++ src/image.c | 6 - src/image.h | 18 +++ src/lsd.c | 285 ++++++++++++++++++++++++++++++++++------- src/network_kernels.cu | 1 - src/nightmare.c | 5 - src/regressor.c | 6 - src/rnn.c | 4 - src/rnn_vid.c | 1 - src/super.c | 4 - src/swag.c | 4 - src/tag.c | 4 - src/voxel.c | 5 - src/writing.c | 4 - src/yolo.c | 4 - 27 files changed, 296 insertions(+), 137 deletions(-) diff --git a/cfg/yolo-voc.cfg b/cfg/yolo-voc.cfg index 9f3e0d51f9d..dbf2de281c1 100644 --- a/cfg/yolo-voc.cfg +++ b/cfg/yolo-voc.cfg @@ -1,6 +1,10 @@ [net] -batch=64 -subdivisions=8 +# Testing +batch=1 +subdivisions=1 +# Training +# batch=64 +# subdivisions=8 height=416 width=416 channels=3 diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg index 7c37c3adaaf..7001dfa58a9 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolo.cfg @@ -1,6 +1,10 @@ [net] -batch=64 -subdivisions=8 +# Testing +batch=1 +subdivisions=1 +# Training +# batch=64 +# subdivisions=8 height=416 width=416 channels=3 diff --git a/src/art.c b/src/art.c index 71d37192557..694ae8e76a7 100644 --- a/src/art.c +++ b/src/art.c @@ -6,12 +6,6 @@ #include "classifier.h" #include -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -image get_image_from_stream(CvCapture *cap); -#endif - - void demo_art(char *cfgfile, char *weightfile, int cam_index) { #ifdef OPENCV diff --git a/src/cifar.c b/src/cifar.c index d0ac45955e5..5a6f96b9b46 100644 --- a/src/cifar.c +++ b/src/cifar.c @@ -4,10 +4,6 @@ #include "option_list.h" #include "blas.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - void train_cifar(char *cfgfile, char *weightfile) { srand(time(0)); diff --git a/src/classifier.c b/src/classifier.c index 2ac0b756e97..6011c935b3b 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -8,11 +8,6 @@ #include "cuda.h" #include -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -image get_image_from_stream(CvCapture *cap); -#endif - float *get_regression_values(char **labels, int n) { float *v = calloc(n, sizeof(float)); diff --git a/src/coco.c b/src/coco.c index 8f3c96821a3..b8505ff28ec 100644 --- a/src/coco.c +++ b/src/coco.c @@ -8,10 +8,6 @@ #include "box.h" #include "demo.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - char *coco_classes[] = {"person","bicycle","car","motorcycle","airplane","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","couch","potted plant","bed","dining table","toilet","tv","laptop","mouse","remote","keyboard","cell phone","microwave","oven","toaster","sink","refrigerator","book","clock","vase","scissors","teddy bear","hair drier","toothbrush"}; int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90}; diff --git a/src/connected_layer.c b/src/connected_layer.c index b678ed0dae1..c23d6fa474d 100644 --- a/src/connected_layer.c +++ b/src/connected_layer.c @@ -97,6 +97,12 @@ connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVAT l.x_gpu = cuda_make_array(l.output, l.batch*outputs); l.x_norm_gpu = cuda_make_array(l.output, l.batch*outputs); +#ifdef CUDNN + cudnnCreateTensorDescriptor(&l.normTensorDesc); + cudnnCreateTensorDescriptor(&l.dstTensorDesc); + cudnnSetTensor4dDescriptor(l.dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l.batch, l.out_c, l.out_h, l.out_w); + cudnnSetTensor4dDescriptor(l.normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l.out_c, 1, 1); +#endif } #endif l.activation = activation; @@ -213,11 +219,11 @@ void statistics_connected_layer(layer l) printf("Scales "); print_statistics(l.scales, l.outputs); /* - printf("Rolling Mean "); - print_statistics(l.rolling_mean, l.outputs); - printf("Rolling Variance "); - print_statistics(l.rolling_variance, l.outputs); - */ + printf("Rolling Mean "); + print_statistics(l.rolling_mean, l.outputs); + printf("Rolling Variance "); + print_statistics(l.rolling_variance, l.outputs); + */ } printf("Biases "); print_statistics(l.biases, l.outputs); diff --git a/src/darknet.c b/src/darknet.c index f7b4c225479..4b797accffc 100644 --- a/src/darknet.c +++ b/src/darknet.c @@ -8,10 +8,6 @@ #include "blas.h" #include "connected_layer.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - extern void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top); extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh); extern void run_voxel(int argc, char **argv); diff --git a/src/data.c b/src/data.c index f17bd73fc81..533ae8e024c 100644 --- a/src/data.c +++ b/src/data.c @@ -1017,7 +1017,7 @@ void get_next_batch(data d, int n, int offset, float *X, float *y) for(j = 0; j < n; ++j){ int index = offset + j; memcpy(X+j*d.X.cols, d.X.vals[index], d.X.cols*sizeof(float)); - memcpy(y+j*d.y.cols, d.y.vals[index], d.y.cols*sizeof(float)); + if(y) memcpy(y+j*d.y.cols, d.y.vals[index], d.y.cols*sizeof(float)); } } diff --git a/src/demo.c b/src/demo.c index 7818bc3b40a..9a37b4a69e1 100644 --- a/src/demo.c +++ b/src/demo.c @@ -12,9 +12,6 @@ #define FRAMES 3 #ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#include "opencv2/imgproc/imgproc_c.h" -image get_image_from_stream(CvCapture *cap); static char **demo_names; static image **demo_alphabet; diff --git a/src/detector.c b/src/detector.c index 318e5d3c029..d5c3cfccb7c 100644 --- a/src/detector.c +++ b/src/detector.c @@ -8,9 +8,6 @@ #include "option_list.h" #include "blas.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90}; void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) diff --git a/src/go.c b/src/go.c index 39610aa8907..c5c125cd201 100644 --- a/src/go.c +++ b/src/go.c @@ -6,10 +6,6 @@ #include "data.h" #include -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - int inverted = 1; int noi = 1; static const int nind = 2; @@ -125,7 +121,7 @@ data random_go_moves(moves m, int n) } -void train_go(char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) +void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ngpus, int clear) { int i; float avg_loss = -1; @@ -150,7 +146,7 @@ void train_go(char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) char *backup_directory = "/home/pjreddie/backup/"; char buff[256]; - moves m = load_go_moves("/home/pjreddie/backup/go.train"); + moves m = load_go_moves(filename); //moves m = load_go_moves("games.txt"); int N = m.n; @@ -909,7 +905,7 @@ void run_go(int argc, char **argv) char *c2 = (argc > 5) ? argv[5] : 0; char *w2 = (argc > 6) ? argv[6] : 0; int multi = find_arg(argc, argv, "-multi"); - if(0==strcmp(argv[2], "train")) train_go(cfg, weights, gpus, ngpus, clear); + if(0==strcmp(argv[2], "train")) train_go(cfg, weights, c2, gpus, ngpus, clear); else if(0==strcmp(argv[2], "valid")) valid_go(cfg, weights, multi, c2); else if(0==strcmp(argv[2], "self")) self_go(cfg, weights, c2, w2, multi); else if(0==strcmp(argv[2], "test")) test_go(cfg, weights, multi); diff --git a/src/gru_layer.c b/src/gru_layer.c index b78e86828d0..27fc3c3148f 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -70,6 +70,15 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_no *(l.state_h_layer) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); l.state_h_layer->batch = batch; +#ifdef CUDNN + cudnnSetTensor4dDescriptor(l.input_z_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.input_z_layer->out_c, l.input_z_layer->out_h, l.input_z_layer->out_w); + cudnnSetTensor4dDescriptor(l.input_h_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.input_h_layer->out_c, l.input_h_layer->out_h, l.input_h_layer->out_w); + cudnnSetTensor4dDescriptor(l.input_r_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.input_r_layer->out_c, l.input_r_layer->out_h, l.input_r_layer->out_w); + cudnnSetTensor4dDescriptor(l.state_z_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.state_z_layer->out_c, l.state_z_layer->out_h, l.state_z_layer->out_w); + cudnnSetTensor4dDescriptor(l.state_h_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.state_h_layer->out_c, l.state_h_layer->out_h, l.state_h_layer->out_w); + cudnnSetTensor4dDescriptor(l.state_r_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.state_r_layer->out_c, l.state_r_layer->out_h, l.state_r_layer->out_w); +#endif + l.batch_normalize = batch_normalize; diff --git a/src/image.c b/src/image.c index 4ce44f2e4ec..133bf1fc97c 100644 --- a/src/image.c +++ b/src/image.c @@ -10,12 +10,6 @@ #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#include "opencv2/imgproc/imgproc_c.h" -#endif - - int windows = 0; float colors[6][3] = { {1,0,1}, {0,0,1},{0,1,1},{0,1,0},{1,1,0},{1,0,0} }; diff --git a/src/image.h b/src/image.h index d5b228f3596..12f12edb5bb 100644 --- a/src/image.h +++ b/src/image.h @@ -8,6 +8,17 @@ #include #include "box.h" +#ifndef __cplusplus +#ifdef OPENCV +#include "opencv2/highgui/highgui_c.h" +#include "opencv2/imgproc/imgproc_c.h" +#include "opencv2/core/version.hpp" +#if CV_MAJOR_VERSION == 3 +#include "opencv2/videoio/videoio_c.h" +#endif +#endif +#endif + typedef struct { int h; int w; @@ -15,6 +26,13 @@ typedef struct { float *data; } image; +#ifndef __cplusplus +#ifdef OPENCV +image get_image_from_stream(CvCapture *cap); +image ipl_to_image(IplImage* src); +#endif +#endif + float get_color(int c, int x, int max); void flip_image(image a); void draw_box(image a, int x1, int y1, int x2, int y2, float r, float g, float b); diff --git a/src/lsd.c b/src/lsd.c index de29d761b27..6a0e6d21f87 100644 --- a/src/lsd.c +++ b/src/lsd.c @@ -4,10 +4,6 @@ #include "parser.h" #include "blas.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg, char *aweight, int clear) { #ifdef GPU @@ -75,9 +71,7 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg float *y = calloc(y_size, sizeof(float)); float *ones = cuda_make_array(0, anet.batch); - float *zeros = cuda_make_array(0, anet.batch); - fill_ongpu(anet.batch, .99, ones, 1); - fill_ongpu(anet.batch, .01, zeros, 1); + fill_ongpu(anet.batch, .9, ones, 1); network_state astate = {0}; astate.index = 0; @@ -145,7 +139,7 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg float *delta = imlayer.delta_gpu; fill_ongpu(x_size, 0, delta, 1); scal_ongpu(x_size, 100, astate.delta, 1); - scal_ongpu(x_size, .00001, fstate.delta, 1); + scal_ongpu(x_size, .001, fstate.delta, 1); axpy_ongpu(x_size, 1, fstate.delta, 1, delta, 1); axpy_ongpu(x_size, 1, astate.delta, 1, delta, 1); @@ -165,7 +159,8 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg for(k = 0; k < gnet.batch; ++k){ int index = j*gnet.batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); - generated.y.vals[index][0] = .01; + generated.y.vals[index][0] = .1; + style.y.vals[index][0] = .9; } } @@ -346,7 +341,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear backward_network_gpu(net, gstate); - scal_ongpu(imlayer.outputs, 100, imerror, 1); + scal_ongpu(imlayer.outputs, 1000, imerror, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs)); @@ -399,6 +394,217 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear #endif } +void test_dcgan(char *cfgfile, char *weightfile) +{ + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + set_batch_network(&net, 1); + srand(2222222); + + clock_t time; + char buff[256]; + char *input = buff; + int i, imlayer = 0; + + for (i = 0; i < net.n; ++i) { + if (net.layers[i].out_c == 3) { + imlayer = i; + printf("%d\n", i); + break; + } + } + + while(1){ + image im = make_image(net.w, net.h, net.c); + int i; + for(i = 0; i < im.w*im.h*im.c; ++i){ + im.data[i] = rand_normal(); + } + + float *X = im.data; + time=clock(); + network_predict(net, X); + image out = get_network_image_layer(net, imlayer); + //yuv_to_rgb(out); + constrain_image(out); + printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + show_image(out, "out"); + save_image(out, "out"); +#ifdef OPENCV + cvWaitKey(0); +#endif + + free_image(im); + } +} + + +void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear) +{ +#ifdef GPU + //char *train_images = "/home/pjreddie/data/coco/train1.txt"; + //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; + char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list"; + char *backup_directory = "/home/pjreddie/backup/"; + srand(time(0)); + char *base = basecfg(cfg); + char *abase = basecfg(acfg); + printf("%s\n", base); + network net = load_network(cfg, weight, clear); + network anet = load_network(acfg, aweight, clear); + + int i, j, k; + layer imlayer = {0}; + for (i = 0; i < net.n; ++i) { + if (net.layers[i].out_c == 3) { + imlayer = net.layers[i]; + break; + } + } + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + int imgs = net.batch*net.subdivisions; + i = *net.seen/imgs; + data train, buffer; + + + list *plist = get_paths(train_images); + //int N = plist->size; + char **paths = (char **)list_to_array(plist); + + load_args args= get_base_args(anet); + args.paths = paths; + args.n = imgs; + args.m = plist->size; + args.d = &buffer; + args.type = CLASSIFICATION_DATA; + args.classes = 2; + char *ls[2] = {"imagenet", "zzzzzzzz"}; + args.labels = ls; + + pthread_t load_thread = load_data_in_thread(args); + clock_t time; + + network_state gstate = {0}; + gstate.index = 0; + gstate.net = net; + int x_size = get_network_input_size(net)*net.batch; + int y_size = get_network_output_size(net)*net.batch; + gstate.input = cuda_make_array(0, x_size); + gstate.truth = cuda_make_array(0, y_size); + gstate.train = 1; + float *input = calloc(x_size, sizeof(float)); + float *y = calloc(y_size, sizeof(float)); + float *imerror = cuda_make_array(0, y_size); + + network_state astate = {0}; + astate.index = 0; + astate.net = anet; + int ay_size = get_network_output_size(anet)*anet.batch; + astate.input = 0; + astate.truth = 0; + astate.delta = 0; + astate.train = 1; + + float *ones_gpu = cuda_make_array(0, ay_size); + fill_ongpu(ay_size, .1, ones_gpu, 1); + fill_ongpu(ay_size/2, .9, ones_gpu, 2); + + float aloss_avg = -1; + + //data generated = copy_data(train); + + while (get_current_batch(net) < net.max_batches) { + i += 1; + time=clock(); + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data_in_thread(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + + data gen = copy_data(train); + for(j = 0; j < imgs; ++j){ + train.y.vals[j][0] = .9; + train.y.vals[j][1] = .1; + gen.y.vals[j][0] = .1; + gen.y.vals[j][1] = .9; + } + time=clock(); + + for(j = 0; j < net.subdivisions; ++j){ + get_next_batch(train, net.batch, j*net.batch, y, 0); + int z; + for(z = 0; z < x_size; ++z){ + input[z] = rand_normal(); + } + + cuda_push_array(gstate.input, input, x_size); + cuda_push_array(gstate.truth, y, y_size); + *net.seen += net.batch; + forward_network_gpu(net, gstate); + + fill_ongpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); + astate.input = imlayer.output_gpu; + astate.delta = imerror; + astate.truth = ones_gpu; + forward_network_gpu(anet, astate); + backward_network_gpu(anet, astate); + + scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); + scal_ongpu(imlayer.outputs*imlayer.batch, .001, net.layers[net.n-1].delta_gpu, 1); + + printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); + printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); + + axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1); + + backward_network_gpu(net, gstate); + + cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + for(k = 0; k < net.batch; ++k){ + int index = j*net.batch + k; + copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gen.X.vals[index], 1); + gen.y.vals[index][0] = .1; + } + } + harmless_update_network_gpu(anet); + + data merge = concat_data(train, gen); + randomize_data(merge); + float aloss = train_network(anet, merge); + + update_network_gpu(net); + free_data(merge); + free_data(train); + free_data(gen); + if (aloss_avg < 0) aloss_avg = aloss; + aloss_avg = aloss_avg*.9 + aloss*.1; + + printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs); + if(i%1000==0){ + char buff[256]; + sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); + save_weights(net, buff); + sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); + save_weights(anet, buff); + } + if(i%100==0){ + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, base); + save_weights(net, buff); + sprintf(buff, "%s/%s.backup", backup_directory, abase); + save_weights(anet, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s_final.weights", backup_directory, base); + save_weights(net, buff); +#endif +} + void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int clear) { #ifdef GPU @@ -432,25 +638,15 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle //int N = plist->size; char **paths = (char **)list_to_array(plist); - load_args args = {0}; - args.w = net.w; - args.h = net.h; + load_args args= get_base_args(net); args.paths = paths; args.n = imgs; args.m = plist->size; args.d = &buffer; - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - args.size = net.w; args.type = CLASSIFICATION_DATA; - args.classes = 1; - char *ls[1] = {"imagenet"}; + args.classes = 2; + char *ls[2] = {"imagenet", "zzzzzzz"}; args.labels = ls; pthread_t load_thread = load_data_in_thread(args); @@ -478,9 +674,10 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle astate.delta = 0; astate.train = 1; - float *imerror = cuda_make_array(0, imlayer.outputs); + float *imerror = cuda_make_array(0, imlayer.outputs*imlayer.batch); float *ones_gpu = cuda_make_array(0, ay_size); - fill_ongpu(ay_size, .99, ones_gpu, 1); + fill_ongpu(ay_size, .1, ones_gpu, 1); + fill_ongpu(ay_size/2, .9, ones_gpu, 2); float aloss_avg = -1; float gloss_avg = -1; @@ -500,17 +697,17 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle for(j = 0; j < imgs; ++j){ image gim = float_to_image(net.w, net.h, net.c, gray.X.vals[j]); grayscale_image_3c(gim); - train.y.vals[j][0] = .99; - - image yim = float_to_image(net.w, net.h, net.c, train.X.vals[j]); - //rgb_to_yuv(yim); + train.y.vals[j][0] = .9; + train.y.vals[j][1] = .1; + gray.y.vals[j][0] = .1; + gray.y.vals[j][1] = .9; } time=clock(); float gloss = 0; for(j = 0; j < net.subdivisions; ++j){ - get_next_batch(train, net.batch, j*net.batch, pixs, y); - get_next_batch(gray, net.batch, j*net.batch, graypixs, y); + get_next_batch(train, net.batch, j*net.batch, pixs, 0); + get_next_batch(gray, net.batch, j*net.batch, graypixs, 0); cuda_push_array(gstate.input, graypixs, x_size); cuda_push_array(gstate.truth, pixs, x_size); /* @@ -523,23 +720,24 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle *net.seen += net.batch; forward_network_gpu(net, gstate); - fill_ongpu(imlayer.outputs, 0, imerror, 1); + fill_ongpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); astate.input = imlayer.output_gpu; astate.delta = imerror; astate.truth = ones_gpu; forward_network_gpu(anet, astate); backward_network_gpu(anet, astate); - scal_ongpu(imlayer.outputs, .1, net.layers[net.n-1].delta_gpu, 1); + scal_ongpu(imlayer.outputs*imlayer.batch, 1./1000., net.layers[net.n-1].delta_gpu, 1); - backward_network_gpu(net, gstate); + scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); - scal_ongpu(imlayer.outputs, 100, imerror, 1); + printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); + printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); - printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); - printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs)); + axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1); + + backward_network_gpu(net, gstate); - axpy_ongpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); gloss += get_network_cost(net) /(net.subdivisions*net.batch); @@ -547,7 +745,6 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle for(k = 0; k < net.batch; ++k){ int index = j*net.batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1); - gray.y.vals[index][0] = .01; } } harmless_update_network_gpu(anet); @@ -557,7 +754,6 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle float aloss = train_network(anet, merge); update_network_gpu(net); - update_network_gpu(anet); free_data(merge); free_data(train); free_data(gray); @@ -840,7 +1036,7 @@ void train_lsd(char *cfgfile, char *weightfile, int clear) save_weights(net, buff); } -void test_lsd(char *cfgfile, char *weightfile, char *filename) +void test_lsd(char *cfgfile, char *weightfile, char *filename, int gray) { network net = parse_network_cfg(cfgfile); if(weightfile){ @@ -875,7 +1071,7 @@ void test_lsd(char *cfgfile, char *weightfile, char *filename) image im = load_image_color(input, 0, 0); image resized = resize_min(im, net.w); image crop = crop_image(resized, (resized.w - net.w)/2, (resized.h - net.h)/2, net.w, net.h); - //grayscale_image_3c(crop); + if(gray) grayscale_image_3c(crop); float *X = crop.data; time=clock(); @@ -916,8 +1112,11 @@ void run_lsd(int argc, char **argv) if(0==strcmp(argv[2], "train")) train_lsd(cfg, weights, clear); else if(0==strcmp(argv[2], "train2")) train_lsd2(cfg, weights, acfg, aweights, clear); else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear); + else if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear); + else if(0==strcmp(argv[2], "gan")) test_dcgan(cfg, weights); else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear); - else if(0==strcmp(argv[2], "test")) test_lsd(cfg, weights, filename); + else if(0==strcmp(argv[2], "test")) test_lsd(cfg, weights, filename, 0); + else if(0==strcmp(argv[2], "color")) test_lsd(cfg, weights, filename, 1); /* else if(0==strcmp(argv[2], "valid")) validate_lsd(cfg, weights); */ diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 8088d725c41..4b9b499e82c 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -8,7 +8,6 @@ extern "C" { #include #include "network.h" -#include "image.h" #include "data.h" #include "utils.h" #include "parser.h" diff --git a/src/nightmare.c b/src/nightmare.c index 8a05d21d801..5d95416ca10 100644 --- a/src/nightmare.c +++ b/src/nightmare.c @@ -1,13 +1,8 @@ - #include "network.h" #include "parser.h" #include "blas.h" #include "utils.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - // ./darknet nightmare cfg/extractor.recon.cfg ~/trained/yolo-coco.conv frame6.png -reconstruct -iters 500 -i 3 -lambda .1 -rate .01 -smooth 2 float abs_mean(float *x, int n) diff --git a/src/regressor.c b/src/regressor.c index 4950e747b51..93aeb982361 100644 --- a/src/regressor.c +++ b/src/regressor.c @@ -7,11 +7,6 @@ #include "cuda.h" #include -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -image get_image_from_stream(CvCapture *cap); -#endif - void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) { int i; @@ -185,7 +180,6 @@ void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_inde cvNamedWindow("Regressor", CV_WINDOW_NORMAL); cvResizeWindow("Regressor", 512, 512); float fps = 0; - int i; while(1){ struct timeval tval_before, tval_after, tval_result; diff --git a/src/rnn.c b/src/rnn.c index eca6f554ca5..ccfdc55d557 100644 --- a/src/rnn.c +++ b/src/rnn.c @@ -4,10 +4,6 @@ #include "blas.h" #include "parser.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - typedef struct { float *x; float *y; diff --git a/src/rnn_vid.c b/src/rnn_vid.c index 36912d6b65a..1e2264e019e 100644 --- a/src/rnn_vid.c +++ b/src/rnn_vid.c @@ -5,7 +5,6 @@ #include "blas.h" #ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" image get_image_from_stream(CvCapture *cap); image ipl_to_image(IplImage* src); diff --git a/src/super.c b/src/super.c index 5583ac263c3..b68fef57edc 100644 --- a/src/super.c +++ b/src/super.c @@ -3,10 +3,6 @@ #include "utils.h" #include "parser.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - void train_super(char *cfgfile, char *weightfile, int clear) { char *train_images = "/data/imagenet/imagenet1k.train.list"; diff --git a/src/swag.c b/src/swag.c index 2cb3093b751..749196932d7 100644 --- a/src/swag.c +++ b/src/swag.c @@ -5,10 +5,6 @@ #include "parser.h" #include "box.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - void train_swag(char *cfgfile, char *weightfile) { char *train_images = "data/voc.0712.trainval"; diff --git a/src/tag.c b/src/tag.c index 1e43e7d9ec7..084adba0707 100644 --- a/src/tag.c +++ b/src/tag.c @@ -2,10 +2,6 @@ #include "utils.h" #include "parser.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - void train_tag(char *cfgfile, char *weightfile, int clear) { srand(time(0)); diff --git a/src/voxel.c b/src/voxel.c index 1b53880c50d..af722e0f079 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -3,11 +3,6 @@ #include "utils.h" #include "parser.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -image get_image_from_stream(CvCapture *cap); -#endif - void extract_voxel(char *lfile, char *rfile, char *prefix) { #ifdef OPENCV diff --git a/src/writing.c b/src/writing.c index 0a76d48e54a..789c0331465 100644 --- a/src/writing.c +++ b/src/writing.c @@ -2,10 +2,6 @@ #include "utils.h" #include "parser.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - void train_writing(char *cfgfile, char *weightfile) { char *backup_directory = "/home/pjreddie/backup/"; diff --git a/src/yolo.c b/src/yolo.c index ee5f73bb305..3f77278ae5c 100644 --- a/src/yolo.c +++ b/src/yolo.c @@ -6,10 +6,6 @@ #include "box.h" #include "demo.h" -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#endif - char *voc_names[] = {"aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"}; void train_yolo(char *cfgfile, char *weightfile) From e15189d8c45cade5417fa56b6aef2b95b0ed1d15 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Fri, 7 Apr 2017 14:17:39 -0700 Subject: [PATCH 007/118] :fire: :fire: :fire: --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f0de805ffb6..029d02cb7b6 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ -gencode arch=compute_52,code=[sm_52,compute_52] # This is what I use, uncomment if you know your arch and want to specify -ARCH= -gencode arch=compute_52,code=compute_52 +# ARCH= -gencode arch=compute_52,code=compute_52 VPATH=./src/ EXEC=darknet From 8d9ed0a1d680c8d31e453e2e1cebfda66b357c11 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 9 Apr 2017 19:56:42 -0700 Subject: [PATCH 008/118] :crowmageddon: probably broke everything :crowmageddon: --- cfg/coco.data | 4 +- cfg/yolo.cfg | 4 +- src/activation_layer.c | 16 +- src/activation_layer.h | 8 +- src/avgpool_layer.c | 8 +- src/avgpool_layer.h | 8 +- src/avgpool_layer_kernels.cu | 8 +- src/batchnorm_layer.c | 64 ++++---- src/batchnorm_layer.h | 8 +- src/blas_kernels.cu | 2 +- src/classifier.c | 2 +- src/connected_layer.c | 26 ++-- src/connected_layer.h | 8 +- src/convolutional_kernels.cu | 101 +++++++------ src/convolutional_layer.c | 63 +++++--- src/convolutional_layer.h | 10 +- src/cost_layer.c | 36 ++--- src/cost_layer.h | 8 +- src/crnn_layer.c | 62 ++++---- src/crnn_layer.h | 8 +- src/crop_layer.c | 10 +- src/crop_layer.h | 4 +- src/crop_layer_kernels.cu | 6 +- src/darknet.c | 28 ++++ src/deconvolutional_kernels.cu | 64 ++++---- src/deconvolutional_layer.c | 104 ++++++------- src/deconvolutional_layer.h | 10 +- src/demo.c | 4 +- src/detection_layer.c | 61 ++++---- src/detection_layer.h | 8 +- src/detector.c | 29 ++-- src/dropout_layer.c | 16 +- src/dropout_layer.h | 8 +- src/dropout_layer_kernels.cu | 12 +- src/gru_layer.c | 56 +++---- src/gru_layer.h | 8 +- src/image.c | 19 +++ src/image.h | 1 + src/layer.h | 22 ++- src/local_layer.c | 44 +++--- src/local_layer.h | 8 +- src/lsd.c | 258 ++++++++++++++++++--------------- src/maxpool_layer.c | 8 +- src/maxpool_layer.h | 8 +- src/maxpool_layer_kernels.cu | 8 +- src/network.c | 228 +++++++++++++---------------- src/network.h | 56 +++---- src/network_kernels.cu | 119 ++++++--------- src/nightmare.c | 59 ++++---- src/normalization_layer.c | 24 +-- src/normalization_layer.h | 8 +- src/parser.c | 21 ++- src/region_layer.c | 72 +++++---- src/region_layer.h | 10 +- src/reorg_layer.c | 48 +++--- src/reorg_layer.h | 8 +- src/rnn.c | 16 +- src/rnn_layer.c | 64 ++++---- src/rnn_layer.h | 8 +- src/rnn_vid.c | 4 +- src/route_layer.c | 16 +- src/route_layer.h | 8 +- src/shortcut_layer.c | 24 +-- src/shortcut_layer.h | 8 +- src/softmax_layer.c | 20 +-- src/softmax_layer.h | 8 +- 66 files changed, 1077 insertions(+), 1010 deletions(-) diff --git a/cfg/coco.data b/cfg/coco.data index 30038417c27..610151dc50b 100644 --- a/cfg/coco.data +++ b/cfg/coco.data @@ -1,7 +1,7 @@ classes= 80 train = /home/pjreddie/data/coco/trainvalno5k.txt -valid = coco_testdev -#valid = data/coco_val_5k.list +#valid = coco_testdev +valid = data/coco_val_5k.list names = data/coco.names backup = /home/pjreddie/backup/ eval=coco diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg index 7001dfa58a9..c530f915cc1 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolo.cfg @@ -5,8 +5,8 @@ subdivisions=1 # Training # batch=64 # subdivisions=8 -height=416 -width=416 +height=608 +width=608 channels=3 momentum=0.9 decay=0.0005 diff --git a/src/activation_layer.c b/src/activation_layer.c index 3430dac4078..de4e4b7d09b 100644 --- a/src/activation_layer.c +++ b/src/activation_layer.c @@ -35,29 +35,29 @@ layer make_activation_layer(int batch, int inputs, ACTIVATION activation) return l; } -void forward_activation_layer(layer l, network_state state) +void forward_activation_layer(layer l, network net) { - copy_cpu(l.outputs*l.batch, state.input, 1, l.output, 1); + copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1); activate_array(l.output, l.outputs*l.batch, l.activation); } -void backward_activation_layer(layer l, network_state state) +void backward_activation_layer(layer l, network net) { gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta); - copy_cpu(l.outputs*l.batch, l.delta, 1, state.delta, 1); + copy_cpu(l.outputs*l.batch, l.delta, 1, net.delta, 1); } #ifdef GPU -void forward_activation_layer_gpu(layer l, network_state state) +void forward_activation_layer_gpu(layer l, network net) { - copy_ongpu(l.outputs*l.batch, state.input, 1, l.output_gpu, 1); + copy_ongpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); } -void backward_activation_layer_gpu(layer l, network_state state) +void backward_activation_layer_gpu(layer l, network net) { gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); - copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, state.delta, 1); + copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/activation_layer.h b/src/activation_layer.h index a09756aa507..42118a84e83 100644 --- a/src/activation_layer.h +++ b/src/activation_layer.h @@ -7,12 +7,12 @@ layer make_activation_layer(int batch, int inputs, ACTIVATION activation); -void forward_activation_layer(layer l, network_state state); -void backward_activation_layer(layer l, network_state state); +void forward_activation_layer(layer l, network net); +void backward_activation_layer(layer l, network net); #ifdef GPU -void forward_activation_layer_gpu(layer l, network_state state); -void backward_activation_layer_gpu(layer l, network_state state); +void forward_activation_layer_gpu(layer l, network net); +void backward_activation_layer_gpu(layer l, network net); #endif #endif diff --git a/src/avgpool_layer.c b/src/avgpool_layer.c index b6932fe7f40..83034dbecf4 100644 --- a/src/avgpool_layer.c +++ b/src/avgpool_layer.c @@ -37,7 +37,7 @@ void resize_avgpool_layer(avgpool_layer *l, int w, int h) l->inputs = h*w*l->c; } -void forward_avgpool_layer(const avgpool_layer l, network_state state) +void forward_avgpool_layer(const avgpool_layer l, network net) { int b,i,k; @@ -47,14 +47,14 @@ void forward_avgpool_layer(const avgpool_layer l, network_state state) l.output[out_index] = 0; for(i = 0; i < l.h*l.w; ++i){ int in_index = i + l.h*l.w*(k + b*l.c); - l.output[out_index] += state.input[in_index]; + l.output[out_index] += net.input[in_index]; } l.output[out_index] /= l.h*l.w; } } } -void backward_avgpool_layer(const avgpool_layer l, network_state state) +void backward_avgpool_layer(const avgpool_layer l, network net) { int b,i,k; @@ -63,7 +63,7 @@ void backward_avgpool_layer(const avgpool_layer l, network_state state) int out_index = k + b*l.c; for(i = 0; i < l.h*l.w; ++i){ int in_index = i + l.h*l.w*(k + b*l.c); - state.delta[in_index] += l.delta[out_index] / (l.h*l.w); + net.delta[in_index] += l.delta[out_index] / (l.h*l.w); } } } diff --git a/src/avgpool_layer.h b/src/avgpool_layer.h index f8329aea8bb..3bd356c4e39 100644 --- a/src/avgpool_layer.h +++ b/src/avgpool_layer.h @@ -11,12 +11,12 @@ typedef layer avgpool_layer; image get_avgpool_image(avgpool_layer l); avgpool_layer make_avgpool_layer(int batch, int w, int h, int c); void resize_avgpool_layer(avgpool_layer *l, int w, int h); -void forward_avgpool_layer(const avgpool_layer l, network_state state); -void backward_avgpool_layer(const avgpool_layer l, network_state state); +void forward_avgpool_layer(const avgpool_layer l, network net); +void backward_avgpool_layer(const avgpool_layer l, network net); #ifdef GPU -void forward_avgpool_layer_gpu(avgpool_layer l, network_state state); -void backward_avgpool_layer_gpu(avgpool_layer l, network_state state); +void forward_avgpool_layer_gpu(avgpool_layer l, network net); +void backward_avgpool_layer_gpu(avgpool_layer l, network net); #endif #endif diff --git a/src/avgpool_layer_kernels.cu b/src/avgpool_layer_kernels.cu index b7e2770e1ff..a7eca3aeae9 100644 --- a/src/avgpool_layer_kernels.cu +++ b/src/avgpool_layer_kernels.cu @@ -43,19 +43,19 @@ __global__ void backward_avgpool_layer_kernel(int n, int w, int h, int c, float } } -extern "C" void forward_avgpool_layer_gpu(avgpool_layer layer, network_state state) +extern "C" void forward_avgpool_layer_gpu(avgpool_layer layer, network net) { size_t n = layer.c*layer.batch; - forward_avgpool_layer_kernel<<>>(n, layer.w, layer.h, layer.c, state.input, layer.output_gpu); + forward_avgpool_layer_kernel<<>>(n, layer.w, layer.h, layer.c, net.input_gpu, layer.output_gpu); check_error(cudaPeekAtLastError()); } -extern "C" void backward_avgpool_layer_gpu(avgpool_layer layer, network_state state) +extern "C" void backward_avgpool_layer_gpu(avgpool_layer layer, network net) { size_t n = layer.c*layer.batch; - backward_avgpool_layer_kernel<<>>(n, layer.w, layer.h, layer.c, state.delta, layer.delta_gpu); + backward_avgpool_layer_kernel<<>>(n, layer.w, layer.h, layer.c, net.delta_gpu, layer.delta_gpu); check_error(cudaPeekAtLastError()); } diff --git a/src/batchnorm_layer.c b/src/batchnorm_layer.c index 1be70aa0ad7..de081c4ec6a 100644 --- a/src/batchnorm_layer.c +++ b/src/batchnorm_layer.c @@ -132,14 +132,15 @@ void resize_batchnorm_layer(layer *layer, int w, int h) fprintf(stderr, "Not implemented\n"); } -void forward_batchnorm_layer(layer l, network_state state) +void forward_batchnorm_layer(layer l, network net) { - if(l.type == BATCHNORM) copy_cpu(l.outputs*l.batch, state.input, 1, l.output, 1); + if(l.type == BATCHNORM) copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1); if(l.type == CONNECTED){ l.out_c = l.outputs; l.out_h = l.out_w = 1; } - if(state.train){ + copy_cpu(l.outputs*l.batch, l.output, 1, l.x, 1); + if(net.train){ mean_cpu(l.output, l.batch, l.out_c, l.out_h*l.out_w, l.mean); variance_cpu(l.output, l.mean, l.batch, l.out_c, l.out_h*l.out_w, l.variance); @@ -148,7 +149,6 @@ void forward_batchnorm_layer(layer l, network_state state) scal_cpu(l.out_c, .99, l.rolling_variance, 1); axpy_cpu(l.out_c, .01, l.variance, 1, l.rolling_variance, 1); - copy_cpu(l.outputs*l.batch, l.output, 1, l.x, 1); normalize_cpu(l.output, l.mean, l.variance, l.batch, l.out_c, l.out_h*l.out_w); copy_cpu(l.outputs*l.batch, l.output, 1, l.x_norm, 1); } else { @@ -158,8 +158,12 @@ void forward_batchnorm_layer(layer l, network_state state) add_bias(l.output, l.biases, l.batch, l.out_c, l.out_h*l.out_w); } -void backward_batchnorm_layer(const layer l, network_state state) +void backward_batchnorm_layer(layer l, network net) { + if(!net.train){ + l.mean = l.rolling_mean; + l.variance = l.rolling_variance; + } backward_bias(l.bias_updates, l.delta, l.batch, l.out_c, l.out_w*l.out_h); backward_scale_cpu(l.x_norm, l.delta, l.batch, l.out_c, l.out_w*l.out_h, l.scale_updates); @@ -168,7 +172,7 @@ void backward_batchnorm_layer(const layer l, network_state state) mean_delta_cpu(l.delta, l.variance, l.batch, l.out_c, l.out_w*l.out_h, l.mean_delta); variance_delta_cpu(l.x, l.delta, l.mean, l.variance, l.batch, l.out_c, l.out_w*l.out_h, l.variance_delta); normalize_delta_cpu(l.x, l.mean, l.variance, l.mean_delta, l.variance_delta, l.batch, l.out_c, l.out_w*l.out_h, l.delta); - if(l.type == BATCHNORM) copy_cpu(l.outputs*l.batch, l.delta, 1, state.delta, 1); + if(l.type == BATCHNORM) copy_cpu(l.outputs*l.batch, l.delta, 1, net.delta, 1); } #ifdef GPU @@ -186,35 +190,35 @@ void push_batchnorm_layer(layer l) cuda_push_array(l.rolling_variance_gpu, l.rolling_variance, l.c); } -void forward_batchnorm_layer_gpu(layer l, network_state state) +void forward_batchnorm_layer_gpu(layer l, network net) { - if(l.type == BATCHNORM) copy_ongpu(l.outputs*l.batch, state.input, 1, l.output_gpu, 1); + if(l.type == BATCHNORM) copy_ongpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); if(l.type == CONNECTED){ l.out_c = l.outputs; l.out_h = l.out_w = 1; } - if (state.train) { + copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); + if (net.train) { #ifdef CUDNN - copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); float one = 1; float zero = 0; cudnnBatchNormalizationForwardTraining(cudnn_handle(), - CUDNN_BATCHNORM_SPATIAL, - &one, - &zero, - l.dstTensorDesc, - l.x_gpu, - l.dstTensorDesc, - l.output_gpu, - l.normTensorDesc, - l.scales_gpu, - l.biases_gpu, - .01, - l.rolling_mean_gpu, - l.rolling_variance_gpu, - .00001, - l.mean_gpu, - l.variance_gpu); + CUDNN_BATCHNORM_SPATIAL, + &one, + &zero, + l.dstTensorDesc, + l.x_gpu, + l.dstTensorDesc, + l.output_gpu, + l.normTensorDesc, + l.scales_gpu, + l.biases_gpu, + .01, + l.rolling_mean_gpu, + l.rolling_variance_gpu, + .00001, + l.mean_gpu, + l.variance_gpu); #else fast_mean_gpu(l.output_gpu, l.batch, l.out_c, l.out_h*l.out_w, l.mean_gpu); fast_variance_gpu(l.output_gpu, l.mean_gpu, l.batch, l.out_c, l.out_h*l.out_w, l.variance_gpu); @@ -239,8 +243,12 @@ void forward_batchnorm_layer_gpu(layer l, network_state state) } -void backward_batchnorm_layer_gpu(const layer l, network_state state) +void backward_batchnorm_layer_gpu(layer l, network net) { + if(!net.train){ + l.mean_gpu = l.rolling_mean_gpu; + l.variance_gpu = l.rolling_variance_gpu; + } #ifdef CUDNN float one = 1; float zero = 0; @@ -274,6 +282,6 @@ void backward_batchnorm_layer_gpu(const layer l, network_state state) fast_variance_delta_gpu(l.x_gpu, l.delta_gpu, l.mean_gpu, l.variance_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.variance_delta_gpu); normalize_delta_gpu(l.x_gpu, l.mean_gpu, l.variance_gpu, l.mean_delta_gpu, l.variance_delta_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.delta_gpu); #endif - if(l.type == BATCHNORM) copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, state.delta, 1); + if(l.type == BATCHNORM) copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/batchnorm_layer.h b/src/batchnorm_layer.h index 99d1d0fe316..25a18a3c8f2 100644 --- a/src/batchnorm_layer.h +++ b/src/batchnorm_layer.h @@ -6,12 +6,12 @@ #include "network.h" layer make_batchnorm_layer(int batch, int w, int h, int c); -void forward_batchnorm_layer(layer l, network_state state); -void backward_batchnorm_layer(layer l, network_state state); +void forward_batchnorm_layer(layer l, network net); +void backward_batchnorm_layer(layer l, network net); #ifdef GPU -void forward_batchnorm_layer_gpu(layer l, network_state state); -void backward_batchnorm_layer_gpu(layer l, network_state state); +void forward_batchnorm_layer_gpu(layer l, network net); +void backward_batchnorm_layer_gpu(layer l, network net); void pull_batchnorm_layer(layer l); void push_batchnorm_layer(layer l); #endif diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index a833adbbdd5..ac29d3f0bca 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -145,7 +145,7 @@ __global__ void adam_kernel(int N, float *x, float *m, float *v, float B1, float int index = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if (index >= N) return; - x[index] = x[index] - (rate * sqrt(1.-pow(B2, t)) / (1.-pow(B1, t)) * m[index] / (sqrt(v[index]) + eps)); + x[index] = x[index] + (rate * sqrt(1.-pow(B2, t)) / (1.-pow(B1, t)) * m[index] / (sqrt(v[index]) + eps)); //if(index == 0) printf("%f %f %f %f\n", m[index], v[index], (rate * sqrt(1.-pow(B2, t)) / (1.-pow(B1, t)) * m[index] / (sqrt(v[index]) + eps))); } diff --git a/src/classifier.c b/src/classifier.c index 6011c935b3b..1b7ff38aeb0 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -123,7 +123,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); save_weights(net, buff); } - if(get_current_batch(net)%100 == 0){ + if(get_current_batch(net)%1000 == 0){ char buff[256]; sprintf(buff, "%s/%s.backup",backup_directory,base); save_weights(net, buff); diff --git a/src/connected_layer.c b/src/connected_layer.c index c23d6fa474d..f8c74235327 100644 --- a/src/connected_layer.c +++ b/src/connected_layer.c @@ -125,19 +125,19 @@ void update_connected_layer(connected_layer l, int batch, float learning_rate, f scal_cpu(l.inputs*l.outputs, momentum, l.weight_updates, 1); } -void forward_connected_layer(connected_layer l, network_state state) +void forward_connected_layer(connected_layer l, network net) { int i; fill_cpu(l.outputs*l.batch, 0, l.output, 1); int m = l.batch; int k = l.inputs; int n = l.outputs; - float *a = state.input; + float *a = net.input; float *b = l.weights; float *c = l.output; gemm(0,1,m,n,k,1,a,k,b,k,1,c,n); if(l.batch_normalize){ - if(state.train){ + if(net.train){ mean_cpu(l.output, l.batch, l.outputs, 1, l.mean); variance_cpu(l.output, l.mean, l.batch, l.outputs, 1, l.variance); @@ -160,7 +160,7 @@ void forward_connected_layer(connected_layer l, network_state state) activate_array(l.output, l.outputs*l.batch, l.activation); } -void backward_connected_layer(connected_layer l, network_state state) +void backward_connected_layer(connected_layer l, network net) { int i; gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta); @@ -181,7 +181,7 @@ void backward_connected_layer(connected_layer l, network_state state) int k = l.batch; int n = l.inputs; float *a = l.delta; - float *b = state.input; + float *b = net.input; float *c = l.weight_updates; gemm(1,0,m,n,k,1,a,m,b,n,1,c,n); @@ -191,7 +191,7 @@ void backward_connected_layer(connected_layer l, network_state state) a = l.delta; b = l.weights; - c = state.delta; + c = net.delta; if(c) gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); } @@ -274,7 +274,7 @@ void update_connected_layer_gpu(connected_layer l, int batch, float learning_rat scal_ongpu(l.inputs*l.outputs, momentum, l.weight_updates_gpu, 1); } -void forward_connected_layer_gpu(connected_layer l, network_state state) +void forward_connected_layer_gpu(connected_layer l, network net) { int i; fill_ongpu(l.outputs*l.batch, 0, l.output_gpu, 1); @@ -282,12 +282,12 @@ void forward_connected_layer_gpu(connected_layer l, network_state state) int m = l.batch; int k = l.inputs; int n = l.outputs; - float * a = state.input; + float * a = net.input_gpu; float * b = l.weights_gpu; float * c = l.output_gpu; gemm_ongpu(0,1,m,n,k,1,a,k,b,k,1,c,n); if(l.batch_normalize){ - forward_batchnorm_layer_gpu(l, state); + forward_batchnorm_layer_gpu(l, net); } for(i = 0; i < l.batch; ++i){ axpy_ongpu(l.outputs, 1, l.biases_gpu, 1, l.output_gpu + i*l.outputs, 1); @@ -295,7 +295,7 @@ void forward_connected_layer_gpu(connected_layer l, network_state state) activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); } -void backward_connected_layer_gpu(connected_layer l, network_state state) +void backward_connected_layer_gpu(connected_layer l, network net) { int i; constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); @@ -305,14 +305,14 @@ void backward_connected_layer_gpu(connected_layer l, network_state state) } if(l.batch_normalize){ - backward_batchnorm_layer_gpu(l, state); + backward_batchnorm_layer_gpu(l, net); } int m = l.outputs; int k = l.batch; int n = l.inputs; float * a = l.delta_gpu; - float * b = state.input; + float * b = net.input_gpu; float * c = l.weight_updates_gpu; gemm_ongpu(1,0,m,n,k,1,a,m,b,n,1,c,n); @@ -322,7 +322,7 @@ void backward_connected_layer_gpu(connected_layer l, network_state state) a = l.delta_gpu; b = l.weights_gpu; - c = state.delta; + c = net.delta_gpu; if(c) gemm_ongpu(0,0,m,n,k,1,a,k,b,n,1,c,n); } diff --git a/src/connected_layer.h b/src/connected_layer.h index 23797b10c47..62dd497f3f2 100644 --- a/src/connected_layer.h +++ b/src/connected_layer.h @@ -9,15 +9,15 @@ typedef layer connected_layer; connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVATION activation, int batch_normalize); -void forward_connected_layer(connected_layer layer, network_state state); -void backward_connected_layer(connected_layer layer, network_state state); +void forward_connected_layer(connected_layer layer, network net); +void backward_connected_layer(connected_layer layer, network net); void update_connected_layer(connected_layer layer, int batch, float learning_rate, float momentum, float decay); void denormalize_connected_layer(layer l); void statistics_connected_layer(layer l); #ifdef GPU -void forward_connected_layer_gpu(connected_layer layer, network_state state); -void backward_connected_layer_gpu(connected_layer layer, network_state state); +void forward_connected_layer_gpu(connected_layer layer, network net); +void backward_connected_layer_gpu(connected_layer layer, network net); void update_connected_layer_gpu(connected_layer layer, int batch, float learning_rate, float momentum, float decay); void push_connected_layer(connected_layer layer); void pull_connected_layer(connected_layer layer); diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index 9eb058ce9ef..41dec50d364 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -70,7 +70,7 @@ void binarize_weights_gpu(float *weights, int n, int size, float *binary) check_error(cudaPeekAtLastError()); } -void forward_convolutional_layer_gpu(convolutional_layer l, network_state state) +void forward_convolutional_layer_gpu(convolutional_layer l, network net) { fill_ongpu(l.outputs*l.batch, 0, l.output_gpu, 1); if(l.binary){ @@ -81,8 +81,8 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network_state state) if(l.xnor){ binarize_weights_gpu(l.weights_gpu, l.n, l.c*l.size*l.size, l.binary_weights_gpu); swap_binary(&l); - binarize_gpu(state.input, l.c*l.h*l.w*l.batch, l.binary_input_gpu); - state.input = l.binary_input_gpu; + binarize_gpu(net.input_gpu, l.c*l.h*l.w*l.batch, l.binary_input_gpu); + net.input_gpu = l.binary_input_gpu; } #ifdef CUDNN @@ -90,12 +90,12 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network_state state) cudnnConvolutionForward(cudnn_handle(), &one, l.srcTensorDesc, - state.input, + net.input_gpu, l.weightDesc, l.weights_gpu, l.convDesc, l.fw_algo, - state.workspace, + net.workspace, l.workspace_size, &one, l.dstTensorDesc, @@ -107,16 +107,16 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network_state state) int k = l.size*l.size*l.c; int n = l.out_w*l.out_h; for(i = 0; i < l.batch; ++i){ - im2col_ongpu(state.input + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, state.workspace); + im2col_ongpu(net.input_gpu + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); float * a = l.weights_gpu; - float * b = state.workspace; + float * b = net.workspace; float * c = l.output_gpu; gemm_ongpu(0,0,m,n,k,1.,a,k,b,n,1.,c+i*m*n,n); } #endif if (l.batch_normalize) { - forward_batchnorm_layer_gpu(l, state); + forward_batchnorm_layer_gpu(l, net); } else { add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.n, l.out_w*l.out_h); } @@ -168,40 +168,40 @@ extern "C" void smooth_layer(layer l, int size, float rate) check_error(cudaPeekAtLastError()); } -void backward_convolutional_layer_gpu(convolutional_layer l, network_state state) +void backward_convolutional_layer_gpu(convolutional_layer l, network net) { if(l.smooth){ smooth_layer(l, 5, l.smooth); } - //constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); + constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); if(l.batch_normalize){ - backward_batchnorm_layer_gpu(l, state); + backward_batchnorm_layer_gpu(l, net); } else { backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.n, l.out_w*l.out_h); } - float *original_input = state.input; + float *original_input = net.input_gpu; - if(l.xnor) state.input = l.binary_input_gpu; + if(l.xnor) net.input_gpu = l.binary_input_gpu; #ifdef CUDNN float one = 1; cudnnConvolutionBackwardFilter(cudnn_handle(), &one, l.srcTensorDesc, - state.input, + net.input_gpu, l.ddstTensorDesc, l.delta_gpu, l.convDesc, l.bf_algo, - state.workspace, + net.workspace, l.workspace_size, &one, l.dweightDesc, l.weight_updates_gpu); - if(state.delta){ + if(net.delta_gpu){ if(l.binary || l.xnor) swap_binary(&l); cudnnConvolutionBackwardData(cudnn_handle(), &one, @@ -211,13 +211,13 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network_state state l.delta_gpu, l.convDesc, l.bd_algo, - state.workspace, + net.workspace, l.workspace_size, &one, l.dsrcTensorDesc, - state.delta); + net.delta_gpu); if(l.binary || l.xnor) swap_binary(&l); - if(l.xnor) gradient_array_ongpu(original_input, l.batch*l.c*l.h*l.w, HARDTAN, state.delta); + if(l.xnor) gradient_array_ongpu(original_input, l.batch*l.c*l.h*l.w, HARDTAN, net.delta_gpu); } #else @@ -228,25 +228,25 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network_state state int i; for(i = 0; i < l.batch; ++i){ float * a = l.delta_gpu; - float * b = state.workspace; + float * b = net.workspace; float * c = l.weight_updates_gpu; - im2col_ongpu(state.input + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, state.workspace); + im2col_ongpu(net.input_gpu + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); gemm_ongpu(0,1,m,n,k,1,a + i*m*k,k,b,k,1,c,n); - if(state.delta){ + if(net.delta_gpu){ if(l.binary || l.xnor) swap_binary(&l); float * a = l.weights_gpu; float * b = l.delta_gpu; - float * c = state.workspace; + float * c = net.workspace; gemm_ongpu(1,0,n,k,m,1,a,n,b + i*k*m,k,0,c,k); - col2im_ongpu(state.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, state.delta + i*l.c*l.h*l.w); + col2im_ongpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta_gpu + i*l.c*l.h*l.w); if(l.binary || l.xnor) { swap_binary(&l); } - if(l.xnor) gradient_array_ongpu(original_input + i*l.c*l.h*l.w, l.c*l.h*l.w, HARDTAN, state.delta + i*l.c*l.h*l.w); + if(l.xnor) gradient_array_ongpu(original_input + i*l.c*l.h*l.w, l.c*l.h*l.w, HARDTAN, net.delta_gpu + i*l.c*l.h*l.w); } } #endif @@ -286,33 +286,42 @@ void push_convolutional_layer(convolutional_layer layer) } } -void update_convolutional_layer_gpu(convolutional_layer layer, int batch, float learning_rate, float momentum, float decay) +void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch) { - int size = layer.size*layer.size*layer.c*layer.n; - axpy_ongpu(layer.n, learning_rate/batch, layer.bias_updates_gpu, 1, layer.biases_gpu, 1); - scal_ongpu(layer.n, momentum, layer.bias_updates_gpu, 1); + scal_ongpu(n, B1, m, 1); + scal_ongpu(n, B2, v, 1); + axpy_ongpu(n, -decay*batch, w, 1, d, 1); - if(layer.scales_gpu){ - axpy_ongpu(layer.n, learning_rate/batch, layer.scale_updates_gpu, 1, layer.scales_gpu, 1); - scal_ongpu(layer.n, momentum, layer.scale_updates_gpu, 1); - } - - if(layer.adam){ - scal_ongpu(size, layer.B1, layer.m_gpu, 1); - scal_ongpu(size, layer.B2, layer.v_gpu, 1); + axpy_ongpu(n, (1-B1), d, 1, m, 1); + mul_ongpu(n, d, 1, d, 1); + axpy_ongpu(n, (1-B2), d, 1, v, 1); - axpy_ongpu(size, -decay*batch, layer.weights_gpu, 1, layer.weight_updates_gpu, 1); + adam_gpu(n, w, m, v, B1, B2, rate/batch, eps, 1000); + fill_ongpu(n, 0, d, 1); +} - axpy_ongpu(size, -(1-layer.B1), layer.weight_updates_gpu, 1, layer.m_gpu, 1); - mul_ongpu(size, layer.weight_updates_gpu, 1, layer.weight_updates_gpu, 1); - axpy_ongpu(size, (1-layer.B2), layer.weight_updates_gpu, 1, layer.v_gpu, 1); +void update_convolutional_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) +{ + int size = l.size*l.size*l.c*l.n; - adam_gpu(size, layer.weights_gpu, layer.m_gpu, layer.v_gpu, layer.B1, layer.B2, learning_rate/batch, layer.eps, layer.t+1); - fill_ongpu(size, 0, layer.weight_updates_gpu, 1); + if(l.adam){ + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, size, batch); + adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch); + if(l.scales_gpu){ + adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch); + } }else{ - axpy_ongpu(size, -decay*batch, layer.weights_gpu, 1, layer.weight_updates_gpu, 1); - axpy_ongpu(size, learning_rate/batch, layer.weight_updates_gpu, 1, layer.weights_gpu, 1); - scal_ongpu(size, momentum, layer.weight_updates_gpu, 1); + axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_ongpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_ongpu(size, momentum, l.weight_updates_gpu, 1); + + axpy_ongpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); + scal_ongpu(l.n, momentum, l.bias_updates_gpu, 1); + + if(l.scales_gpu){ + axpy_ongpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); + scal_ongpu(l.n, momentum, l.scale_updates_gpu, 1); + } } } diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index 04d21310250..182a113dc66 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -12,11 +12,6 @@ #include "xnor_layer.h" #endif -#ifndef AI2 -#define AI2 0 -void forward_xnor_layer(layer l, network_state state); -#endif - void swap_binary(convolutional_layer *l) { float *swap = l->weights; @@ -188,9 +183,14 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.biases = calloc(n, sizeof(float)); l.bias_updates = calloc(n, sizeof(float)); + l.nweights = c*n*size*size; + l.nbiases = n; + // float scale = 1./sqrt(size*size*c); float scale = sqrt(2./(size*size*c)); - for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_uniform(-1, 1); + scale = .02; + //for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_uniform(-1, 1); + for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_normal(); int out_w = convolutional_out_width(l); int out_h = convolutional_out_height(l); l.out_h = out_h; @@ -237,6 +237,10 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.adam = 1; l.m = calloc(c*n*size*size, sizeof(float)); l.v = calloc(c*n*size*size, sizeof(float)); + l.bias_m = calloc(n, sizeof(float)); + l.scale_m = calloc(n, sizeof(float)); + l.bias_v = calloc(n, sizeof(float)); + l.scale_v = calloc(n, sizeof(float)); } #ifdef GPU @@ -248,6 +252,10 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int if (adam) { l.m_gpu = cuda_make_array(l.m, c*n*size*size); l.v_gpu = cuda_make_array(l.v, c*n*size*size); + l.bias_m_gpu = cuda_make_array(l.bias_m, n); + l.bias_v_gpu = cuda_make_array(l.bias_v, n); + l.scale_m_gpu = cuda_make_array(l.scale_m, n); + l.scale_v_gpu = cuda_make_array(l.scale_v, n); } l.weights_gpu = cuda_make_array(l.weights, c*n*size*size); @@ -319,6 +327,7 @@ void denormalize_convolutional_layer(convolutional_layer l) } } +/* void test_convolutional_layer() { convolutional_layer l = make_convolutional_layer(1, 5, 5, 3, 2, 5, 2, 1, LEAKY, 1, 0, 0, 0); @@ -338,10 +347,10 @@ void test_convolutional_layer() 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3}; - network_state state = {0}; - state.input = data; - forward_convolutional_layer(l, state); + //net.input = data; + //forward_convolutional_layer(l); } +*/ void resize_convolutional_layer(convolutional_layer *l, int w, int h) { @@ -418,7 +427,7 @@ void backward_bias(float *bias_updates, float *delta, int batch, int n, int size } } -void forward_convolutional_layer(convolutional_layer l, network_state state) +void forward_convolutional_layer(convolutional_layer l, network net) { int out_h = l.out_h; int out_w = l.out_w; @@ -429,8 +438,8 @@ void forward_convolutional_layer(convolutional_layer l, network_state state) if(l.xnor){ binarize_weights(l.weights, l.n, l.c*l.size*l.size, l.binary_weights); swap_binary(&l); - binarize_cpu(state.input, l.c*l.h*l.w*l.batch, l.binary_input); - state.input = l.binary_input; + binarize_cpu(net.input, l.c*l.h*l.w*l.batch, l.binary_input); + net.input = l.binary_input; } int m = l.n; @@ -439,19 +448,19 @@ void forward_convolutional_layer(convolutional_layer l, network_state state) float *a = l.weights; - float *b = state.workspace; + float *b = net.workspace; float *c = l.output; for(i = 0; i < l.batch; ++i){ - im2col_cpu(state.input, l.c, l.h, l.w, + im2col_cpu(net.input, l.c, l.h, l.w, l.size, l.stride, l.pad, b); gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); c += n*m; - state.input += l.c*l.h*l.w; + net.input += l.c*l.h*l.w; } if(l.batch_normalize){ - forward_batchnorm_layer(l, state); + forward_batchnorm_layer(l, net); } else { add_bias(l.output, l.biases, l.batch, l.n, out_h*out_w); } @@ -460,7 +469,7 @@ void forward_convolutional_layer(convolutional_layer l, network_state state) if(l.binary || l.xnor) swap_binary(&l); } -void backward_convolutional_layer(convolutional_layer l, network_state state) +void backward_convolutional_layer(convolutional_layer l, network net) { int i; int m = l.n; @@ -470,30 +479,30 @@ void backward_convolutional_layer(convolutional_layer l, network_state state) gradient_array(l.output, m*k*l.batch, l.activation, l.delta); if(l.batch_normalize){ - backward_batchnorm_layer(l, state); + backward_batchnorm_layer(l, net); } else { backward_bias(l.bias_updates, l.delta, l.batch, l.n, k); } for(i = 0; i < l.batch; ++i){ float *a = l.delta + i*m*k; - float *b = state.workspace; + float *b = net.workspace; float *c = l.weight_updates; - float *im = state.input+i*l.c*l.h*l.w; + float *im = net.input+i*l.c*l.h*l.w; im2col_cpu(im, l.c, l.h, l.w, l.size, l.stride, l.pad, b); gemm(0,1,m,n,k,1,a,k,b,k,1,c,n); - if(state.delta){ + if(net.delta){ a = l.weights; b = l.delta + i*m*k; - c = state.workspace; + c = net.workspace; gemm(1,0,n,k,m,1,a,n,b,k,0,c,k); - col2im_cpu(state.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, state.delta+i*l.c*l.h*l.w); + col2im_cpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta+i*l.c*l.h*l.w); } } } @@ -553,8 +562,14 @@ image *get_weights(convolutional_layer l) int i; for(i = 0; i < l.n; ++i){ weights[i] = copy_image(get_convolutional_weight(l, i)); - //normalize_image(weights[i]); + normalize_image(weights[i]); + /* + char buff[256]; + sprintf(buff, "filter%d", i); + save_image(weights[i], buff); + */ } + //error("hey"); return weights; } diff --git a/src/convolutional_layer.h b/src/convolutional_layer.h index 970aa101a08..e00e6788eea 100644 --- a/src/convolutional_layer.h +++ b/src/convolutional_layer.h @@ -10,8 +10,8 @@ typedef layer convolutional_layer; #ifdef GPU -void forward_convolutional_layer_gpu(convolutional_layer layer, network_state state); -void backward_convolutional_layer_gpu(convolutional_layer layer, network_state state); +void forward_convolutional_layer_gpu(convolutional_layer layer, network net); +void backward_convolutional_layer_gpu(convolutional_layer layer, network net); void update_convolutional_layer_gpu(convolutional_layer layer, int batch, float learning_rate, float momentum, float decay); void push_convolutional_layer(convolutional_layer layer); @@ -19,6 +19,7 @@ void pull_convolutional_layer(convolutional_layer layer); void add_bias_gpu(float *output, float *biases, int batch, int n, int size); void backward_bias_gpu(float *bias_updates, float *delta, int batch, int n, int size); +void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch); #ifdef CUDNN void cudnn_convolutional_setup(layer *l); #endif @@ -27,18 +28,19 @@ void cudnn_convolutional_setup(layer *l); convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int binary, int xnor, int adam); void denormalize_convolutional_layer(convolutional_layer l); void resize_convolutional_layer(convolutional_layer *layer, int w, int h); -void forward_convolutional_layer(const convolutional_layer layer, network_state state); +void forward_convolutional_layer(const convolutional_layer layer, network net); void update_convolutional_layer(convolutional_layer layer, int batch, float learning_rate, float momentum, float decay); image *visualize_convolutional_layer(convolutional_layer layer, char *window, image *prev_weights); void binarize_weights(float *weights, int n, int size, float *binary); void swap_binary(convolutional_layer *l); void binarize_weights2(float *weights, int n, int size, char *binary, float *scales); -void backward_convolutional_layer(convolutional_layer layer, network_state state); +void backward_convolutional_layer(convolutional_layer layer, network net); void add_bias(float *output, float *biases, int batch, int n, int size); void backward_bias(float *bias_updates, float *delta, int batch, int n, int size); +image *get_weights(convolutional_layer l); image get_convolutional_image(convolutional_layer layer); image get_convolutional_delta(convolutional_layer layer); image get_convolutional_weight(convolutional_layer layer, int i); diff --git a/src/cost_layer.c b/src/cost_layer.c index 320f7fe51dc..76c001f0363 100644 --- a/src/cost_layer.c +++ b/src/cost_layer.c @@ -73,28 +73,28 @@ void resize_cost_layer(cost_layer *l, int inputs) #endif } -void forward_cost_layer(cost_layer l, network_state state) +void forward_cost_layer(cost_layer l, network net) { - if (!state.truth) return; + if (!net.truth) return; if(l.cost_type == MASKED){ int i; for(i = 0; i < l.batch*l.inputs; ++i){ - if(state.truth[i] == SECRET_NUM) state.input[i] = SECRET_NUM; + if(net.truth[i] == SECRET_NUM) net.input[i] = SECRET_NUM; } } if(l.cost_type == SMOOTH){ - smooth_l1_cpu(l.batch*l.inputs, state.input, state.truth, l.delta, l.output); + smooth_l1_cpu(l.batch*l.inputs, net.input, net.truth, l.delta, l.output); }else if(l.cost_type == L1){ - l1_cpu(l.batch*l.inputs, state.input, state.truth, l.delta, l.output); + l1_cpu(l.batch*l.inputs, net.input, net.truth, l.delta, l.output); } else { - l2_cpu(l.batch*l.inputs, state.input, state.truth, l.delta, l.output); + l2_cpu(l.batch*l.inputs, net.input, net.truth, l.delta, l.output); } l.cost[0] = sum_array(l.output, l.batch*l.inputs); } -void backward_cost_layer(const cost_layer l, network_state state) +void backward_cost_layer(const cost_layer l, network net) { - axpy_cpu(l.batch*l.inputs, l.scale, l.delta, 1, state.delta, 1); + axpy_cpu(l.batch*l.inputs, l.scale, l.delta, 1, net.delta, 1); } #ifdef GPU @@ -118,23 +118,23 @@ int float_abs_compare (const void * a, const void * b) return (fa > fb) - (fa < fb); } -void forward_cost_layer_gpu(cost_layer l, network_state state) +void forward_cost_layer_gpu(cost_layer l, network net) { - if (!state.truth) return; + if (!net.truth) return; if(l.smooth){ - scal_ongpu(l.batch*l.inputs, (1-l.smooth), state.truth, 1); - add_ongpu(l.batch*l.inputs, l.smooth * 1./l.inputs, state.truth, 1); + scal_ongpu(l.batch*l.inputs, (1-l.smooth), net.truth_gpu, 1); + add_ongpu(l.batch*l.inputs, l.smooth * 1./l.inputs, net.truth_gpu, 1); } if (l.cost_type == MASKED) { - mask_ongpu(l.batch*l.inputs, state.input, SECRET_NUM, state.truth); + mask_ongpu(l.batch*l.inputs, net.input_gpu, SECRET_NUM, net.truth_gpu); } if(l.cost_type == SMOOTH){ - smooth_l1_gpu(l.batch*l.inputs, state.input, state.truth, l.delta_gpu, l.output_gpu); + smooth_l1_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); } else if (l.cost_type == L1){ - l1_gpu(l.batch*l.inputs, state.input, state.truth, l.delta_gpu, l.output_gpu); + l1_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); } else { - l2_gpu(l.batch*l.inputs, state.input, state.truth, l.delta_gpu, l.output_gpu); + l2_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); } if(l.ratio){ @@ -155,9 +155,9 @@ void forward_cost_layer_gpu(cost_layer l, network_state state) l.cost[0] = sum_array(l.output, l.batch*l.inputs); } -void backward_cost_layer_gpu(const cost_layer l, network_state state) +void backward_cost_layer_gpu(const cost_layer l, network net) { - axpy_ongpu(l.batch*l.inputs, l.scale, l.delta_gpu, 1, state.delta, 1); + axpy_ongpu(l.batch*l.inputs, l.scale, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/cost_layer.h b/src/cost_layer.h index a692831efd8..ceb64de00bf 100644 --- a/src/cost_layer.h +++ b/src/cost_layer.h @@ -8,13 +8,13 @@ typedef layer cost_layer; COST_TYPE get_cost_type(char *s); char *get_cost_string(COST_TYPE a); cost_layer make_cost_layer(int batch, int inputs, COST_TYPE type, float scale); -void forward_cost_layer(const cost_layer l, network_state state); -void backward_cost_layer(const cost_layer l, network_state state); +void forward_cost_layer(const cost_layer l, network net); +void backward_cost_layer(const cost_layer l, network net); void resize_cost_layer(cost_layer *l, int inputs); #ifdef GPU -void forward_cost_layer_gpu(cost_layer l, network_state state); -void backward_cost_layer_gpu(const cost_layer l, network_state state); +void forward_cost_layer_gpu(cost_layer l, network net); +void backward_cost_layer_gpu(const cost_layer l, network net); #endif #endif diff --git a/src/crnn_layer.c b/src/crnn_layer.c index 54958803668..2478fef5e71 100644 --- a/src/crnn_layer.c +++ b/src/crnn_layer.c @@ -88,10 +88,10 @@ void update_crnn_layer(layer l, int batch, float learning_rate, float momentum, update_convolutional_layer(*(l.output_layer), batch, learning_rate, momentum, decay); } -void forward_crnn_layer(layer l, network_state state) +void forward_crnn_layer(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); @@ -100,17 +100,17 @@ void forward_crnn_layer(layer l, network_state state) fill_cpu(l.outputs * l.batch * l.steps, 0, output_layer.delta, 1); fill_cpu(l.hidden * l.batch * l.steps, 0, self_layer.delta, 1); fill_cpu(l.hidden * l.batch * l.steps, 0, input_layer.delta, 1); - if(state.train) fill_cpu(l.hidden * l.batch, 0, l.state, 1); + if(net.train) fill_cpu(l.hidden * l.batch, 0, l.state, 1); for (i = 0; i < l.steps; ++i) { - s.input = state.input; + s.input = net.input; forward_convolutional_layer(input_layer, s); s.input = l.state; forward_convolutional_layer(self_layer, s); float *old_state = l.state; - if(state.train) l.state += l.hidden*l.batch; + if(net.train) l.state += l.hidden*l.batch; if(l.shortcut){ copy_cpu(l.hidden * l.batch, old_state, 1, l.state, 1); }else{ @@ -122,17 +122,16 @@ void forward_crnn_layer(layer l, network_state state) s.input = l.state; forward_convolutional_layer(output_layer, s); - state.input += l.inputs*l.batch; + net.input += l.inputs*l.batch; increment_layer(&input_layer, 1); increment_layer(&self_layer, 1); increment_layer(&output_layer, 1); } } -void backward_crnn_layer(layer l, network_state state) +void backward_crnn_layer(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); @@ -168,8 +167,8 @@ void backward_crnn_layer(layer l, network_state state) copy_cpu(l.hidden*l.batch, self_layer.delta, 1, input_layer.delta, 1); if (i > 0 && l.shortcut) axpy_cpu(l.hidden*l.batch, 1, self_layer.delta, 1, self_layer.delta - l.hidden*l.batch, 1); - s.input = state.input + i*l.inputs*l.batch; - if(state.delta) s.delta = state.delta + i*l.inputs*l.batch; + s.input = net.input + i*l.inputs*l.batch; + if(net.delta) s.delta = net.delta + i*l.inputs*l.batch; else s.delta = 0; backward_convolutional_layer(input_layer, s); @@ -202,10 +201,9 @@ void update_crnn_layer_gpu(layer l, int batch, float learning_rate, float moment update_convolutional_layer_gpu(*(l.output_layer), batch, learning_rate, momentum, decay); } -void forward_crnn_layer_gpu(layer l, network_state state) +void forward_crnn_layer_gpu(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); @@ -214,17 +212,17 @@ void forward_crnn_layer_gpu(layer l, network_state state) fill_ongpu(l.outputs * l.batch * l.steps, 0, output_layer.delta_gpu, 1); fill_ongpu(l.hidden * l.batch * l.steps, 0, self_layer.delta_gpu, 1); fill_ongpu(l.hidden * l.batch * l.steps, 0, input_layer.delta_gpu, 1); - if(state.train) fill_ongpu(l.hidden * l.batch, 0, l.state_gpu, 1); + if(net.train) fill_ongpu(l.hidden * l.batch, 0, l.state_gpu, 1); for (i = 0; i < l.steps; ++i) { - s.input = state.input; + s.input_gpu = net.input_gpu; forward_convolutional_layer_gpu(input_layer, s); - s.input = l.state_gpu; + s.input_gpu = l.state_gpu; forward_convolutional_layer_gpu(self_layer, s); float *old_state = l.state_gpu; - if(state.train) l.state_gpu += l.hidden*l.batch; + if(net.train) l.state_gpu += l.hidden*l.batch; if(l.shortcut){ copy_ongpu(l.hidden * l.batch, old_state, 1, l.state_gpu, 1); }else{ @@ -233,20 +231,20 @@ void forward_crnn_layer_gpu(layer l, network_state state) axpy_ongpu(l.hidden * l.batch, 1, input_layer.output_gpu, 1, l.state_gpu, 1); axpy_ongpu(l.hidden * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); - s.input = l.state_gpu; + s.input_gpu = l.state_gpu; forward_convolutional_layer_gpu(output_layer, s); - state.input += l.inputs*l.batch; + net.input_gpu += l.inputs*l.batch; increment_layer(&input_layer, 1); increment_layer(&self_layer, 1); increment_layer(&output_layer, 1); } } -void backward_crnn_layer_gpu(layer l, network_state state) +void backward_crnn_layer_gpu(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); @@ -259,22 +257,22 @@ void backward_crnn_layer_gpu(layer l, network_state state) copy_ongpu(l.hidden * l.batch, input_layer.output_gpu, 1, l.state_gpu, 1); axpy_ongpu(l.hidden * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); - s.input = l.state_gpu; - s.delta = self_layer.delta_gpu; + s.input_gpu = l.state_gpu; + s.delta_gpu = self_layer.delta_gpu; backward_convolutional_layer_gpu(output_layer, s); l.state_gpu -= l.hidden*l.batch; - s.input = l.state_gpu; - s.delta = self_layer.delta_gpu - l.hidden*l.batch; - if (i == 0) s.delta = 0; + s.input_gpu = l.state_gpu; + s.delta_gpu = self_layer.delta_gpu - l.hidden*l.batch; + if (i == 0) s.delta_gpu = 0; backward_convolutional_layer_gpu(self_layer, s); copy_ongpu(l.hidden*l.batch, self_layer.delta_gpu, 1, input_layer.delta_gpu, 1); if (i > 0 && l.shortcut) axpy_ongpu(l.hidden*l.batch, 1, self_layer.delta_gpu, 1, self_layer.delta_gpu - l.hidden*l.batch, 1); - s.input = state.input + i*l.inputs*l.batch; - if(state.delta) s.delta = state.delta + i*l.inputs*l.batch; - else s.delta = 0; + s.input_gpu = net.input_gpu + i*l.inputs*l.batch; + if(net.delta_gpu) s.delta_gpu = net.delta_gpu + i*l.inputs*l.batch; + else s.delta_gpu = 0; backward_convolutional_layer_gpu(input_layer, s); increment_layer(&input_layer, -1); diff --git a/src/crnn_layer.h b/src/crnn_layer.h index 0da942ee1ab..ce89211ba3a 100644 --- a/src/crnn_layer.h +++ b/src/crnn_layer.h @@ -8,13 +8,13 @@ layer make_crnn_layer(int batch, int h, int w, int c, int hidden_filters, int output_filters, int steps, ACTIVATION activation, int batch_normalize); -void forward_crnn_layer(layer l, network_state state); -void backward_crnn_layer(layer l, network_state state); +void forward_crnn_layer(layer l, network net); +void backward_crnn_layer(layer l, network net); void update_crnn_layer(layer l, int batch, float learning_rate, float momentum, float decay); #ifdef GPU -void forward_crnn_layer_gpu(layer l, network_state state); -void backward_crnn_layer_gpu(layer l, network_state state); +void forward_crnn_layer_gpu(layer l, network net); +void backward_crnn_layer_gpu(layer l, network net); void update_crnn_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); void push_crnn_layer(layer l); void pull_crnn_layer(layer l); diff --git a/src/crop_layer.c b/src/crop_layer.c index 11c59b491f2..3b918529e64 100644 --- a/src/crop_layer.c +++ b/src/crop_layer.c @@ -10,8 +10,8 @@ image get_crop_image(crop_layer l) return float_to_image(w,h,c,l.output); } -void backward_crop_layer(const crop_layer l, network_state state){} -void backward_crop_layer_gpu(const crop_layer l, network_state state){} +void backward_crop_layer(const crop_layer l, network net){} +void backward_crop_layer_gpu(const crop_layer l, network net){} crop_layer make_crop_layer(int batch, int h, int w, int c, int crop_height, int crop_width, int flip, float angle, float saturation, float exposure) { @@ -64,7 +64,7 @@ void resize_crop_layer(layer *l, int w, int h) } -void forward_crop_layer(const crop_layer l, network_state state) +void forward_crop_layer(const crop_layer l, network net) { int i,j,c,b,row,col; int index; @@ -78,7 +78,7 @@ void forward_crop_layer(const crop_layer l, network_state state) scale = 1; trans = 0; } - if(!state.train){ + if(!net.train){ flip = 0; dh = (l.h - l.out_h)/2; dw = (l.w - l.out_w)/2; @@ -94,7 +94,7 @@ void forward_crop_layer(const crop_layer l, network_state state) } row = i + dh; index = col+l.w*(row+l.h*(c + l.c*b)); - l.output[count++] = state.input[index]*scale + trans; + l.output[count++] = net.input[index]*scale + trans; } } } diff --git a/src/crop_layer.h b/src/crop_layer.h index 3aa2d3dd013..3b5883c47d6 100644 --- a/src/crop_layer.h +++ b/src/crop_layer.h @@ -9,11 +9,11 @@ typedef layer crop_layer; image get_crop_image(crop_layer l); crop_layer make_crop_layer(int batch, int h, int w, int c, int crop_height, int crop_width, int flip, float angle, float saturation, float exposure); -void forward_crop_layer(const crop_layer l, network_state state); +void forward_crop_layer(const crop_layer l, network net); void resize_crop_layer(layer *l, int w, int h); #ifdef GPU -void forward_crop_layer_gpu(crop_layer l, network_state state); +void forward_crop_layer_gpu(crop_layer l, network net); #endif #endif diff --git a/src/crop_layer_kernels.cu b/src/crop_layer_kernels.cu index 8a08630533c..b6568219c34 100644 --- a/src/crop_layer_kernels.cu +++ b/src/crop_layer_kernels.cu @@ -180,7 +180,7 @@ __global__ void forward_crop_layer_kernel(float *input, float *rand, int size, i output[count] = bilinear_interpolate_kernel(input, w, h, rx, ry, k); } -extern "C" void forward_crop_layer_gpu(crop_layer layer, network_state state) +extern "C" void forward_crop_layer_gpu(crop_layer layer, network net) { cuda_random(layer.rand_gpu, layer.batch*8); @@ -195,12 +195,12 @@ extern "C" void forward_crop_layer_gpu(crop_layer layer, network_state state) int size = layer.batch * layer.w * layer.h; - levels_image_kernel<<>>(state.input, layer.rand_gpu, layer.batch, layer.w, layer.h, state.train, layer.saturation, layer.exposure, translate, scale, layer.shift); + levels_image_kernel<<>>(net.input_gpu, layer.rand_gpu, layer.batch, layer.w, layer.h, net.train, layer.saturation, layer.exposure, translate, scale, layer.shift); check_error(cudaPeekAtLastError()); size = layer.batch*layer.c*layer.out_w*layer.out_h; - forward_crop_layer_kernel<<>>(state.input, layer.rand_gpu, size, layer.c, layer.h, layer.w, layer.out_h, layer.out_w, state.train, layer.flip, radians, layer.output_gpu); + forward_crop_layer_kernel<<>>(net.input_gpu, layer.rand_gpu, size, layer.c, layer.h, layer.w, layer.out_h, layer.out_w, net.train, layer.flip, radians, layer.output_gpu); check_error(cudaPeekAtLastError()); /* diff --git a/src/darknet.c b/src/darknet.c index 4b797accffc..a3aa65557e7 100644 --- a/src/darknet.c +++ b/src/darknet.c @@ -348,6 +348,32 @@ void denormalize_net(char *cfgfile, char *weightfile, char *outfile) save_weights(net, outfile); } +void mkimg(char *cfgfile, char *weightfile, int h, int w, int num, char *prefix) +{ + network net = load_network(cfgfile, weightfile, 0); + image *ims = get_weights(net.layers[0]); + int n = net.layers[0].n; + int z; + for(z = 0; z < num; ++z){ + image im = make_image(h, w, 3); + fill_image(im, .5); + int i; + for(i = 0; i < 100; ++i){ + image r = copy_image(ims[rand()%n]); + rotate_image_cw(r, rand()%4); + random_distort_image(r, 1, 1.5, 1.5); + int dx = rand()%(w-r.w); + int dy = rand()%(h-r.h); + ghost_image(r, im, dx, dy); + free_image(r); + } + char buff[256]; + sprintf(buff, "%s/gen_%d", prefix, z); + save_image(im, buff); + free_image(im); + } +} + void visualize(char *cfgfile, char *weightfile) { network net = parse_network_cfg(cfgfile); @@ -458,6 +484,8 @@ int main(int argc, char **argv) average(argc, argv); } else if (0 == strcmp(argv[1], "visualize")){ visualize(argv[2], (argc > 3) ? argv[3] : 0); + } else if (0 == strcmp(argv[1], "mkimg")){ + mkimg(argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), argv[7]); } else if (0 == strcmp(argv[1], "imtest")){ test_resize(argv[2]); } else { diff --git a/src/deconvolutional_kernels.cu b/src/deconvolutional_kernels.cu index 381be23bd68..55aa162cfd7 100644 --- a/src/deconvolutional_kernels.cu +++ b/src/deconvolutional_kernels.cu @@ -14,12 +14,9 @@ extern "C" { #include "cuda.h" } -extern "C" void forward_deconvolutional_layer_gpu(layer l, network_state state) +extern "C" void forward_deconvolutional_layer_gpu(layer l, network net) { int i; - int out_h = l.out_h; - int out_w = l.out_w; - int size = out_h*out_w; int m = l.size*l.size*l.n; int n = l.h*l.w; @@ -29,59 +26,57 @@ extern "C" void forward_deconvolutional_layer_gpu(layer l, network_state state) for(i = 0; i < l.batch; ++i){ float *a = l.weights_gpu; - float *b = state.input + i*l.c*l.h*l.w; - float *c = state.workspace; + float *b = net.input_gpu + i*l.c*l.h*l.w; + float *c = net.workspace; gemm_ongpu(1,0,m,n,k,1,a,m,b,n,0,c,n); - col2im_ongpu(c, l.n, out_h, out_w, l.size, l.stride, l.pad, l.output_gpu+i*l.n*size); + col2im_ongpu(net.workspace, l.out_c, l.out_h, l.out_w, l.size, l.stride, l.pad, l.output_gpu+i*l.outputs); } if (l.batch_normalize) { - forward_batchnorm_layer_gpu(l, state); + forward_batchnorm_layer_gpu(l, net); } else { add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.n, l.out_w*l.out_h); } - activate_array_ongpu(l.output_gpu, l.batch*l.n*size, l.activation); + activate_array_ongpu(l.output_gpu, l.batch*l.n*l.out_w*l.out_h, l.activation); } -extern "C" void backward_deconvolutional_layer_gpu(layer l, network_state state) +extern "C" void backward_deconvolutional_layer_gpu(layer l, network net) { - int out_h = l.out_h; - int out_w = l.out_w; - int size = out_h*out_w; int i; + constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); if(l.batch_normalize){ - backward_batchnorm_layer_gpu(l, state); + backward_batchnorm_layer_gpu(l, net); } else { backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.n, l.out_w*l.out_h); } - //if(state.delta) memset(state.delta, 0, l.batch*l.h*l.w*l.c*sizeof(float)); + //if(net.delta_gpu) memset(net.delta_gpu, 0, l.batch*l.h*l.w*l.c*sizeof(float)); for(i = 0; i < l.batch; ++i){ int m = l.c; int n = l.size*l.size*l.n; int k = l.h*l.w; - float *a = state.input + i*m*n; - float *b = state.workspace; + float *a = net.input_gpu + i*m*k; + float *b = net.workspace; float *c = l.weight_updates_gpu; - im2col_ongpu(l.delta_gpu + i*l.n*size, l.n, out_h, out_w, + im2col_ongpu(l.delta_gpu + i*l.outputs, l.out_c, l.out_h, l.out_w, l.size, l.stride, l.pad, b); gemm_ongpu(0,1,m,n,k,1,a,k,b,k,1,c,n); - if(state.delta){ + if(net.delta_gpu){ int m = l.c; int n = l.h*l.w; int k = l.size*l.size*l.n; float *a = l.weights_gpu; - float *b = state.workspace; - float *c = state.delta + i*n*m; + float *b = net.workspace; + float *c = net.delta_gpu + i*n*m; gemm_ongpu(0,0,m,n,k,1,a,k,b,n,1,c,n); } @@ -117,16 +112,25 @@ extern "C" void push_deconvolutional_layer(layer l) void update_deconvolutional_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) { int size = l.size*l.size*l.c*l.n; - axpy_ongpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); - scal_ongpu(l.n, momentum, l.bias_updates_gpu, 1); - if(l.scales_gpu){ - axpy_ongpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); - scal_ongpu(l.n, momentum, l.scale_updates_gpu, 1); - } + if(l.adam){ + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, size, batch); + adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch); + if(l.scales_gpu){ + adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch); + } + }else{ + axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_ongpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_ongpu(size, momentum, l.weight_updates_gpu, 1); + + axpy_ongpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); + scal_ongpu(l.n, momentum, l.bias_updates_gpu, 1); - axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); - axpy_ongpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); - scal_ongpu(size, momentum, l.weight_updates_gpu, 1); + if(l.scales_gpu){ + axpy_ongpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); + scal_ongpu(l.n, momentum, l.scale_updates_gpu, 1); + } + } } diff --git a/src/deconvolutional_layer.c b/src/deconvolutional_layer.c index 7170975cfe9..917d77fb0df 100644 --- a/src/deconvolutional_layer.c +++ b/src/deconvolutional_layer.c @@ -11,20 +11,11 @@ static size_t get_workspace_size(layer l){ - return (size_t)l.h*l.w*l.size*l.size*l.c*sizeof(float); + return (size_t)l.h*l.w*l.size*l.size*l.n*sizeof(float); } -int deconvolutional_out_height(layer l) -{ - return (l.h) * l.stride + l.size/2 - l.pad; -} - -int deconvolutional_out_width(layer l) -{ - return (l.w) * l.stride + l.size/2 - l.pad; -} -layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, ACTIVATION activation, int batch_normalize) +layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int adam) { int i; layer l = {0}; @@ -38,26 +29,29 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size l.stride = stride; l.size = size; + l.nweights = c*n*size*size; + l.nbiases = n; + l.weights = calloc(c*n*size*size, sizeof(float)); l.weight_updates = calloc(c*n*size*size, sizeof(float)); l.biases = calloc(n, sizeof(float)); l.bias_updates = calloc(n, sizeof(float)); - float scale = 1./sqrt(size*size*c); + float scale = .02; for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_normal(); for(i = 0; i < n; ++i){ - l.biases[i] = scale; + l.biases[i] = 0; } - l.pad = l.size/2; + l.pad = padding; - l.out_h = (l.h) * l.stride + l.size/2 - l.pad; - l.out_w = (l.w) * l.stride + l.size/2 - l.pad; + l.out_h = (l.h - 1) * l.stride + l.size - 2*l.pad; + l.out_w = (l.w - 1) * l.stride + l.size - 2*l.pad; l.out_c = n; l.outputs = l.out_w * l.out_h * l.out_c; l.inputs = l.w * l.h * l.c; - l.output = calloc(l.batch*l.out_h * l.out_w * n, sizeof(float)); - l.delta = calloc(l.batch*l.out_h * l.out_w * n, sizeof(float)); + l.output = calloc(l.batch*l.outputs, sizeof(float)); + l.delta = calloc(l.batch*l.outputs, sizeof(float)); l.forward = forward_deconvolutional_layer; l.backward = backward_deconvolutional_layer; @@ -83,6 +77,15 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size l.x = calloc(l.batch*l.outputs, sizeof(float)); l.x_norm = calloc(l.batch*l.outputs, sizeof(float)); } + if(adam){ + l.adam = 1; + l.m = calloc(c*n*size*size, sizeof(float)); + l.v = calloc(c*n*size*size, sizeof(float)); + l.bias_m = calloc(n, sizeof(float)); + l.scale_m = calloc(n, sizeof(float)); + l.bias_v = calloc(n, sizeof(float)); + l.scale_v = calloc(n, sizeof(float)); + } #ifdef GPU l.forward_gpu = forward_deconvolutional_layer_gpu; @@ -91,6 +94,14 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size if(gpu_index >= 0){ + if (adam) { + l.m_gpu = cuda_make_array(l.m, c*n*size*size); + l.v_gpu = cuda_make_array(l.v, c*n*size*size); + l.bias_m_gpu = cuda_make_array(l.bias_m, n); + l.bias_v_gpu = cuda_make_array(l.bias_v, n); + l.scale_m_gpu = cuda_make_array(l.scale_m, n); + l.scale_v_gpu = cuda_make_array(l.scale_v, n); + } l.weights_gpu = cuda_make_array(l.weights, c*n*size*size); l.weight_updates_gpu = cuda_make_array(l.weight_updates, c*n*size*size); @@ -137,8 +148,8 @@ void resize_deconvolutional_layer(layer *l, int h, int w) { l->h = h; l->w = w; - l->out_h = (l->h) * l->stride + l->size/2 - l->pad; - l->out_w = (l->w) * l->stride + l->size/2 - l->pad; + l->out_h = (l->h - 1) * l->stride + l->size - 2*l->pad; + l->out_w = (l->w - 1) * l->stride + l->size - 2*l->pad; l->outputs = l->out_h * l->out_w * l->out_c; l->inputs = l->w * l->h * l->c; @@ -172,12 +183,9 @@ void resize_deconvolutional_layer(layer *l, int h, int w) l->workspace_size = get_workspace_size(*l); } -void forward_deconvolutional_layer(const layer l, network_state state) +void forward_deconvolutional_layer(const layer l, network net) { int i; - int out_h = l.out_h; - int out_w = l.out_w; - int size = out_h*out_w; int m = l.size*l.size*l.n; int n = l.h*l.w; @@ -187,60 +195,58 @@ void forward_deconvolutional_layer(const layer l, network_state state) for(i = 0; i < l.batch; ++i){ float *a = l.weights; - float *b = state.input + i*l.c*l.h*l.w; - float *c = state.workspace; + float *b = net.input + i*l.c*l.h*l.w; + float *c = net.workspace; - gemm(1,0,m,n,k,1,a,m,b,n,0,c,n); + gemm_cpu(1,0,m,n,k,1,a,m,b,n,0,c,n); - col2im_cpu(c, l.n, out_h, out_w, l.size, l.stride, 0, l.output+i*l.n*size); + col2im_cpu(net.workspace, l.out_c, l.out_h, l.out_w, l.size, l.stride, l.pad, l.output+i*l.outputs); } - - if(l.batch_normalize){ - forward_batchnorm_layer(l, state); + if (l.batch_normalize) { + forward_batchnorm_layer(l, net); } else { - add_bias(l.output, l.biases, l.batch, l.n, l.out_h*l.out_w); + add_bias(l.output, l.biases, l.batch, l.n, l.out_w*l.out_h); } - activate_array(l.output, l.batch*l.n*size, l.activation); + activate_array(l.output, l.batch*l.n*l.out_w*l.out_h, l.activation); } -void backward_deconvolutional_layer(layer l, network_state state) +void backward_deconvolutional_layer(layer l, network net) { - float alpha = 1./l.batch; - int out_h = deconvolutional_out_height(l); - int out_w = deconvolutional_out_width(l); - int size = out_h*out_w; int i; - gradient_array(l.output, size*l.n*l.batch, l.activation, l.delta); + gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta); + if(l.batch_normalize){ - backward_batchnorm_layer(l, state); + backward_batchnorm_layer(l, net); } else { backward_bias(l.bias_updates, l.delta, l.batch, l.n, l.out_w*l.out_h); } + //if(net.delta) memset(net.delta, 0, l.batch*l.h*l.w*l.c*sizeof(float)); + for(i = 0; i < l.batch; ++i){ int m = l.c; int n = l.size*l.size*l.n; int k = l.h*l.w; - float *a = state.input + i*m*n; - float *b = state.workspace; + float *a = net.input + i*m*k; + float *b = net.workspace; float *c = l.weight_updates; - im2col_cpu(l.delta + i*l.n*size, l.n, out_h, out_w, - l.size, l.stride, 0, b); - gemm(0,1,m,n,k,alpha,a,k,b,k,1,c,n); + im2col_cpu(l.delta + i*l.outputs, l.out_c, l.out_h, l.out_w, + l.size, l.stride, l.pad, b); + gemm_cpu(0,1,m,n,k,1,a,k,b,k,1,c,n); - if(state.delta){ + if(net.delta){ int m = l.c; int n = l.h*l.w; int k = l.size*l.size*l.n; float *a = l.weights; - float *b = state.workspace; - float *c = state.delta + i*n*m; + float *b = net.workspace; + float *c = net.delta + i*n*m; - gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); + gemm_cpu(0,0,m,n,k,1,a,k,b,n,1,c,n); } } } diff --git a/src/deconvolutional_layer.h b/src/deconvolutional_layer.h index 6a57513e74b..42ccbc14213 100644 --- a/src/deconvolutional_layer.h +++ b/src/deconvolutional_layer.h @@ -8,18 +8,18 @@ #include "network.h" #ifdef GPU -void forward_deconvolutional_layer_gpu(layer l, network_state state); -void backward_deconvolutional_layer_gpu(layer l, network_state state); +void forward_deconvolutional_layer_gpu(layer l, network net); +void backward_deconvolutional_layer_gpu(layer l, network net); void update_deconvolutional_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); void push_deconvolutional_layer(layer l); void pull_deconvolutional_layer(layer l); #endif -layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, ACTIVATION activation, int batch_normalize); +layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int adam); void resize_deconvolutional_layer(layer *l, int h, int w); -void forward_deconvolutional_layer(const layer l, network_state state); +void forward_deconvolutional_layer(const layer l, network net); void update_deconvolutional_layer(layer l, int batch, float learning_rate, float momentum, float decay); -void backward_deconvolutional_layer(layer l, network_state state); +void backward_deconvolutional_layer(layer l, network net); #endif diff --git a/src/demo.c b/src/demo.c index 9a37b4a69e1..24c02e0e134 100644 --- a/src/demo.c +++ b/src/demo.c @@ -41,7 +41,7 @@ void *fetch_in_thread(void *ptr) if(!in.data){ error("Stream closed."); } - in_s = resize_image(in, net.w, net.h); + in_s = letterbox_image(in, net.w, net.h); return 0; } @@ -61,7 +61,7 @@ void *detect_in_thread(void *ptr) if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else if (l.type == REGION){ - get_region_boxes(l, 1, 1, demo_thresh, probs, boxes, 0, 0, demo_hier_thresh); + get_region_boxes(l, in.w, in.h, demo_thresh, probs, boxes, 0, 0, demo_hier_thresh, 1); } else { error("Last layer must produce detections\n"); } diff --git a/src/detection_layer.c b/src/detection_layer.c index ff0f4c2bf9e..f9b4e4e73ba 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -46,11 +46,11 @@ detection_layer make_detection_layer(int batch, int inputs, int n, int side, int return l; } -void forward_detection_layer(const detection_layer l, network_state state) +void forward_detection_layer(const detection_layer l, network net) { int locations = l.side*l.side; int i,j; - memcpy(l.output, state.input, l.outputs*l.batch*sizeof(float)); + memcpy(l.output, net.input, l.outputs*l.batch*sizeof(float)); //if(l.reorg) reorg(l.output, l.w*l.h, size*l.n, l.batch, 1); int b; if (l.softmax){ @@ -63,7 +63,7 @@ void forward_detection_layer(const detection_layer l, network_state state) } } } - if(state.train){ + if(net.train){ float avg_iou = 0; float avg_cat = 0; float avg_allcat = 0; @@ -77,7 +77,7 @@ void forward_detection_layer(const detection_layer l, network_state state) int index = b*l.inputs; for (i = 0; i < locations; ++i) { int truth_index = (b*locations + i)*(1+l.coords+l.classes); - int is_obj = state.truth[truth_index]; + int is_obj = net.truth[truth_index]; for (j = 0; j < l.n; ++j) { int p_index = index + locations*l.classes + i*l.n + j; l.delta[p_index] = l.noobject_scale*(0 - l.output[p_index]); @@ -95,13 +95,13 @@ void forward_detection_layer(const detection_layer l, network_state state) int class_index = index + i*l.classes; for(j = 0; j < l.classes; ++j) { - l.delta[class_index+j] = l.class_scale * (state.truth[truth_index+1+j] - l.output[class_index+j]); - *(l.cost) += l.class_scale * pow(state.truth[truth_index+1+j] - l.output[class_index+j], 2); - if(state.truth[truth_index + 1 + j]) avg_cat += l.output[class_index+j]; + l.delta[class_index+j] = l.class_scale * (net.truth[truth_index+1+j] - l.output[class_index+j]); + *(l.cost) += l.class_scale * pow(net.truth[truth_index+1+j] - l.output[class_index+j], 2); + if(net.truth[truth_index + 1 + j]) avg_cat += l.output[class_index+j]; avg_allcat += l.output[class_index+j]; } - box truth = float_to_box(state.truth + truth_index + 1 + l.classes, 1); + box truth = float_to_box(net.truth + truth_index + 1 + l.classes, 1); truth.x /= l.side; truth.y /= l.side; @@ -139,7 +139,7 @@ void forward_detection_layer(const detection_layer l, network_state state) best_index = 0; } } - if(l.random && *(state.net.seen) < 64000){ + if(l.random && *(net.seen) < 64000){ best_index = rand()%l.n; } @@ -166,13 +166,13 @@ void forward_detection_layer(const detection_layer l, network_state state) l.delta[p_index] = l.object_scale * (iou - l.output[p_index]); } - l.delta[box_index+0] = l.coord_scale*(state.truth[tbox_index + 0] - l.output[box_index + 0]); - l.delta[box_index+1] = l.coord_scale*(state.truth[tbox_index + 1] - l.output[box_index + 1]); - l.delta[box_index+2] = l.coord_scale*(state.truth[tbox_index + 2] - l.output[box_index + 2]); - l.delta[box_index+3] = l.coord_scale*(state.truth[tbox_index + 3] - l.output[box_index + 3]); + l.delta[box_index+0] = l.coord_scale*(net.truth[tbox_index + 0] - l.output[box_index + 0]); + l.delta[box_index+1] = l.coord_scale*(net.truth[tbox_index + 1] - l.output[box_index + 1]); + l.delta[box_index+2] = l.coord_scale*(net.truth[tbox_index + 2] - l.output[box_index + 2]); + l.delta[box_index+3] = l.coord_scale*(net.truth[tbox_index + 3] - l.output[box_index + 3]); if(l.sqrt){ - l.delta[box_index+2] = l.coord_scale*(sqrt(state.truth[tbox_index + 2]) - l.output[box_index + 2]); - l.delta[box_index+3] = l.coord_scale*(sqrt(state.truth[tbox_index + 3]) - l.output[box_index + 3]); + l.delta[box_index+2] = l.coord_scale*(sqrt(net.truth[tbox_index + 2]) - l.output[box_index + 2]); + l.delta[box_index+3] = l.coord_scale*(sqrt(net.truth[tbox_index + 3]) - l.output[box_index + 3]); } *(l.cost) += pow(1-iou, 2); @@ -216,9 +216,9 @@ void forward_detection_layer(const detection_layer l, network_state state) } } -void backward_detection_layer(const detection_layer l, network_state state) +void backward_detection_layer(const detection_layer l, network net) { - axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, state.delta, 1); + axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, net.delta, 1); } void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness) @@ -252,36 +252,25 @@ void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box #ifdef GPU -void forward_detection_layer_gpu(const detection_layer l, network_state state) +void forward_detection_layer_gpu(const detection_layer l, network net) { - if(!state.train){ - copy_ongpu(l.batch*l.inputs, state.input, 1, l.output_gpu, 1); + if(!net.train){ + copy_ongpu(l.batch*l.inputs, net.input_gpu, 1, l.output_gpu, 1); return; } float *in_cpu = calloc(l.batch*l.inputs, sizeof(float)); float *truth_cpu = 0; - if(state.truth){ - int num_truth = l.batch*l.side*l.side*(1+l.coords+l.classes); - truth_cpu = calloc(num_truth, sizeof(float)); - cuda_pull_array(state.truth, truth_cpu, num_truth); - } - cuda_pull_array(state.input, in_cpu, l.batch*l.inputs); - network_state cpu_state = state; - cpu_state.train = state.train; - cpu_state.truth = truth_cpu; - cpu_state.input = in_cpu; - forward_detection_layer(l, cpu_state); + + forward_detection_layer(l, net); cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); cuda_push_array(l.delta_gpu, l.delta, l.batch*l.inputs); - free(cpu_state.input); - if(cpu_state.truth) free(cpu_state.truth); } -void backward_detection_layer_gpu(detection_layer l, network_state state) +void backward_detection_layer_gpu(detection_layer l, network net) { - axpy_ongpu(l.batch*l.inputs, 1, l.delta_gpu, 1, state.delta, 1); - //copy_ongpu(l.batch*l.inputs, l.delta_gpu, 1, state.delta, 1); + axpy_ongpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); + //copy_ongpu(l.batch*l.inputs, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/detection_layer.h b/src/detection_layer.h index e847a094ccf..fecfed04cc3 100644 --- a/src/detection_layer.h +++ b/src/detection_layer.h @@ -7,13 +7,13 @@ typedef layer detection_layer; detection_layer make_detection_layer(int batch, int inputs, int n, int size, int classes, int coords, int rescore); -void forward_detection_layer(const detection_layer l, network_state state); -void backward_detection_layer(const detection_layer l, network_state state); +void forward_detection_layer(const detection_layer l, network net); +void backward_detection_layer(const detection_layer l, network net); void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness); #ifdef GPU -void forward_detection_layer_gpu(const detection_layer l, network_state state); -void backward_detection_layer_gpu(detection_layer l, network_state state); +void forward_detection_layer_gpu(const detection_layer l, network net); +void backward_detection_layer_gpu(detection_layer l, network net); #endif #endif diff --git a/src/detector.c b/src/detector.c index d5c3cfccb7c..8a429ed867f 100644 --- a/src/detector.c +++ b/src/detector.c @@ -346,7 +346,7 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char network_predict(net, input.data); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, thresh, probs, boxes, 0, map, .5); + get_region_boxes(l, w, h, thresh, probs, boxes, 0, map, .5, 0); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -477,7 +477,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out network_predict(net, X); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, thresh, probs, boxes, 0, map, .5); + get_region_boxes(l, w, h, thresh, probs, boxes, 0, map, .5, 0); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -541,7 +541,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) image sized = resize_image(orig, net.w, net.h); char *id = basecfg(path); network_predict(net, sized.data); - get_region_boxes(l, 1, 1, thresh, probs, boxes, 1, 0, .5); + get_region_boxes(l, 1, 1, thresh, probs, boxes, 1, 0, .5, 0); if (nms) do_nms(boxes, probs, l.w*l.h*l.n, 1, nms); char labelpath[4096]; @@ -580,7 +580,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) } } -void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh) +void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile) { list *options = read_data_cfg(datacfg); char *name_list = option_find_str(options, "names", "data/names.list"); @@ -624,21 +624,26 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam time=clock(); network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - get_region_boxes(l, 1, 1, thresh, probs, boxes, 0, 0, hier_thresh); + get_region_boxes(l, 1, 1, thresh, probs, boxes, 0, 0, hier_thresh, 0); if (l.softmax_tree && nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); draw_detections(sized, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); - save_image(sized, "predictions"); - show_image(sized, "predictions"); + if(outfile){ + save_image(sized, outfile); + } + else{ + save_image(sized, "predictions"); + show_image(sized, "predictions"); +#ifdef OPENCV + cvWaitKey(0); + cvDestroyAllWindows(); +#endif + } free_image(im); free_image(sized); free(boxes); free_ptrs((void **)probs, l.w*l.h*l.n); -#ifdef OPENCV - cvWaitKey(0); - cvDestroyAllWindows(); -#endif if (filename) break; } } @@ -684,7 +689,7 @@ void run_detector(int argc, char **argv) char *cfg = argv[4]; char *weights = (argc > 5) ? argv[5] : 0; char *filename = (argc > 6) ? argv[6]: 0; - if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh); + if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile); else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear); else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile); else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile); diff --git a/src/dropout_layer.c b/src/dropout_layer.c index b1381e63b9f..780554fb371 100644 --- a/src/dropout_layer.c +++ b/src/dropout_layer.c @@ -35,26 +35,26 @@ void resize_dropout_layer(dropout_layer *l, int inputs) #endif } -void forward_dropout_layer(dropout_layer l, network_state state) +void forward_dropout_layer(dropout_layer l, network net) { int i; - if (!state.train) return; + if (!net.train) return; for(i = 0; i < l.batch * l.inputs; ++i){ float r = rand_uniform(0, 1); l.rand[i] = r; - if(r < l.probability) state.input[i] = 0; - else state.input[i] *= l.scale; + if(r < l.probability) net.input[i] = 0; + else net.input[i] *= l.scale; } } -void backward_dropout_layer(dropout_layer l, network_state state) +void backward_dropout_layer(dropout_layer l, network net) { int i; - if(!state.delta) return; + if(!net.delta) return; for(i = 0; i < l.batch * l.inputs; ++i){ float r = l.rand[i]; - if(r < l.probability) state.delta[i] = 0; - else state.delta[i] *= l.scale; + if(r < l.probability) net.delta[i] = 0; + else net.delta[i] *= l.scale; } } diff --git a/src/dropout_layer.h b/src/dropout_layer.h index 691cfc5b4cf..01f94d4d7d1 100644 --- a/src/dropout_layer.h +++ b/src/dropout_layer.h @@ -8,13 +8,13 @@ typedef layer dropout_layer; dropout_layer make_dropout_layer(int batch, int inputs, float probability); -void forward_dropout_layer(dropout_layer l, network_state state); -void backward_dropout_layer(dropout_layer l, network_state state); +void forward_dropout_layer(dropout_layer l, network net); +void backward_dropout_layer(dropout_layer l, network net); void resize_dropout_layer(dropout_layer *l, int inputs); #ifdef GPU -void forward_dropout_layer_gpu(dropout_layer l, network_state state); -void backward_dropout_layer_gpu(dropout_layer l, network_state state); +void forward_dropout_layer_gpu(dropout_layer l, network net); +void backward_dropout_layer_gpu(dropout_layer l, network net); #endif #endif diff --git a/src/dropout_layer_kernels.cu b/src/dropout_layer_kernels.cu index 7e51bd55ba7..bd12b678758 100644 --- a/src/dropout_layer_kernels.cu +++ b/src/dropout_layer_kernels.cu @@ -14,9 +14,9 @@ __global__ void yoloswag420blazeit360noscope(float *input, int size, float *rand if(id < size) input[id] = (rand[id] < prob) ? 0 : input[id]*scale; } -void forward_dropout_layer_gpu(dropout_layer layer, network_state state) +void forward_dropout_layer_gpu(dropout_layer layer, network net) { - if (!state.train) return; + if (!net.train) return; int size = layer.inputs*layer.batch; cuda_random(layer.rand_gpu, size); /* @@ -27,15 +27,15 @@ void forward_dropout_layer_gpu(dropout_layer layer, network_state state) cuda_push_array(layer.rand_gpu, layer.rand, size); */ - yoloswag420blazeit360noscope<<>>(state.input, size, layer.rand_gpu, layer.probability, layer.scale); + yoloswag420blazeit360noscope<<>>(net.input_gpu, size, layer.rand_gpu, layer.probability, layer.scale); check_error(cudaPeekAtLastError()); } -void backward_dropout_layer_gpu(dropout_layer layer, network_state state) +void backward_dropout_layer_gpu(dropout_layer layer, network net) { - if(!state.delta) return; + if(!net.delta_gpu) return; int size = layer.inputs*layer.batch; - yoloswag420blazeit360noscope<<>>(state.delta, size, layer.rand_gpu, layer.probability, layer.scale); + yoloswag420blazeit360noscope<<>>(net.delta_gpu, size, layer.rand_gpu, layer.probability, layer.scale); check_error(cudaPeekAtLastError()); } diff --git a/src/gru_layer.c b/src/gru_layer.c index 27fc3c3148f..7139f798f29 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -124,10 +124,10 @@ void update_gru_layer(layer l, int batch, float learning_rate, float momentum, f update_connected_layer(*(l.output_layer), batch, learning_rate, momentum, decay); } -void forward_gru_layer(layer l, network_state state) +void forward_gru_layer(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_z_layer = *(l.input_z_layer); layer input_r_layer = *(l.input_r_layer); @@ -144,7 +144,7 @@ void forward_gru_layer(layer l, network_state state) fill_cpu(l.outputs * l.batch * l.steps, 0, state_z_layer.delta, 1); fill_cpu(l.outputs * l.batch * l.steps, 0, state_r_layer.delta, 1); fill_cpu(l.outputs * l.batch * l.steps, 0, state_h_layer.delta, 1); - if(state.train) { + if(net.train) { fill_cpu(l.outputs * l.batch * l.steps, 0, l.delta, 1); copy_cpu(l.outputs*l.batch, l.state, 1, l.prev_state, 1); } @@ -154,7 +154,7 @@ void forward_gru_layer(layer l, network_state state) forward_connected_layer(state_z_layer, s); forward_connected_layer(state_r_layer, s); - s.input = state.input; + s.input = net.input; forward_connected_layer(input_z_layer, s); forward_connected_layer(input_r_layer, s); forward_connected_layer(input_h_layer, s); @@ -188,7 +188,7 @@ void forward_gru_layer(layer l, network_state state) copy_cpu(l.outputs*l.batch, l.output, 1, l.state, 1); - state.input += l.inputs*l.batch; + net.input += l.inputs*l.batch; l.output += l.outputs*l.batch; increment_layer(&input_z_layer, 1); increment_layer(&input_r_layer, 1); @@ -200,7 +200,7 @@ void forward_gru_layer(layer l, network_state state) } } -void backward_gru_layer(layer l, network_state state) +void backward_gru_layer(layer l, network net) { } @@ -224,10 +224,10 @@ void update_gru_layer_gpu(layer l, int batch, float learning_rate, float momentu update_connected_layer_gpu(*(l.state_h_layer), batch, learning_rate, momentum, decay); } -void forward_gru_layer_gpu(layer l, network_state state) +void forward_gru_layer_gpu(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_z_layer = *(l.input_z_layer); layer input_r_layer = *(l.input_r_layer); @@ -244,17 +244,17 @@ void forward_gru_layer_gpu(layer l, network_state state) fill_ongpu(l.outputs * l.batch * l.steps, 0, state_z_layer.delta_gpu, 1); fill_ongpu(l.outputs * l.batch * l.steps, 0, state_r_layer.delta_gpu, 1); fill_ongpu(l.outputs * l.batch * l.steps, 0, state_h_layer.delta_gpu, 1); - if(state.train) { + if(net.train) { fill_ongpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); copy_ongpu(l.outputs*l.batch, l.state_gpu, 1, l.prev_state_gpu, 1); } for (i = 0; i < l.steps; ++i) { - s.input = l.state_gpu; + s.input_gpu = l.state_gpu; forward_connected_layer_gpu(state_z_layer, s); forward_connected_layer_gpu(state_r_layer, s); - s.input = state.input; + s.input_gpu = net.input_gpu; forward_connected_layer_gpu(input_z_layer, s); forward_connected_layer_gpu(input_r_layer, s); forward_connected_layer_gpu(input_h_layer, s); @@ -272,7 +272,7 @@ void forward_gru_layer_gpu(layer l, network_state state) copy_ongpu(l.outputs*l.batch, l.state_gpu, 1, l.forgot_state_gpu, 1); mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.forgot_state_gpu, 1); - s.input = l.forgot_state_gpu; + s.input_gpu = l.forgot_state_gpu; forward_connected_layer_gpu(state_h_layer, s); copy_ongpu(l.outputs*l.batch, input_h_layer.output_gpu, 1, l.h_gpu, 1); @@ -288,7 +288,7 @@ void forward_gru_layer_gpu(layer l, network_state state) copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.state_gpu, 1); - state.input += l.inputs*l.batch; + net.input_gpu += l.inputs*l.batch; l.output_gpu += l.outputs*l.batch; increment_layer(&input_z_layer, 1); increment_layer(&input_r_layer, 1); @@ -300,10 +300,10 @@ void forward_gru_layer_gpu(layer l, network_state state) } } -void backward_gru_layer_gpu(layer l, network_state state) +void backward_gru_layer_gpu(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_z_layer = *(l.input_z_layer); layer input_r_layer = *(l.input_r_layer); @@ -321,8 +321,8 @@ void backward_gru_layer_gpu(layer l, network_state state) increment_layer(&state_r_layer, l.steps - 1); increment_layer(&state_h_layer, l.steps - 1); - state.input += l.inputs*l.batch*(l.steps-1); - if(state.delta) state.delta += l.inputs*l.batch*(l.steps-1); + net.input_gpu += l.inputs*l.batch*(l.steps-1); + if(net.delta_gpu) net.delta_gpu += l.inputs*l.batch*(l.steps-1); l.output_gpu += l.outputs*l.batch*(l.steps-1); l.delta_gpu += l.outputs*l.batch*(l.steps-1); for (i = l.steps-1; i >= 0; --i) { @@ -361,8 +361,8 @@ void backward_gru_layer_gpu(layer l, network_state state) mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.forgot_state_gpu, 1); fill_ongpu(l.outputs*l.batch, 0, l.forgot_delta_gpu, 1); - s.input = l.forgot_state_gpu; - s.delta = l.forgot_delta_gpu; + s.input_gpu = l.forgot_state_gpu; + s.delta_gpu = l.forgot_delta_gpu; backward_connected_layer_gpu(state_h_layer, s); if(prev_delta_gpu) mult_add_into_gpu(l.outputs*l.batch, l.forgot_delta_gpu, l.r_gpu, prev_delta_gpu); @@ -374,22 +374,22 @@ void backward_gru_layer_gpu(layer l, network_state state) gradient_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, input_z_layer.delta_gpu); copy_ongpu(l.outputs*l.batch, input_z_layer.delta_gpu, 1, state_z_layer.delta_gpu, 1); - s.input = l.prev_state_gpu; - s.delta = prev_delta_gpu; + s.input_gpu = l.prev_state_gpu; + s.delta_gpu = prev_delta_gpu; backward_connected_layer_gpu(state_r_layer, s); backward_connected_layer_gpu(state_z_layer, s); - s.input = state.input; - s.delta = state.delta; + s.input_gpu = net.input_gpu; + s.delta_gpu = net.delta_gpu; backward_connected_layer_gpu(input_h_layer, s); backward_connected_layer_gpu(input_r_layer, s); backward_connected_layer_gpu(input_z_layer, s); - state.input -= l.inputs*l.batch; - if(state.delta) state.delta -= l.inputs*l.batch; + net.input_gpu -= l.inputs*l.batch; + if(net.delta_gpu) net.delta_gpu -= l.inputs*l.batch; l.output_gpu -= l.outputs*l.batch; l.delta_gpu -= l.outputs*l.batch; increment_layer(&input_z_layer, -1); diff --git a/src/gru_layer.h b/src/gru_layer.h index 9e19cee1a68..9dc456e08f6 100644 --- a/src/gru_layer.h +++ b/src/gru_layer.h @@ -8,13 +8,13 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_normalize); -void forward_gru_layer(layer l, network_state state); -void backward_gru_layer(layer l, network_state state); +void forward_gru_layer(layer l, network net); +void backward_gru_layer(layer l, network net); void update_gru_layer(layer l, int batch, float learning_rate, float momentum, float decay); #ifdef GPU -void forward_gru_layer_gpu(layer l, network_state state); -void backward_gru_layer_gpu(layer l, network_state state); +void forward_gru_layer_gpu(layer l, network net); +void backward_gru_layer_gpu(layer l, network net); void update_gru_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); void push_gru_layer(layer l); void pull_gru_layer(layer l); diff --git a/src/image.c b/src/image.c index 133bf1fc97c..8b2fae90ace 100644 --- a/src/image.c +++ b/src/image.c @@ -288,6 +288,25 @@ image image_distance(image a, image b) return dist; } +void ghost_image(image source, image dest, int dx, int dy) +{ + int x,y,k; + float max_dist = sqrt((-source.w/2. + .5)*(-source.w/2. + .5)); + for(k = 0; k < source.c; ++k){ + for(y = 0; y < source.h; ++y){ + for(x = 0; x < source.w; ++x){ + float dist = sqrt((x - source.w/2. + .5)*(x - source.w/2. + .5) + (y - source.h/2. + .5)*(y - source.h/2. + .5)); + float alpha = (1 - dist/max_dist); + if(alpha < 0) alpha = 0; + float v1 = get_pixel(source, x,y,k); + float v2 = get_pixel(dest, dx+x,dy+y,k); + float val = alpha*v1 + (1-alpha)*v2; + set_pixel(dest, dx+x, dy+y, k, val); + } + } + } +} + void embed_image(image source, image dest, int dx, int dy) { int x,y,k; diff --git a/src/image.h b/src/image.h index 12f12edb5bb..3109094e303 100644 --- a/src/image.h +++ b/src/image.h @@ -57,6 +57,7 @@ void normalize_image(image p); image rotate_image(image m, float rad); void rotate_image_cw(image im, int times); void embed_image(image source, image dest, int dx, int dy); +void ghost_image(image source, image dest, int dx, int dy); void place_image(image im, int w, int h, int dx, int dy, image canvas); void saturate_image(image im, float sat); void exposure_image(image im, float sat); diff --git a/src/layer.h b/src/layer.h index f9ac7247f92..2470d84c87e 100644 --- a/src/layer.h +++ b/src/layer.h @@ -5,7 +5,8 @@ #include "stddef.h" #include "tree.h" -struct network_state; +struct network; +typedef struct network network; struct layer; typedef struct layer layer; @@ -45,11 +46,11 @@ struct layer{ LAYER_TYPE type; ACTIVATION activation; COST_TYPE cost_type; - void (*forward) (struct layer, struct network_state); - void (*backward) (struct layer, struct network_state); + void (*forward) (struct layer, struct network); + void (*backward) (struct layer, struct network); void (*update) (struct layer, int, float, float, float); - void (*forward_gpu) (struct layer, struct network_state); - void (*backward_gpu) (struct layer, struct network_state); + void (*forward_gpu) (struct layer, struct network); + void (*backward_gpu) (struct layer, struct network); void (*update_gpu) (struct layer, int, float, float, float); int batch_normalize; int shortcut; @@ -58,6 +59,8 @@ struct layer{ int flipped; int inputs; int outputs; + int nweights; + int nbiases; int extra; int truths; int h,w,c; @@ -176,6 +179,11 @@ struct layer{ float * m; float * v; + + float * bias_m; + float * bias_v; + float * scale_m; + float * scale_v; float * z_cpu; float * r_cpu; @@ -216,6 +224,10 @@ struct layer{ float *m_gpu; float *v_gpu; + float *bias_m_gpu; + float *scale_m_gpu; + float *bias_v_gpu; + float *scale_v_gpu; float * prev_state_gpu; float * forgot_state_gpu; diff --git a/src/local_layer.c b/src/local_layer.c index 9f8a7ec7df1..aad036e050c 100644 --- a/src/local_layer.c +++ b/src/local_layer.c @@ -88,7 +88,7 @@ local_layer make_local_layer(int batch, int h, int w, int c, int n, int size, in return l; } -void forward_local_layer(const local_layer l, network_state state) +void forward_local_layer(const local_layer l, network net) { int out_h = local_out_height(l); int out_w = local_out_width(l); @@ -100,13 +100,13 @@ void forward_local_layer(const local_layer l, network_state state) } for(i = 0; i < l.batch; ++i){ - float *input = state.input + i*l.w*l.h*l.c; + float *input = net.input + i*l.w*l.h*l.c; im2col_cpu(input, l.c, l.h, l.w, - l.size, l.stride, l.pad, state.workspace); + l.size, l.stride, l.pad, net.workspace); float *output = l.output + i*l.outputs; for(j = 0; j < locations; ++j){ float *a = l.weights + j*l.size*l.size*l.c*l.n; - float *b = state.workspace + j; + float *b = net.workspace + j; float *c = output + j; int m = l.n; @@ -119,7 +119,7 @@ void forward_local_layer(const local_layer l, network_state state) activate_array(l.output, l.outputs*l.batch, l.activation); } -void backward_local_layer(local_layer l, network_state state) +void backward_local_layer(local_layer l, network net) { int i, j; int locations = l.out_w*l.out_h; @@ -131,13 +131,13 @@ void backward_local_layer(local_layer l, network_state state) } for(i = 0; i < l.batch; ++i){ - float *input = state.input + i*l.w*l.h*l.c; + float *input = net.input + i*l.w*l.h*l.c; im2col_cpu(input, l.c, l.h, l.w, - l.size, l.stride, l.pad, state.workspace); + l.size, l.stride, l.pad, net.workspace); for(j = 0; j < locations; ++j){ float *a = l.delta + i*l.outputs + j; - float *b = state.workspace + j; + float *b = net.workspace + j; float *c = l.weight_updates + j*l.size*l.size*l.c*l.n; int m = l.n; int n = l.size*l.size*l.c; @@ -146,11 +146,11 @@ void backward_local_layer(local_layer l, network_state state) gemm(0,1,m,n,k,1,a,locations,b,locations,1,c,n); } - if(state.delta){ + if(net.delta){ for(j = 0; j < locations; ++j){ float *a = l.weights + j*l.size*l.size*l.c*l.n; float *b = l.delta + i*l.outputs + j; - float *c = state.workspace + j; + float *c = net.workspace + j; int m = l.size*l.size*l.c; int n = 1; @@ -159,7 +159,7 @@ void backward_local_layer(local_layer l, network_state state) gemm(1,0,m,n,k,1,a,m,b,locations,0,c,locations); } - col2im_cpu(state.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, state.delta+i*l.c*l.h*l.w); + col2im_cpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta+i*l.c*l.h*l.w); } } } @@ -178,7 +178,7 @@ void update_local_layer(local_layer l, int batch, float learning_rate, float mom #ifdef GPU -void forward_local_layer_gpu(const local_layer l, network_state state) +void forward_local_layer_gpu(const local_layer l, network net) { int out_h = local_out_height(l); int out_w = local_out_width(l); @@ -190,13 +190,13 @@ void forward_local_layer_gpu(const local_layer l, network_state state) } for(i = 0; i < l.batch; ++i){ - float *input = state.input + i*l.w*l.h*l.c; + float *input = net.input_gpu + i*l.w*l.h*l.c; im2col_ongpu(input, l.c, l.h, l.w, - l.size, l.stride, l.pad, state.workspace); + l.size, l.stride, l.pad, net.workspace); float *output = l.output_gpu + i*l.outputs; for(j = 0; j < locations; ++j){ float *a = l.weights_gpu + j*l.size*l.size*l.c*l.n; - float *b = state.workspace + j; + float *b = net.workspace + j; float *c = output + j; int m = l.n; @@ -209,7 +209,7 @@ void forward_local_layer_gpu(const local_layer l, network_state state) activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); } -void backward_local_layer_gpu(local_layer l, network_state state) +void backward_local_layer_gpu(local_layer l, network net) { int i, j; int locations = l.out_w*l.out_h; @@ -220,13 +220,13 @@ void backward_local_layer_gpu(local_layer l, network_state state) } for(i = 0; i < l.batch; ++i){ - float *input = state.input + i*l.w*l.h*l.c; + float *input = net.input_gpu + i*l.w*l.h*l.c; im2col_ongpu(input, l.c, l.h, l.w, - l.size, l.stride, l.pad, state.workspace); + l.size, l.stride, l.pad, net.workspace); for(j = 0; j < locations; ++j){ float *a = l.delta_gpu + i*l.outputs + j; - float *b = state.workspace + j; + float *b = net.workspace + j; float *c = l.weight_updates_gpu + j*l.size*l.size*l.c*l.n; int m = l.n; int n = l.size*l.size*l.c; @@ -235,11 +235,11 @@ void backward_local_layer_gpu(local_layer l, network_state state) gemm_ongpu(0,1,m,n,k,1,a,locations,b,locations,1,c,n); } - if(state.delta){ + if(net.delta_gpu){ for(j = 0; j < locations; ++j){ float *a = l.weights_gpu + j*l.size*l.size*l.c*l.n; float *b = l.delta_gpu + i*l.outputs + j; - float *c = state.workspace + j; + float *c = net.workspace + j; int m = l.size*l.size*l.c; int n = 1; @@ -248,7 +248,7 @@ void backward_local_layer_gpu(local_layer l, network_state state) gemm_ongpu(1,0,m,n,k,1,a,m,b,locations,0,c,locations); } - col2im_ongpu(state.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, state.delta+i*l.c*l.h*l.w); + col2im_ongpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta_gpu+i*l.c*l.h*l.w); } } } diff --git a/src/local_layer.h b/src/local_layer.h index 28915d8191c..5e292f9106a 100644 --- a/src/local_layer.h +++ b/src/local_layer.h @@ -10,8 +10,8 @@ typedef layer local_layer; #ifdef GPU -void forward_local_layer_gpu(local_layer layer, network_state state); -void backward_local_layer_gpu(local_layer layer, network_state state); +void forward_local_layer_gpu(local_layer layer, network net); +void backward_local_layer_gpu(local_layer layer, network net); void update_local_layer_gpu(local_layer layer, int batch, float learning_rate, float momentum, float decay); void push_local_layer(local_layer layer); @@ -20,8 +20,8 @@ void pull_local_layer(local_layer layer); local_layer make_local_layer(int batch, int h, int w, int c, int n, int size, int stride, int pad, ACTIVATION activation); -void forward_local_layer(const local_layer layer, network_state state); -void backward_local_layer(local_layer layer, network_state state); +void forward_local_layer(const local_layer layer, network net); +void backward_local_layer(local_layer layer, network net); void update_local_layer(local_layer layer, int batch, float learning_rate, float momentum, float decay); void bias_output(float *output, float *biases, int batch, int n, int size); diff --git a/src/lsd.c b/src/lsd.c index 6a0e6d21f87..8801c70f17e 100644 --- a/src/lsd.c +++ b/src/lsd.c @@ -4,6 +4,7 @@ #include "parser.h" #include "blas.h" +/* void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg, char *aweight, int clear) { #ifdef GPU @@ -58,36 +59,21 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg float aloss_avg = -1; float floss_avg = -1; - network_state fstate = {0}; - fstate.index = 0; - fstate.net = fnet; - int x_size = get_network_input_size(fnet)*fnet.batch; - int y_size = get_network_output_size(fnet)*fnet.batch; - fstate.input = cuda_make_array(0, x_size); - fstate.truth = cuda_make_array(0, y_size); - fstate.delta = cuda_make_array(0, x_size); - fstate.train = 1; + fnet.train=1; + int x_size = fnet.inputs*fnet.batch; + int y_size = fnet.truths*fnet.batch; float *X = calloc(x_size, sizeof(float)); float *y = calloc(y_size, sizeof(float)); - float *ones = cuda_make_array(0, anet.batch); - fill_ongpu(anet.batch, .9, ones, 1); - network_state astate = {0}; - astate.index = 0; - astate.net = anet; - int ax_size = get_network_input_size(anet)*anet.batch; - int ay_size = get_network_output_size(anet)*anet.batch; - astate.input = 0; - astate.truth = ones; - astate.delta = cuda_make_array(0, ax_size); - astate.train = 1; + int ax_size = anet.inputs*anet.batch; + int ay_size = anet.truths*anet.batch; + fill_ongpu(ay_size, .9, anet.truth_gpu, 1); + anet.delta_gpu = cuda_make_array(0, ax_size); + anet.train = 1; - network_state gstate = {0}; - gstate.index = 0; - gstate.net = gnet; - int gx_size = get_network_input_size(gnet)*gnet.batch; - int gy_size = get_network_output_size(gnet)*gnet.batch; + int gx_size = gnet.inputs*gnet.batch; + int gy_size = gnet.truths*gnet.batch; gstate.input = cuda_make_array(0, gx_size); gstate.truth = 0; gstate.delta = 0; @@ -155,7 +141,7 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg floss += get_network_cost(fnet) /(fnet.subdivisions*fnet.batch); - cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); for(k = 0; k < gnet.batch; ++k){ int index = j*gnet.batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); @@ -164,11 +150,13 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg } } +*/ /* image sim = float_to_image(anet.w, anet.h, anet.c, style.X.vals[j]); show_image(sim, "style"); cvWaitKey(0); */ + /* harmless_update_network_gpu(anet); @@ -205,7 +193,9 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg } #endif } +*/ +/* void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear) { #ifdef GPU @@ -319,7 +309,8 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear get_next_batch(train, net.batch, j*net.batch, pixs, y); get_next_batch(gray, net.batch, j*net.batch, graypixs, y); cuda_push_array(gstate.input, graypixs, x_size); - cuda_push_array(gstate.truth, pixs, x_size); + cuda_push_array(gstate.truth, pixs, y_size); + */ /* image origi = float_to_image(net.w, net.h, 3, pixs); image grayi = float_to_image(net.w, net.h, 3, graypixs); @@ -327,6 +318,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear show_image(origi, "orig"); cvWaitKey(0); */ + /* *net.seen += net.batch; forward_network_gpu(net, gstate); @@ -350,7 +342,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear gloss += get_network_cost(net) /(net.subdivisions*net.batch); - cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); for(k = 0; k < net.batch; ++k){ int index = j*net.batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1); @@ -393,6 +385,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear save_weights(net, buff); #endif } +*/ void test_dcgan(char *cfgfile, char *weightfile) { @@ -428,7 +421,7 @@ void test_dcgan(char *cfgfile, char *weightfile) network_predict(net, X); image out = get_network_image_layer(net, imlayer); //yuv_to_rgb(out); - constrain_image(out); + normalize_image(out); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); show_image(out, "out"); save_image(out, "out"); @@ -440,33 +433,43 @@ void test_dcgan(char *cfgfile, char *weightfile) } } +void dcgan_batch(network gnet, network anet) +{ + //float *input = calloc(x_size, sizeof(float)); +} + -void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear) +void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images) { #ifdef GPU //char *train_images = "/home/pjreddie/data/coco/train1.txt"; //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; - char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list"; + //char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list"; + //char *train_images = "data/64.txt"; + //char *train_images = "data/alp.txt"; + //char *train_images = "data/cifar.txt"; char *backup_directory = "/home/pjreddie/backup/"; srand(time(0)); char *base = basecfg(cfg); char *abase = basecfg(acfg); printf("%s\n", base); - network net = load_network(cfg, weight, clear); + network gnet = load_network(cfg, weight, clear); network anet = load_network(acfg, aweight, clear); + float orig_rate = anet.learning_rate; + int start = 0; int i, j, k; layer imlayer = {0}; - for (i = 0; i < net.n; ++i) { - if (net.layers[i].out_c == 3) { - imlayer = net.layers[i]; + for (i = 0; i < gnet.n; ++i) { + if (gnet.layers[i].out_c == 3) { + imlayer = gnet.layers[i]; break; } } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - int imgs = net.batch*net.subdivisions; - i = *net.seen/imgs; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet.learning_rate, gnet.momentum, gnet.decay); + int imgs = gnet.batch*gnet.subdivisions; + i = *gnet.seen/imgs; data train, buffer; @@ -480,131 +483,144 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear) args.m = plist->size; args.d = &buffer; args.type = CLASSIFICATION_DATA; - args.classes = 2; + args.threads=16; + args.classes = 1; char *ls[2] = {"imagenet", "zzzzzzzz"}; args.labels = ls; pthread_t load_thread = load_data_in_thread(args); clock_t time; - network_state gstate = {0}; - gstate.index = 0; - gstate.net = net; - int x_size = get_network_input_size(net)*net.batch; - int y_size = get_network_output_size(net)*net.batch; - gstate.input = cuda_make_array(0, x_size); - gstate.truth = cuda_make_array(0, y_size); - gstate.train = 1; - float *input = calloc(x_size, sizeof(float)); - float *y = calloc(y_size, sizeof(float)); - float *imerror = cuda_make_array(0, y_size); + gnet.train = 1; + anet.train = 1; - network_state astate = {0}; - astate.index = 0; - astate.net = anet; - int ay_size = get_network_output_size(anet)*anet.batch; - astate.input = 0; - astate.truth = 0; - astate.delta = 0; - astate.train = 1; + int x_size = gnet.inputs*gnet.batch; + int y_size = gnet.truths*gnet.batch; + float *imerror = cuda_make_array(0, y_size); - float *ones_gpu = cuda_make_array(0, ay_size); - fill_ongpu(ay_size, .1, ones_gpu, 1); - fill_ongpu(ay_size/2, .9, ones_gpu, 2); + int ay_size = anet.truths*anet.batch; float aloss_avg = -1; //data generated = copy_data(train); - while (get_current_batch(net) < net.max_batches) { + while (get_current_batch(gnet) < gnet.max_batches) { + start += 1; i += 1; time=clock(); pthread_join(load_thread, 0); train = buffer; + + //translate_data_rows(train, -.5); + //scale_data_rows(train, 2); + load_thread = load_data_in_thread(args); printf("Loaded: %lf seconds\n", sec(clock()-time)); data gen = copy_data(train); - for(j = 0; j < imgs; ++j){ - train.y.vals[j][0] = .9; - train.y.vals[j][1] = .1; - gen.y.vals[j][0] = .1; - gen.y.vals[j][1] = .9; + for (j = 0; j < imgs; ++j) { + train.y.vals[j][0] = .95; + gen.y.vals[j][0] = .05; } time=clock(); - for(j = 0; j < net.subdivisions; ++j){ - get_next_batch(train, net.batch, j*net.batch, y, 0); + for(j = 0; j < gnet.subdivisions; ++j){ + get_next_batch(train, gnet.batch, j*gnet.batch, gnet.truth, 0); int z; for(z = 0; z < x_size; ++z){ - input[z] = rand_normal(); + gnet.input[z] = rand_normal(); } - cuda_push_array(gstate.input, input, x_size); - cuda_push_array(gstate.truth, y, y_size); - *net.seen += net.batch; - forward_network_gpu(net, gstate); + cuda_push_array(gnet.input_gpu, gnet.input, x_size); + cuda_push_array(gnet.truth_gpu, gnet.truth, y_size); + *gnet.seen += gnet.batch; + forward_network_gpu(gnet); fill_ongpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); - astate.input = imlayer.output_gpu; - astate.delta = imerror; - astate.truth = ones_gpu; - forward_network_gpu(anet, astate); - backward_network_gpu(anet, astate); + fill_ongpu(anet.truths*anet.batch, .95, anet.truth_gpu, 1); + copy_ongpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1); + anet.delta_gpu = imerror; + forward_network_gpu(anet); + backward_network_gpu(anet); + + float genaloss = *anet.cost / anet.batch; + printf("%f\n", genaloss); scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); - scal_ongpu(imlayer.outputs*imlayer.batch, .001, net.layers[net.n-1].delta_gpu, 1); + scal_ongpu(imlayer.outputs*imlayer.batch, .00, gnet.layers[gnet.n-1].delta_gpu, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); - printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); + printf("features %f\n", cuda_mag_array(gnet.layers[gnet.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); - axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1); + axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet.layers[gnet.n-1].delta_gpu, 1); - backward_network_gpu(net, gstate); + backward_network_gpu(gnet); - cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); - for(k = 0; k < net.batch; ++k){ - int index = j*net.batch + k; - copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gen.X.vals[index], 1); - gen.y.vals[index][0] = .1; + for(k = 0; k < gnet.batch; ++k){ + int index = j*gnet.batch + k; + copy_cpu(gnet.outputs, gnet.output + k*gnet.outputs, 1, gen.X.vals[index], 1); } } harmless_update_network_gpu(anet); data merge = concat_data(train, gen); - randomize_data(merge); + //randomize_data(merge); float aloss = train_network(anet, merge); - update_network_gpu(net); + //translate_image(im, 1); + //scale_image(im, .5); + //translate_image(im2, 1); + //scale_image(im2, .5); + #ifdef OPENCV + if(display){ + image im = float_to_image(anet.w, anet.h, anet.c, gen.X.vals[0]); + image im2 = float_to_image(anet.w, anet.h, anet.c, train.X.vals[0]); + show_image(im, "gen"); + show_image(im2, "train"); + cvWaitKey(50); + } + #endif + +/* + if(aloss < .1){ + anet.learning_rate = 0; + } else if (aloss > .3){ + anet.learning_rate = orig_rate; + } + */ + + update_network_gpu(gnet); + free_data(merge); free_data(train); free_data(gen); if (aloss_avg < 0) aloss_avg = aloss; aloss_avg = aloss_avg*.9 + aloss*.1; - printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs); + printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs); if(i%1000==0){ char buff[256]; sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); - save_weights(net, buff); + save_weights(gnet, buff); sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); save_weights(anet, buff); } if(i%100==0){ char buff[256]; sprintf(buff, "%s/%s.backup", backup_directory, base); - save_weights(net, buff); + save_weights(gnet, buff); sprintf(buff, "%s/%s.backup", backup_directory, abase); save_weights(anet, buff); } } char buff[256]; sprintf(buff, "%s/%s_final.weights", backup_directory, base); - save_weights(net, buff); + save_weights(gnet, buff); #endif } +/* void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int clear) { #ifdef GPU @@ -645,8 +661,8 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle args.d = &buffer; args.type = CLASSIFICATION_DATA; - args.classes = 2; - char *ls[2] = {"imagenet", "zzzzzzz"}; + args.classes = 1; + char *ls[2] = {"imagenet"}; args.labels = ls; pthread_t load_thread = load_data_in_thread(args); @@ -676,8 +692,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle float *imerror = cuda_make_array(0, imlayer.outputs*imlayer.batch); float *ones_gpu = cuda_make_array(0, ay_size); - fill_ongpu(ay_size, .1, ones_gpu, 1); - fill_ongpu(ay_size/2, .9, ones_gpu, 2); + fill_ongpu(ay_size, 1, ones_gpu, 1); float aloss_avg = -1; float gloss_avg = -1; @@ -697,10 +712,8 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle for(j = 0; j < imgs; ++j){ image gim = float_to_image(net.w, net.h, net.c, gray.X.vals[j]); grayscale_image_3c(gim); - train.y.vals[j][0] = .9; - train.y.vals[j][1] = .1; - gray.y.vals[j][0] = .1; - gray.y.vals[j][1] = .9; + train.y.vals[j][0] = 1; + gray.y.vals[j][0] = 0; } time=clock(); float gloss = 0; @@ -709,14 +722,16 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle get_next_batch(train, net.batch, j*net.batch, pixs, 0); get_next_batch(gray, net.batch, j*net.batch, graypixs, 0); cuda_push_array(gstate.input, graypixs, x_size); - cuda_push_array(gstate.truth, pixs, x_size); - /* - image origi = float_to_image(net.w, net.h, 3, pixs); - image grayi = float_to_image(net.w, net.h, 3, graypixs); - show_image(grayi, "gray"); - show_image(origi, "orig"); - cvWaitKey(0); + cuda_push_array(gstate.truth, pixs, y_size); */ + /* + image origi = float_to_image(net.w, net.h, 3, pixs); + image grayi = float_to_image(net.w, net.h, 3, graypixs); + show_image(grayi, "gray"); + show_image(origi, "orig"); + cvWaitKey(0); + */ + /* *net.seen += net.batch; forward_network_gpu(net, gstate); @@ -727,7 +742,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle forward_network_gpu(anet, astate); backward_network_gpu(anet, astate); - scal_ongpu(imlayer.outputs*imlayer.batch, 1./1000., net.layers[net.n-1].delta_gpu, 1); + scal_ongpu(imlayer.outputs*imlayer.batch, 1./100., net.layers[net.n-1].delta_gpu, 1); scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); @@ -741,7 +756,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle gloss += get_network_cost(net) /(net.subdivisions*net.batch); - cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); for(k = 0; k < net.batch; ++k){ int index = j*net.batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1); @@ -750,7 +765,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle harmless_update_network_gpu(anet); data merge = concat_data(train, gray); - randomize_data(merge); + //randomize_data(merge); float aloss = train_network(anet, merge); update_network_gpu(net); @@ -782,7 +797,9 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle save_weights(net, buff); #endif } +*/ +/* void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfile, int clear) { #ifdef GPU @@ -913,7 +930,7 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi gloss += get_network_cost(net) /(net.subdivisions*net.batch); - cuda_pull_array(imlayer.output_gpu, imlayer.output, x_size); + cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); for(k = 0; k < net.batch; ++k){ int index = j*net.batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); @@ -956,7 +973,9 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi save_weights(net, buff); #endif } +*/ +/* void train_lsd(char *cfgfile, char *weightfile, int clear) { char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; @@ -1035,6 +1054,7 @@ void train_lsd(char *cfgfile, char *weightfile, int clear) sprintf(buff, "%s/%s_final.weights", backup_directory, base); save_weights(net, buff); } +*/ void test_lsd(char *cfgfile, char *weightfile, char *filename, int gray) { @@ -1103,18 +1123,20 @@ void run_lsd(int argc, char **argv) } int clear = find_arg(argc, argv, "-clear"); + int display = find_arg(argc, argv, "-display"); + char *file = find_char_arg(argc, argv, "-file", "/home/pjreddie/data/imagenet/imagenet1k.train.list"); char *cfg = argv[3]; char *weights = (argc > 4) ? argv[4] : 0; char *filename = (argc > 5) ? argv[5] : 0; char *acfg = argv[5]; char *aweights = (argc > 6) ? argv[6] : 0; - if(0==strcmp(argv[2], "train")) train_lsd(cfg, weights, clear); - else if(0==strcmp(argv[2], "train2")) train_lsd2(cfg, weights, acfg, aweights, clear); - else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear); - else if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear); + //if(0==strcmp(argv[2], "train")) train_lsd(cfg, weights, clear); + //else if(0==strcmp(argv[2], "train2")) train_lsd2(cfg, weights, acfg, aweights, clear); + //else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear); + //else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear); + if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear, display, file); else if(0==strcmp(argv[2], "gan")) test_dcgan(cfg, weights); - else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear); else if(0==strcmp(argv[2], "test")) test_lsd(cfg, weights, filename, 0); else if(0==strcmp(argv[2], "color")) test_lsd(cfg, weights, filename, 1); /* diff --git a/src/maxpool_layer.c b/src/maxpool_layer.c index 031d116c4bf..7b3a836b9bf 100644 --- a/src/maxpool_layer.c +++ b/src/maxpool_layer.c @@ -76,7 +76,7 @@ void resize_maxpool_layer(maxpool_layer *l, int w, int h) #endif } -void forward_maxpool_layer(const maxpool_layer l, network_state state) +void forward_maxpool_layer(const maxpool_layer l, network net) { int b,i,j,k,m,n; int w_offset = -l.pad; @@ -100,7 +100,7 @@ void forward_maxpool_layer(const maxpool_layer l, network_state state) int index = cur_w + l.w*(cur_h + l.h*(k + b*l.c)); int valid = (cur_h >= 0 && cur_h < l.h && cur_w >= 0 && cur_w < l.w); - float val = (valid != 0) ? state.input[index] : -FLT_MAX; + float val = (valid != 0) ? net.input[index] : -FLT_MAX; max_i = (val > max) ? index : max_i; max = (val > max) ? val : max; } @@ -113,7 +113,7 @@ void forward_maxpool_layer(const maxpool_layer l, network_state state) } } -void backward_maxpool_layer(const maxpool_layer l, network_state state) +void backward_maxpool_layer(const maxpool_layer l, network net) { int i; int h = l.out_h; @@ -121,7 +121,7 @@ void backward_maxpool_layer(const maxpool_layer l, network_state state) int c = l.c; for(i = 0; i < h*w*c*l.batch; ++i){ int index = l.indexes[i]; - state.delta[index] += l.delta[i]; + net.delta[index] += l.delta[i]; } } diff --git a/src/maxpool_layer.h b/src/maxpool_layer.h index ce56dd88c7f..ceb5190716c 100644 --- a/src/maxpool_layer.h +++ b/src/maxpool_layer.h @@ -11,12 +11,12 @@ typedef layer maxpool_layer; image get_maxpool_image(maxpool_layer l); maxpool_layer make_maxpool_layer(int batch, int h, int w, int c, int size, int stride, int padding); void resize_maxpool_layer(maxpool_layer *l, int w, int h); -void forward_maxpool_layer(const maxpool_layer l, network_state state); -void backward_maxpool_layer(const maxpool_layer l, network_state state); +void forward_maxpool_layer(const maxpool_layer l, network net); +void backward_maxpool_layer(const maxpool_layer l, network net); #ifdef GPU -void forward_maxpool_layer_gpu(maxpool_layer l, network_state state); -void backward_maxpool_layer_gpu(maxpool_layer l, network_state state); +void forward_maxpool_layer_gpu(maxpool_layer l, network net); +void backward_maxpool_layer_gpu(maxpool_layer l, network net); #endif #endif diff --git a/src/maxpool_layer_kernels.cu b/src/maxpool_layer_kernels.cu index 6381cc1e9a5..3202e84b695 100644 --- a/src/maxpool_layer_kernels.cu +++ b/src/maxpool_layer_kernels.cu @@ -84,7 +84,7 @@ __global__ void backward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_ prev_delta[index] += d; } -extern "C" void forward_maxpool_layer_gpu(maxpool_layer layer, network_state state) +extern "C" void forward_maxpool_layer_gpu(maxpool_layer layer, network net) { int h = layer.out_h; int w = layer.out_w; @@ -92,15 +92,15 @@ extern "C" void forward_maxpool_layer_gpu(maxpool_layer layer, network_state sta size_t n = h*w*c*layer.batch; - forward_maxpool_layer_kernel<<>>(n, layer.h, layer.w, layer.c, layer.stride, layer.size, layer.pad, state.input, layer.output_gpu, layer.indexes_gpu); + forward_maxpool_layer_kernel<<>>(n, layer.h, layer.w, layer.c, layer.stride, layer.size, layer.pad, net.input_gpu, layer.output_gpu, layer.indexes_gpu); check_error(cudaPeekAtLastError()); } -extern "C" void backward_maxpool_layer_gpu(maxpool_layer layer, network_state state) +extern "C" void backward_maxpool_layer_gpu(maxpool_layer layer, network net) { size_t n = layer.h*layer.w*layer.c*layer.batch; - backward_maxpool_layer_kernel<<>>(n, layer.h, layer.w, layer.c, layer.stride, layer.size, layer.pad, layer.delta_gpu, state.delta, layer.indexes_gpu); + backward_maxpool_layer_kernel<<>>(n, layer.h, layer.w, layer.c, layer.stride, layer.size, layer.pad, layer.delta_gpu, net.delta_gpu, layer.indexes_gpu); check_error(cudaPeekAtLastError()); } diff --git a/src/network.c b/src/network.c index 0d30dd8cc6c..abf1b8aab70 100644 --- a/src/network.c +++ b/src/network.c @@ -164,26 +164,26 @@ network make_network(int n) net.n = n; net.layers = calloc(net.n, sizeof(layer)); net.seen = calloc(1, sizeof(int)); - #ifdef GPU - net.input_gpu = calloc(1, sizeof(float *)); - net.truth_gpu = calloc(1, sizeof(float *)); - #endif + net.cost = calloc(1, sizeof(float)); return net; } -void forward_network(network net, network_state state) +void forward_network(network net) { - state.workspace = net.workspace; int i; for(i = 0; i < net.n; ++i){ - state.index = i; + net.index = i; layer l = net.layers[i]; if(l.delta){ fill_cpu(l.outputs * l.batch, 0, l.delta, 1); } - l.forward(l, state); - state.input = l.output; + l.forward(l, net); + net.input = l.output; + if(l.truth) { + net.truth = l.output; + } } + calc_network_cost(net); } void update_network(network net) @@ -199,17 +199,7 @@ void update_network(network net) } } -float *get_network_output(network net) -{ -#ifdef GPU - if (gpu_index >= 0) return get_network_output_gpu(net); -#endif - int i; - for(i = net.n-1; i > 0; --i) if(net.layers[i].type != COST) break; - return net.layers[i].output; -} - -float get_network_cost(network net) +void calc_network_cost(network net) { int i; float sum = 0; @@ -220,54 +210,43 @@ float get_network_cost(network net) ++count; } } - return sum/count; + *net.cost = sum/count; } int get_predicted_class_network(network net) { - float *out = get_network_output(net); - int k = get_network_output_size(net); - return max_index(out, k); + return max_index(net.output, net.outputs); } -void backward_network(network net, network_state state) +void backward_network(network net) { int i; - float *original_input = state.input; - float *original_delta = state.delta; - state.workspace = net.workspace; + network orig = net; for(i = net.n-1; i >= 0; --i){ - state.index = i; + layer l = net.layers[i]; + if(l.stopbackward) break; if(i == 0){ - state.input = original_input; - state.delta = original_delta; + net = orig; }else{ layer prev = net.layers[i-1]; - state.input = prev.output; - state.delta = prev.delta; + net.input = prev.output; + net.delta = prev.delta; } - layer l = net.layers[i]; - if(l.stopbackward) break; - l.backward(l, state); + net.index = i; + l.backward(l, net); } } -float train_network_datum(network net, float *x, float *y) +float train_network_datum(network net) { #ifdef GPU - if(gpu_index >= 0) return train_network_datum_gpu(net, x, y); + if(gpu_index >= 0) return train_network_datum_gpu(net); #endif - network_state state; *net.seen += net.batch; - state.index = 0; - state.net = net; - state.input = x; - state.delta = 0; - state.truth = y; - state.train = 1; - forward_network(net, state); - backward_network(net, state); - float error = get_network_cost(net); + net.train = 1; + forward_network(net); + backward_network(net); + float error = *net.cost; if(((*net.seen)/net.batch)%net.subdivisions == 0) update_network(net); return error; } @@ -275,18 +254,14 @@ float train_network_datum(network net, float *x, float *y) float train_network_sgd(network net, data d, int n) { int batch = net.batch; - float *X = calloc(batch*d.X.cols, sizeof(float)); - float *y = calloc(batch*d.y.cols, sizeof(float)); int i; float sum = 0; for(i = 0; i < n; ++i){ - get_random_batch(d, batch, X, y); - float err = train_network_datum(net, X, y); + get_random_batch(d, batch, net.input, net.truth); + float err = train_network_datum(net); sum += err; } - free(X); - free(y); return (float)sum/(n*batch); } @@ -295,43 +270,14 @@ float train_network(network net, data d) assert(d.X.rows % net.batch == 0); int batch = net.batch; int n = d.X.rows / batch; - float *X = calloc(batch*d.X.cols, sizeof(float)); - float *y = calloc(batch*d.y.cols, sizeof(float)); int i; float sum = 0; for(i = 0; i < n; ++i){ - get_next_batch(d, batch, i*batch, X, y); - float err = train_network_datum(net, X, y); + get_next_batch(d, batch, i*batch, net.input, net.truth); + float err = train_network_datum(net); sum += err; } - free(X); - free(y); - return (float)sum/(n*batch); -} - - -float train_network_batch(network net, data d, int n) -{ - int i,j; - network_state state; - state.index = 0; - state.net = net; - state.train = 1; - state.delta = 0; - float sum = 0; - int batch = 2; - for(i = 0; i < n; ++i){ - for(j = 0; j < batch; ++j){ - int index = rand()%d.X.rows; - state.input = d.X.vals[index]; - state.truth = d.y.vals[index]; - forward_network(net, state); - backward_network(net, state); - sum += get_network_cost(net); - } - update_network(net); - } return (float)sum/(n*batch); } @@ -353,9 +299,7 @@ int resize_network(network *net, int w, int h) { #ifdef GPU cuda_set_device(net->gpu_index); - if(gpu_index >= 0){ - cuda_free(net->workspace); - } + cuda_free(net->workspace); #endif int i; //if(w == net->w && h == net->h) return 0; @@ -395,14 +339,22 @@ int resize_network(network *net, int w, int h) h = l.out_h; if(l.type == AVGPOOL) break; } + layer out = get_network_output_layer(*net); + net->inputs = net->layers[0].inputs; + net->outputs = out.outputs; + net->truths = out.outputs; + if(net->layers[net->n-1].truths) net->truths = net->layers[net->n-1].truths; + net->output = out.output; + free(net->input); + free(net->truth); + net->input = calloc(net->inputs*net->batch, sizeof(float)); + net->truth = calloc(net->truths*net->batch, sizeof(float)); #ifdef GPU if(gpu_index >= 0){ - if(net->input_gpu) { - cuda_free(*net->input_gpu); - *net->input_gpu = 0; - cuda_free(*net->truth_gpu); - *net->truth_gpu = 0; - } + cuda_free(net->input_gpu); + cuda_free(net->truth_gpu); + net->input_gpu = cuda_make_array(net->input, net->inputs*net->batch); + net->truth_gpu = cuda_make_array(net->truth, net->truths*net->batch); net->workspace = cuda_make_array(0, (workspace_size-1)/sizeof(float)+1); }else { free(net->workspace); @@ -416,18 +368,6 @@ int resize_network(network *net, int w, int h) return 0; } -int get_network_output_size(network net) -{ - int i; - for(i = net.n-1; i > 0; --i) if(net.layers[i].type != COST) break; - return net.layers[i].outputs; -} - -int get_network_input_size(network net) -{ - return net.layers[0].inputs; -} - detection_layer get_network_detection_layer(network net) { int i; @@ -444,9 +384,9 @@ detection_layer get_network_detection_layer(network net) image get_network_image_layer(network net, int i) { layer l = net.layers[i]; - #ifdef GPU - cuda_pull_array(l.output_gpu, l.output, l.outputs); - #endif +#ifdef GPU + cuda_pull_array(l.output_gpu, l.output, l.outputs); +#endif if (l.out_w && l.out_h && l.out_c){ return float_to_image(l.out_w, l.out_h, l.out_c, l.output); } @@ -481,9 +421,7 @@ void visualize_network(network net) void top_predictions(network net, int k, int *index) { - int size = get_network_output_size(net); - float *out = get_network_output(net); - top_k(out, size, k, index); + top_k(net.output, net.outputs, k, index); } @@ -492,23 +430,18 @@ float *network_predict(network net, float *input) #ifdef GPU if(gpu_index >= 0) return network_predict_gpu(net, input); #endif - - network_state state; - state.net = net; - state.index = 0; - state.input = input; - state.truth = 0; - state.train = 0; - state.delta = 0; - forward_network(net, state); - float *out = get_network_output(net); - return out; + net.input = input; + net.truth = 0; + net.train = 0; + net.delta = 0; + forward_network(net); + return net.output; } matrix network_predict_data_multi(network net, data test, int n) { int i,j,b,m; - int k = get_network_output_size(net); + int k = net.outputs; matrix pred = make_matrix(test.X.rows, k); float *X = calloc(net.batch*test.X.rows, sizeof(float)); for(i = 0; i < test.X.rows; i += net.batch){ @@ -533,7 +466,7 @@ matrix network_predict_data_multi(network net, data test, int n) matrix network_predict_data(network net, data test) { int i,j,b; - int k = get_network_output_size(net); + int k = net.outputs; matrix pred = make_matrix(test.X.rows, k); float *X = calloc(net.batch*test.X.cols, sizeof(float)); for(i = 0; i < test.X.rows; i += net.batch){ @@ -613,6 +546,15 @@ float *network_accuracies(network net, data d, int n) return acc; } +layer get_network_output_layer(network net) +{ + int i; + for(i = net.n - 1; i >= 0; --i){ + if(net.layers[i].type != COST) break; + } + return net.layers[i]; +} + float network_accuracy_multi(network net, data d, int n) { matrix guess = network_predict_data_multi(net, d, n); @@ -628,10 +570,38 @@ void free_network(network net) free_layer(net.layers[i]); } free(net.layers); + if(net.input) free(net.input); + if(net.truth) free(net.truth); #ifdef GPU - if(*net.input_gpu) cuda_free(*net.input_gpu); - if(*net.truth_gpu) cuda_free(*net.truth_gpu); - if(net.input_gpu) free(net.input_gpu); - if(net.truth_gpu) free(net.truth_gpu); + if(net.input_gpu) cuda_free(net.input_gpu); + if(net.truth_gpu) cuda_free(net.truth_gpu); #endif } + +// Some day... + + +layer network_output_layer(network net) +{ + int i; + for(i = net.n - 1; i >= 0; --i){ + if(net.layers[i].type != COST) break; + } + return net.layers[i]; +} + +int network_inputs(network net) +{ + return net.layers[0].inputs; +} + +int network_outputs(network net) +{ + return network_output_layer(net).outputs; +} + +float *network_output(network net) +{ + return network_output_layer(net).output; +} + diff --git a/src/network.h b/src/network.h index 20c75b61f6a..d27119ed82f 100644 --- a/src/network.h +++ b/src/network.h @@ -12,7 +12,6 @@ typedef enum { } learning_rate_policy; typedef struct network{ - float *workspace; int n; int batch; int *seen; @@ -21,7 +20,6 @@ typedef struct network{ float momentum; float decay; layer *layers; - int outputs; float *output; learning_rate_policy policy; @@ -43,6 +41,8 @@ typedef struct network{ float eps; int inputs; + int outputs; + int truths; int notruth; int h, w, c; int max_crop; @@ -56,32 +56,34 @@ typedef struct network{ int gpu_index; tree *hierarchy; - #ifdef GPU - float **input_gpu; - float **truth_gpu; - #endif -} network; -typedef struct network_state { - float *truth; + float *input; + float *truth; float *delta; float *workspace; int train; int index; - network net; -} network_state; + float *cost; + + #ifdef GPU + float *input_gpu; + float *truth_gpu; + float *delta_gpu; + float *output_gpu; + #endif + +} network; + #ifdef GPU float train_networks(network *nets, int n, data d, int interval); void sync_nets(network *nets, int n, int interval); -float train_network_datum_gpu(network net, float *x, float *y); +float train_network_datum_gpu(network net); float *network_predict_gpu(network net, float *input); -float * get_network_output_gpu_layer(network net, int i); -float * get_network_delta_gpu_layer(network net, int i); -float *get_network_output_gpu(network net); -void forward_network_gpu(network net, network_state state); -void backward_network_gpu(network net, network_state state); +void pull_network_output(network net); +void forward_network_gpu(network net); +void backward_network_gpu(network net); void update_network_gpu(network net); void harmless_update_network_gpu(network net); #endif @@ -93,14 +95,13 @@ void compare_networks(network n1, network n2, data d); char *get_layer_string(LAYER_TYPE a); network make_network(int n); -void forward_network(network net, network_state state); -void backward_network(network net, network_state state); +void forward_network(network net); +void backward_network(network net); void update_network(network net); float train_network(network net, data d); -float train_network_batch(network net, data d, int n); float train_network_sgd(network net, data d, int n); -float train_network_datum(network net, float *x, float *y); +float train_network_datum(network net); matrix network_predict_data(network net, data test); float *network_predict(network net, float *input); @@ -108,26 +109,17 @@ float network_accuracy(network net, data d); float *network_accuracies(network net, data d, int n); float network_accuracy_multi(network net, data d, int n); void top_predictions(network net, int n, int *index); -float *get_network_output(network net); -float *get_network_output_layer(network net, int i); -float *get_network_delta_layer(network net, int i); -float *get_network_delta(network net); -int get_network_output_size_layer(network net, int i); -int get_network_output_size(network net); image get_network_image(network net); image get_network_image_layer(network net, int i); +layer get_network_output_layer(network net); int get_predicted_class_network(network net); void print_network(network net); void visualize_network(network net); int resize_network(network *net, int w, int h); void set_batch_network(network *net, int b); -int get_network_input_size(network net); -float get_network_cost(network net); network load_network(char *cfg, char *weights, int clear); load_args get_base_args(network net); - -int get_network_nuisance(network net); -int get_network_background(network net); +void calc_network_cost(network net); #endif diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 4b9b499e82c..2fbc2dd47f2 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -35,46 +35,45 @@ extern "C" { #include "blas.h" } -float * get_network_output_gpu_layer(network net, int i); -float * get_network_delta_gpu_layer(network net, int i); -float * get_network_output_gpu(network net); - -void forward_network_gpu(network net, network_state state) +void forward_network_gpu(network net) { - state.workspace = net.workspace; int i; for(i = 0; i < net.n; ++i){ - state.index = i; + net.index = i; layer l = net.layers[i]; if(l.delta_gpu){ fill_ongpu(l.outputs * l.batch, 0, l.delta_gpu, 1); } - //if(l.c ==3 && i > 5) state.input = *net.input_gpu; - l.forward_gpu(l, state); - state.input = l.output_gpu; - if(l.truth) state.truth = l.output_gpu; + l.forward_gpu(l, net); + net.input_gpu = l.output_gpu; + net.input = l.output; + if(l.truth) { + net.truth_gpu = l.output_gpu; + net.truth = l.output; + } } + pull_network_output(net); + calc_network_cost(net); } -void backward_network_gpu(network net, network_state state) +void backward_network_gpu(network net) { - state.workspace = net.workspace; int i; - float * original_input = state.input; - float * original_delta = state.delta; + network orig = net; for(i = net.n-1; i >= 0; --i){ - state.index = i; layer l = net.layers[i]; if(l.stopbackward) break; if(i == 0){ - state.input = original_input; - state.delta = original_delta; + net = orig; }else{ layer prev = net.layers[i-1]; - state.input = prev.output_gpu; - state.delta = prev.delta_gpu; + net.input = prev.output; + net.delta = prev.delta; + net.input_gpu = prev.output_gpu; + net.delta_gpu = prev.delta_gpu; } - l.backward_gpu(l, state); + net.index = i; + l.backward_gpu(l, net); } } @@ -95,39 +94,30 @@ void update_network_gpu(network net) void harmless_update_network_gpu(network net) { - net.learning_rate = 0; - net.momentum = 1; - update_network_gpu(net); -} - -void forward_backward_network_gpu(network net, float *x, float *y) -{ - network_state state; - state.index = 0; - state.net = net; - int x_size = get_network_input_size(net)*net.batch; - int y_size = get_network_output_size(net)*net.batch; - if(net.layers[net.n-1].truths) y_size = net.layers[net.n-1].truths*net.batch; - if(!*net.input_gpu){ - *net.input_gpu = cuda_make_array(x, x_size); - if(!net.notruth) *net.truth_gpu = cuda_make_array(y, y_size); - }else{ - cuda_push_array(*net.input_gpu, x, x_size); - if(!net.notruth) cuda_push_array(*net.truth_gpu, y, y_size); + cuda_set_device(net.gpu_index); + int i; + for(i = 0; i < net.n; ++i){ + layer l = net.layers[i]; + if(l.weight_updates_gpu) fill_ongpu(l.nweights, 0, l.weight_updates_gpu, 1); + if(l.bias_updates_gpu) fill_ongpu(l.nbiases, 0, l.bias_updates_gpu, 1); + if(l.scale_updates_gpu) fill_ongpu(l.nbiases, 0, l.scale_updates_gpu, 1); } - state.input = *net.input_gpu; - state.delta = 0; - state.truth = *net.truth_gpu; - state.train = 1; - forward_network_gpu(net, state); - backward_network_gpu(net, state); } -float train_network_datum_gpu(network net, float *x, float *y) +float train_network_datum_gpu(network net) { *net.seen += net.batch; - forward_backward_network_gpu(net, x, y); - float error = get_network_cost(net); + + int x_size = net.inputs*net.batch; + int y_size = net.truths*net.batch; + cuda_push_array(net.input_gpu, net.input, x_size); + cuda_push_array(net.truth_gpu, net.truth, y_size); + + net.train = 1; + forward_network_gpu(net); + backward_network_gpu(net); + + float error = *net.cost; if (((*net.seen) / net.batch) % net.subdivisions == 0) update_network_gpu(net); return error; @@ -384,34 +374,19 @@ float train_networks(network *nets, int n, data d, int interval) return (float)sum/(n); } -float *get_network_output_layer_gpu(network net, int i) +void pull_network_output(network net) { - layer l = net.layers[i]; - if(l.type != REGION) cuda_pull_array(l.output_gpu, l.output, l.outputs*l.batch); - return l.output; -} - -float *get_network_output_gpu(network net) -{ - int i; - for(i = net.n-1; i > 0; --i) if(net.layers[i].type != COST) break; - return get_network_output_layer_gpu(net, i); + layer l = get_network_output_layer(net); + cuda_pull_array(l.output_gpu, l.output, l.outputs*l.batch); } float *network_predict_gpu(network net, float *input) { cuda_set_device(net.gpu_index); - int size = get_network_input_size(net) * net.batch; - network_state state; - state.index = 0; - state.net = net; - state.input = cuda_make_array(input, size); - state.truth = 0; - state.train = 0; - state.delta = 0; - forward_network_gpu(net, state); - float *out = get_network_output_gpu(net); - cuda_free(state.input); - return out; + cuda_push_array(net.input_gpu, input, net.inputs*net.batch); + net.truth = 0; + net.train = 0; + forward_network_gpu(net); + return net.output; } diff --git a/src/nightmare.c b/src/nightmare.c index 5d95416ca10..4bcf18775db 100644 --- a/src/nightmare.c +++ b/src/nightmare.c @@ -46,32 +46,29 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa image delta = make_image(im.w, im.h, im.c); - network_state state = {0}; - state.net = *net; - #ifdef GPU - state.input = cuda_make_array(im.data, im.w*im.h*im.c); - state.delta = cuda_make_array(im.data, im.w*im.h*im.c); + net->delta_gpu = cuda_make_array(delta.data, im.w*im.h*im.c); + cuda_push_array(net->input_gpu, im.data, net->inputs); - forward_network_gpu(*net, state); + forward_network_gpu(*net); copy_ongpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1); cuda_pull_array(last.delta_gpu, last.delta, last.outputs); calculate_loss(last.delta, last.delta, last.outputs, thresh); cuda_push_array(last.delta_gpu, last.delta, last.outputs); - backward_network_gpu(*net, state); + backward_network_gpu(*net); - cuda_pull_array(state.delta, delta.data, im.w*im.h*im.c); - cuda_free(state.input); - cuda_free(state.delta); + cuda_pull_array(net->delta_gpu, delta.data, im.w*im.h*im.c); + cuda_free(net->delta_gpu); + net->delta_gpu = 0; #else - state.input = im.data; - state.delta = delta.data; - forward_network(*net, state); + net->input = im.data; + net->delta = delta.data; + forward_network(*net); copy_cpu(last.outputs, last.output, 1, last.delta, 1); calculate_loss(last.output, last.delta, last.outputs, thresh); - backward_network(*net, state); + backward_network(*net); #endif if(flip) flip_image(delta); @@ -134,31 +131,30 @@ void smooth(image recon, image update, float lambda, int num) void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters) { int iter = 0; + layer l = get_network_output_layer(net); for (iter = 0; iter < iters; ++iter) { image delta = make_image(recon.w, recon.h, recon.c); - network_state state = {0}; - state.net = net; #ifdef GPU - state.input = cuda_make_array(recon.data, recon.w*recon.h*recon.c); - state.delta = cuda_make_array(delta.data, delta.w*delta.h*delta.c); - state.truth = cuda_make_array(features, get_network_output_size(net)); + cuda_push_array(net.input_gpu, recon.data, recon.w*recon.h*recon.c); + cuda_push_array(net.truth_gpu, features, net.truths); + net.delta_gpu = cuda_make_array(delta.data, delta.w*delta.h*delta.c); - forward_network_gpu(net, state); - backward_network_gpu(net, state); + forward_network_gpu(net); + copy_ongpu(l.outputs, net.truth_gpu, 1, l.delta_gpu, 1); + axpy_ongpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1); + backward_network_gpu(net); - cuda_pull_array(state.delta, delta.data, delta.w*delta.h*delta.c); + cuda_pull_array(net.delta_gpu, delta.data, delta.w*delta.h*delta.c); - cuda_free(state.input); - cuda_free(state.delta); - cuda_free(state.truth); + cuda_free(net.delta_gpu); #else - state.input = recon.data; - state.delta = delta.data; - state.truth = features; + net.input = recon.data; + net.delta = delta.data; + net.truth = features; - forward_network(net, state); - backward_network(net, state); + forward_network(net); + backward_network(net); #endif axpy_cpu(recon.w*recon.h*recon.c, 1, delta.data, 1, update.data, 1); @@ -328,11 +324,12 @@ void run_nightmare(int argc, char **argv) free_image(im); im = resized; } - im = letterbox_image(im, net.w, net.h); + //im = letterbox_image(im, net.w, net.h); float *features = 0; image update; if (reconstruct){ + net.n = max_layer; resize_network(&net, im.w, im.h); int zz = 0; diff --git a/src/normalization_layer.c b/src/normalization_layer.c index 069a0792490..2be0d06922f 100644 --- a/src/normalization_layer.c +++ b/src/normalization_layer.c @@ -62,7 +62,7 @@ void resize_normalization_layer(layer *layer, int w, int h) #endif } -void forward_normalization_layer(const layer layer, network_state state) +void forward_normalization_layer(const layer layer, network net) { int k,b; int w = layer.w; @@ -73,7 +73,7 @@ void forward_normalization_layer(const layer layer, network_state state) for(b = 0; b < layer.batch; ++b){ float *squared = layer.squared + w*h*c*b; float *norms = layer.norms + w*h*c*b; - float *input = state.input + w*h*c*b; + float *input = net.input + w*h*c*b; pow_cpu(w*h*c, 2, input, 1, squared, 1); const_cpu(w*h, layer.kappa, norms, 1); @@ -90,10 +90,10 @@ void forward_normalization_layer(const layer layer, network_state state) } } pow_cpu(w*h*c*layer.batch, -layer.beta, layer.norms, 1, layer.output, 1); - mul_cpu(w*h*c*layer.batch, state.input, 1, layer.output, 1); + mul_cpu(w*h*c*layer.batch, net.input, 1, layer.output, 1); } -void backward_normalization_layer(const layer layer, network_state state) +void backward_normalization_layer(const layer layer, network net) { // TODO This is approximate ;-) // Also this should add in to delta instead of overwritting. @@ -101,12 +101,12 @@ void backward_normalization_layer(const layer layer, network_state state) int w = layer.w; int h = layer.h; int c = layer.c; - pow_cpu(w*h*c*layer.batch, -layer.beta, layer.norms, 1, state.delta, 1); - mul_cpu(w*h*c*layer.batch, layer.delta, 1, state.delta, 1); + pow_cpu(w*h*c*layer.batch, -layer.beta, layer.norms, 1, net.delta, 1); + mul_cpu(w*h*c*layer.batch, layer.delta, 1, net.delta, 1); } #ifdef GPU -void forward_normalization_layer_gpu(const layer layer, network_state state) +void forward_normalization_layer_gpu(const layer layer, network net) { int k,b; int w = layer.w; @@ -117,7 +117,7 @@ void forward_normalization_layer_gpu(const layer layer, network_state state) for(b = 0; b < layer.batch; ++b){ float *squared = layer.squared_gpu + w*h*c*b; float *norms = layer.norms_gpu + w*h*c*b; - float *input = state.input + w*h*c*b; + float *input = net.input_gpu + w*h*c*b; pow_ongpu(w*h*c, 2, input, 1, squared, 1); const_ongpu(w*h, layer.kappa, norms, 1); @@ -134,17 +134,17 @@ void forward_normalization_layer_gpu(const layer layer, network_state state) } } pow_ongpu(w*h*c*layer.batch, -layer.beta, layer.norms_gpu, 1, layer.output_gpu, 1); - mul_ongpu(w*h*c*layer.batch, state.input, 1, layer.output_gpu, 1); + mul_ongpu(w*h*c*layer.batch, net.input_gpu, 1, layer.output_gpu, 1); } -void backward_normalization_layer_gpu(const layer layer, network_state state) +void backward_normalization_layer_gpu(const layer layer, network net) { // TODO This is approximate ;-) int w = layer.w; int h = layer.h; int c = layer.c; - pow_ongpu(w*h*c*layer.batch, -layer.beta, layer.norms_gpu, 1, state.delta, 1); - mul_ongpu(w*h*c*layer.batch, layer.delta_gpu, 1, state.delta, 1); + pow_ongpu(w*h*c*layer.batch, -layer.beta, layer.norms_gpu, 1, net.delta_gpu, 1); + mul_ongpu(w*h*c*layer.batch, layer.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/normalization_layer.h b/src/normalization_layer.h index ab327764443..665baa50662 100644 --- a/src/normalization_layer.h +++ b/src/normalization_layer.h @@ -7,13 +7,13 @@ layer make_normalization_layer(int batch, int w, int h, int c, int size, float alpha, float beta, float kappa); void resize_normalization_layer(layer *layer, int h, int w); -void forward_normalization_layer(const layer layer, network_state state); -void backward_normalization_layer(const layer layer, network_state state); +void forward_normalization_layer(const layer layer, network net); +void backward_normalization_layer(const layer layer, network net); void visualize_normalization_layer(layer layer, char *window); #ifdef GPU -void forward_normalization_layer_gpu(const layer layer, network_state state); -void backward_normalization_layer_gpu(const layer layer, network_state state); +void forward_normalization_layer_gpu(const layer layer, network net); +void backward_normalization_layer_gpu(const layer layer, network net); #endif #endif diff --git a/src/parser.c b/src/parser.c index c89d98de58d..2c03c7f55ff 100644 --- a/src/parser.c +++ b/src/parser.c @@ -154,8 +154,11 @@ layer parse_deconvolutional(list *options, size_params params) batch=params.batch; if(!(h && w && c)) error("Layer before deconvolutional layer must output image."); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); + int pad = option_find_int_quiet(options, "pad",0); + int padding = option_find_int_quiet(options, "padding",0); + if(pad) padding = size/2; - layer l = make_deconvolutional_layer(batch,h,w,c,n,size,stride,activation, batch_normalize); + layer l = make_deconvolutional_layer(batch,h,w,c,n,size,stride,padding, activation, batch_normalize, params.net.adam); return l; } @@ -546,7 +549,7 @@ void parse_net_options(list *options, network *net) if(net->adam){ net->B1 = option_find_float(options, "B1", .9); net->B2 = option_find_float(options, "B2", .999); - net->eps = option_find_float(options, "eps", .000001); + net->eps = option_find_float(options, "eps", .00000001); } net->h = option_find_int_quiet(options, "height",0); @@ -718,8 +721,18 @@ network parse_network_cfg(char *filename) } } free_list(sections); - net.outputs = get_network_output_size(net); - net.output = get_network_output(net); + layer out = get_network_output_layer(net); + net.outputs = out.outputs; + net.truths = out.outputs; + if(net.layers[net.n-1].truths) net.truths = net.layers[net.n-1].truths; + net.output = out.output; + net.input = calloc(net.inputs*net.batch, sizeof(float)); + net.truth = calloc(net.truths*net.batch, sizeof(float)); +#ifdef GPU + net.output_gpu = out.output_gpu; + net.input_gpu = cuda_make_array(net.input, net.inputs*net.batch); + net.truth_gpu = cuda_make_array(net.truth, net.truths*net.batch); +#endif if(workspace_size){ //printf("%ld\n", workspace_size); #ifdef GPU diff --git a/src/region_layer.c b/src/region_layer.c index 7b57e60921d..99c54a951c4 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -142,10 +142,10 @@ int entry_index(layer l, int batch, int location, int entry) } void softmax_tree(float *input, int batch, int inputs, float temp, tree *hierarchy, float *output); -void forward_region_layer(const layer l, network_state state) +void forward_region_layer(const layer l, network net) { int i,j,b,t,n; - memcpy(l.output, state.input, l.outputs*l.batch*sizeof(float)); + memcpy(l.output, net.input, l.outputs*l.batch*sizeof(float)); #ifndef GPU for (b = 0; b < l.batch; ++b){ @@ -161,17 +161,17 @@ void forward_region_layer(const layer l, network_state state) int count = 5; for (i = 0; i < l.softmax_tree->groups; ++i) { int group_size = l.softmax_tree->group_size[i]; - softmax_cpu(state.input + count, group_size, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + count); + softmax_cpu(net.input + count, group_size, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + count); count += group_size; } } else if (l.softmax){ int index = entry_index(l, 0, 0, 5); - softmax_cpu(state.input + index, l.classes, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output + index); + softmax_cpu(net.input + index, l.classes, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output + index); } #endif memset(l.delta, 0, l.outputs * l.batch * sizeof(float)); - if(!state.train) return; + if(!net.train) return; float avg_iou = 0; float recall = 0; float avg_cat = 0; @@ -184,9 +184,9 @@ void forward_region_layer(const layer l, network_state state) if(l.softmax_tree){ int onlyclass = 0; for(t = 0; t < 30; ++t){ - box truth = float_to_box(state.truth + t*5 + b*l.truths, 1); + box truth = float_to_box(net.truth + t*5 + b*l.truths, 1); if(!truth.x) break; - int class = state.truth[t*5 + b*l.truths + 4]; + int class = net.truth[t*5 + b*l.truths + 4]; float maxp = 0; int maxi = 0; if(truth.x > 100000 && truth.y > 100000){ @@ -220,7 +220,7 @@ void forward_region_layer(const layer l, network_state state) box pred = get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); float best_iou = 0; for(t = 0; t < 30; ++t){ - box truth = float_to_box(state.truth + t*5 + b*l.truths, 1); + box truth = float_to_box(net.truth + t*5 + b*l.truths, 1); if(!truth.x) break; float iou = box_iou(pred, truth); if (iou > best_iou) { @@ -234,7 +234,7 @@ void forward_region_layer(const layer l, network_state state) l.delta[obj_index] = 0; } - if(*(state.net.seen) < 12800){ + if(*(net.seen) < 12800){ box truth = {0}; truth.x = (i + .5)/l.w; truth.y = (j + .5)/l.h; @@ -246,7 +246,7 @@ void forward_region_layer(const layer l, network_state state) } } for(t = 0; t < 30; ++t){ - box truth = float_to_box(state.truth + t*5 + b*l.truths, 1); + box truth = float_to_box(net.truth + t*5 + b*l.truths, 1); if(!truth.x) break; float best_iou = 0; @@ -289,7 +289,7 @@ void forward_region_layer(const layer l, network_state state) l.delta[obj_index] = l.object_scale * (iou - l.output[obj_index]); } - int class = state.truth[t*5 + b*l.truths + 4]; + int class = net.truth[t*5 + b*l.truths + 4]; if (l.map) class = l.map[class]; int class_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 5); delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); @@ -302,7 +302,7 @@ void forward_region_layer(const layer l, network_state state) printf("Region Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\n", avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, count); } -void backward_region_layer(const layer l, network_state state) +void backward_region_layer(const layer l, network net) { /* int b; @@ -311,11 +311,11 @@ void backward_region_layer(const layer l, network_state state) int index = (b*size + 4)*l.w*l.h; gradient_array(l.output + index, l.w*l.h, LOGISTIC, l.delta + index); } - axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, state.delta, 1); + axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, net.delta, 1); */ } -void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh) +void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int nomult) { int i,j,n,z; float *predictions = l.output; @@ -358,10 +358,12 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b boxes[index].w *= (float)max/w; boxes[index].h *= (float)max/h; } - boxes[index].x *= w; - boxes[index].y *= h; - boxes[index].w *= w; - boxes[index].h *= h; + if(!nomult){ + boxes[index].x *= w; + boxes[index].y *= h; + boxes[index].w *= w; + boxes[index].h *= h; + } int class_index = entry_index(l, 0, n*l.w*l.h + i, 5); if(l.softmax_tree){ @@ -383,6 +385,9 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b int class_index = entry_index(l, 0, n*l.w*l.h + i, 5 + j); float prob = scale*predictions[class_index]; probs[index][j] = (prob > thresh) ? prob : 0; + // TODO REMOVE + // if (j != 15 && j != 16) probs[index][j] = 0; + // if (j != 0) probs[index][j] = 0; } } if(only_objectness){ @@ -394,9 +399,9 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b #ifdef GPU -void forward_region_layer_gpu(const layer l, network_state state) +void forward_region_layer_gpu(const layer l, network net) { - copy_ongpu(l.batch*l.inputs, state.input, 1, l.output_gpu, 1); + copy_ongpu(l.batch*l.inputs, net.input_gpu, 1, l.output_gpu, 1); int b, n; for (b = 0; b < l.batch; ++b){ for(n = 0; n < l.n; ++n){ @@ -412,40 +417,33 @@ void forward_region_layer_gpu(const layer l, network_state state) for (i = 0; i < l.softmax_tree->groups; ++i) { int group_size = l.softmax_tree->group_size[i]; int index = entry_index(l, 0, 0, count); - softmax_gpu(state.input + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); + softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); count += group_size; } } else if (l.softmax) { int index = entry_index(l, 0, 0, 5); //printf("%d\n", index); - softmax_gpu(state.input + index, l.classes, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); + softmax_gpu(net.input_gpu + index, l.classes, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); } - if(!state.train || l.onlyforward){ + if(!net.train || l.onlyforward){ cuda_pull_array(l.output_gpu, l.output, l.batch*l.outputs); return; } - float *in_cpu = calloc(l.batch*l.inputs, sizeof(float)); float *truth_cpu = 0; - if(state.truth){ + if(net.truth_gpu){ int num_truth = l.batch*l.truths; truth_cpu = calloc(num_truth, sizeof(float)); - cuda_pull_array(state.truth, truth_cpu, num_truth); + cuda_pull_array(net.truth_gpu, truth_cpu, num_truth); } - cuda_pull_array(l.output_gpu, in_cpu, l.batch*l.inputs); - network_state cpu_state = state; - cpu_state.train = state.train; - cpu_state.truth = truth_cpu; - cpu_state.input = in_cpu; - forward_region_layer(l, cpu_state); + cuda_pull_array(l.output_gpu, net.input, l.batch*l.inputs); + forward_region_layer(l, net); //cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); - free(cpu_state.input); - if(!state.train) return; + if(!net.train) return; cuda_push_array(l.delta_gpu, l.delta, l.batch*l.outputs); - if(cpu_state.truth) free(cpu_state.truth); } -void backward_region_layer_gpu(const layer l, network_state state) +void backward_region_layer_gpu(const layer l, network net) { int b, n; for (b = 0; b < l.batch; ++b){ @@ -456,7 +454,7 @@ void backward_region_layer_gpu(const layer l, network_state state) gradient_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); } } - axpy_ongpu(l.batch*l.inputs, 1, l.delta_gpu, 1, state.delta, 1); + axpy_ongpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/region_layer.h b/src/region_layer.h index 9a3b7cd3f57..6375445f77c 100644 --- a/src/region_layer.h +++ b/src/region_layer.h @@ -5,14 +5,14 @@ #include "network.h" layer make_region_layer(int batch, int h, int w, int n, int classes, int coords); -void forward_region_layer(const layer l, network_state state); -void backward_region_layer(const layer l, network_state state); -void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh); +void forward_region_layer(const layer l, network net); +void backward_region_layer(const layer l, network net); +void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int nomult); void resize_region_layer(layer *l, int w, int h); #ifdef GPU -void forward_region_layer_gpu(const layer l, network_state state); -void backward_region_layer_gpu(layer l, network_state state); +void forward_region_layer_gpu(const layer l, network net); +void backward_region_layer_gpu(layer l, network net); #endif #endif diff --git a/src/reorg_layer.c b/src/reorg_layer.c index 29ccc0e5fbf..405a4266511 100644 --- a/src/reorg_layer.c +++ b/src/reorg_layer.c @@ -87,11 +87,11 @@ void resize_reorg_layer(layer *l, int w, int h) #endif } -void forward_reorg_layer(const layer l, network_state state) +void forward_reorg_layer(const layer l, network net) { int i; if(l.flatten){ - memcpy(l.output, state.input, l.outputs*l.batch*sizeof(float)); + memcpy(l.output, net.input, l.outputs*l.batch*sizeof(float)); if(l.reverse){ flatten(l.output, l.w*l.h, l.c, l.batch, 0); }else{ @@ -99,74 +99,74 @@ void forward_reorg_layer(const layer l, network_state state) } } else if (l.extra) { for(i = 0; i < l.batch; ++i){ - copy_cpu(l.inputs, state.input + i*l.inputs, 1, l.output + i*l.outputs, 1); + copy_cpu(l.inputs, net.input + i*l.inputs, 1, l.output + i*l.outputs, 1); } } else if (l.reverse){ - reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output); + reorg_cpu(net.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output); } else { - reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output); + reorg_cpu(net.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output); } } -void backward_reorg_layer(const layer l, network_state state) +void backward_reorg_layer(const layer l, network net) { int i; if(l.flatten){ - memcpy(state.delta, l.delta, l.outputs*l.batch*sizeof(float)); + memcpy(net.delta, l.delta, l.outputs*l.batch*sizeof(float)); if(l.reverse){ - flatten(state.delta, l.w*l.h, l.c, l.batch, 1); + flatten(net.delta, l.w*l.h, l.c, l.batch, 1); }else{ - flatten(state.delta, l.w*l.h, l.c, l.batch, 0); + flatten(net.delta, l.w*l.h, l.c, l.batch, 0); } } else if(l.reverse){ - reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); + reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 0, net.delta); } else if (l.extra) { for(i = 0; i < l.batch; ++i){ - copy_cpu(l.inputs, l.delta + i*l.outputs, 1, state.delta + i*l.inputs, 1); + copy_cpu(l.inputs, l.delta + i*l.outputs, 1, net.delta + i*l.inputs, 1); } }else{ - reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); + reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 1, net.delta); } } #ifdef GPU -void forward_reorg_layer_gpu(layer l, network_state state) +void forward_reorg_layer_gpu(layer l, network net) { int i; if(l.flatten){ if(l.reverse){ - flatten_ongpu(state.input, l.w*l.h, l.c, l.batch, 0, l.output_gpu); + flatten_ongpu(net.input_gpu, l.w*l.h, l.c, l.batch, 0, l.output_gpu); }else{ - flatten_ongpu(state.input, l.w*l.h, l.c, l.batch, 1, l.output_gpu); + flatten_ongpu(net.input_gpu, l.w*l.h, l.c, l.batch, 1, l.output_gpu); } } else if (l.extra) { for(i = 0; i < l.batch; ++i){ - copy_ongpu(l.inputs, state.input + i*l.inputs, 1, l.output_gpu + i*l.outputs, 1); + copy_ongpu(l.inputs, net.input_gpu + i*l.inputs, 1, l.output_gpu + i*l.outputs, 1); } } else if (l.reverse) { - reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); + reorg_ongpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); }else { - reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output_gpu); + reorg_ongpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, l.output_gpu); } } -void backward_reorg_layer_gpu(layer l, network_state state) +void backward_reorg_layer_gpu(layer l, network net) { if(l.flatten){ if(l.reverse){ - flatten_ongpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 1, state.delta); + flatten_ongpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 1, net.delta_gpu); }else{ - flatten_ongpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 0, state.delta); + flatten_ongpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 0, net.delta_gpu); } } else if (l.extra) { int i; for(i = 0; i < l.batch; ++i){ - copy_ongpu(l.inputs, l.delta_gpu + i*l.outputs, 1, state.delta + i*l.inputs, 1); + copy_ongpu(l.inputs, l.delta_gpu + i*l.outputs, 1, net.delta_gpu + i*l.inputs, 1); } } else if(l.reverse){ - reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); + reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, net.delta_gpu); } else { - reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); + reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, net.delta_gpu); } } #endif diff --git a/src/reorg_layer.h b/src/reorg_layer.h index 6b9c3040e54..e6513a5f441 100644 --- a/src/reorg_layer.h +++ b/src/reorg_layer.h @@ -8,12 +8,12 @@ layer make_reorg_layer(int batch, int w, int h, int c, int stride, int reverse, int flatten, int extra); void resize_reorg_layer(layer *l, int w, int h); -void forward_reorg_layer(const layer l, network_state state); -void backward_reorg_layer(const layer l, network_state state); +void forward_reorg_layer(const layer l, network net); +void backward_reorg_layer(const layer l, network net); #ifdef GPU -void forward_reorg_layer_gpu(layer l, network_state state); -void backward_reorg_layer_gpu(layer l, network_state state); +void forward_reorg_layer_gpu(layer l, network net); +void backward_reorg_layer_gpu(layer l, network net); #endif #endif diff --git a/src/rnn.c b/src/rnn.c index ccfdc55d557..62d7d8d1aa2 100644 --- a/src/rnn.c +++ b/src/rnn.c @@ -151,7 +151,7 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, load_weights(&net, weightfile); } - int inputs = get_network_input_size(net); + int inputs = net.inputs; fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); int batch = net.batch; int steps = net.time_steps; @@ -176,7 +176,9 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, p = get_rnn_data(text, offsets, inputs, size, streams, steps); } - float loss = train_network_datum(net, p.x, p.y) / (batch); + memcpy(net.input, p.x, net.inputs*net.batch); + memcpy(net.truth, p.y, net.truths*net.batch); + float loss = train_network_datum(net) / (batch); free(p.x); free(p.y); if (avg_loss < 0) avg_loss = loss; @@ -234,7 +236,7 @@ void test_char_rnn(char *cfgfile, char *weightfile, int num, char *seed, float t if(weightfile){ load_weights(&net, weightfile); } - int inputs = get_network_input_size(net); + int inputs = net.inputs; int i, j; for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp; @@ -291,7 +293,7 @@ void test_tactic_rnn(char *cfgfile, char *weightfile, int num, float temp, int r if(weightfile){ load_weights(&net, weightfile); } - int inputs = get_network_input_size(net); + int inputs = net.inputs; int i, j; for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp; @@ -329,7 +331,7 @@ void valid_tactic_rnn(char *cfgfile, char *weightfile, char *seed) if(weightfile){ load_weights(&net, weightfile); } - int inputs = get_network_input_size(net); + int inputs = net.inputs; int count = 0; int words = 1; @@ -381,7 +383,7 @@ void valid_char_rnn(char *cfgfile, char *weightfile, char *seed) if(weightfile){ load_weights(&net, weightfile); } - int inputs = get_network_input_size(net); + int inputs = net.inputs; int count = 0; int words = 1; @@ -422,7 +424,7 @@ void vec_char_rnn(char *cfgfile, char *weightfile, char *seed) if(weightfile){ load_weights(&net, weightfile); } - int inputs = get_network_input_size(net); + int inputs = net.inputs; int c; int seed_len = strlen(seed); diff --git a/src/rnn_layer.c b/src/rnn_layer.c index 83fda13e6fe..fb4f108434e 100644 --- a/src/rnn_layer.c +++ b/src/rnn_layer.c @@ -80,10 +80,10 @@ void update_rnn_layer(layer l, int batch, float learning_rate, float momentum, f update_connected_layer(*(l.output_layer), batch, learning_rate, momentum, decay); } -void forward_rnn_layer(layer l, network_state state) +void forward_rnn_layer(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); @@ -92,17 +92,17 @@ void forward_rnn_layer(layer l, network_state state) fill_cpu(l.outputs * l.batch * l.steps, 0, output_layer.delta, 1); fill_cpu(l.hidden * l.batch * l.steps, 0, self_layer.delta, 1); fill_cpu(l.hidden * l.batch * l.steps, 0, input_layer.delta, 1); - if(state.train) fill_cpu(l.hidden * l.batch, 0, l.state, 1); + if(net.train) fill_cpu(l.hidden * l.batch, 0, l.state, 1); for (i = 0; i < l.steps; ++i) { - s.input = state.input; + s.input = net.input; forward_connected_layer(input_layer, s); s.input = l.state; forward_connected_layer(self_layer, s); float *old_state = l.state; - if(state.train) l.state += l.hidden*l.batch; + if(net.train) l.state += l.hidden*l.batch; if(l.shortcut){ copy_cpu(l.hidden * l.batch, old_state, 1, l.state, 1); }else{ @@ -114,17 +114,17 @@ void forward_rnn_layer(layer l, network_state state) s.input = l.state; forward_connected_layer(output_layer, s); - state.input += l.inputs*l.batch; + net.input += l.inputs*l.batch; increment_layer(&input_layer, 1); increment_layer(&self_layer, 1); increment_layer(&output_layer, 1); } } -void backward_rnn_layer(layer l, network_state state) +void backward_rnn_layer(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); @@ -160,8 +160,8 @@ void backward_rnn_layer(layer l, network_state state) copy_cpu(l.hidden*l.batch, self_layer.delta, 1, input_layer.delta, 1); if (i > 0 && l.shortcut) axpy_cpu(l.hidden*l.batch, 1, self_layer.delta, 1, self_layer.delta - l.hidden*l.batch, 1); - s.input = state.input + i*l.inputs*l.batch; - if(state.delta) s.delta = state.delta + i*l.inputs*l.batch; + s.input = net.input + i*l.inputs*l.batch; + if(net.delta) s.delta = net.delta + i*l.inputs*l.batch; else s.delta = 0; backward_connected_layer(input_layer, s); @@ -194,10 +194,10 @@ void update_rnn_layer_gpu(layer l, int batch, float learning_rate, float momentu update_connected_layer_gpu(*(l.output_layer), batch, learning_rate, momentum, decay); } -void forward_rnn_layer_gpu(layer l, network_state state) +void forward_rnn_layer_gpu(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); @@ -206,17 +206,17 @@ void forward_rnn_layer_gpu(layer l, network_state state) fill_ongpu(l.outputs * l.batch * l.steps, 0, output_layer.delta_gpu, 1); fill_ongpu(l.hidden * l.batch * l.steps, 0, self_layer.delta_gpu, 1); fill_ongpu(l.hidden * l.batch * l.steps, 0, input_layer.delta_gpu, 1); - if(state.train) fill_ongpu(l.hidden * l.batch, 0, l.state_gpu, 1); + if(net.train) fill_ongpu(l.hidden * l.batch, 0, l.state_gpu, 1); for (i = 0; i < l.steps; ++i) { - s.input = state.input; + s.input_gpu = net.input_gpu; forward_connected_layer_gpu(input_layer, s); - s.input = l.state_gpu; + s.input_gpu = l.state_gpu; forward_connected_layer_gpu(self_layer, s); float *old_state = l.state_gpu; - if(state.train) l.state_gpu += l.hidden*l.batch; + if(net.train) l.state_gpu += l.hidden*l.batch; if(l.shortcut){ copy_ongpu(l.hidden * l.batch, old_state, 1, l.state_gpu, 1); }else{ @@ -225,20 +225,20 @@ void forward_rnn_layer_gpu(layer l, network_state state) axpy_ongpu(l.hidden * l.batch, 1, input_layer.output_gpu, 1, l.state_gpu, 1); axpy_ongpu(l.hidden * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); - s.input = l.state_gpu; + s.input_gpu = l.state_gpu; forward_connected_layer_gpu(output_layer, s); - state.input += l.inputs*l.batch; + net.input_gpu += l.inputs*l.batch; increment_layer(&input_layer, 1); increment_layer(&self_layer, 1); increment_layer(&output_layer, 1); } } -void backward_rnn_layer_gpu(layer l, network_state state) +void backward_rnn_layer_gpu(layer l, network net) { - network_state s = {0}; - s.train = state.train; + network s = net; + s.train = net.train; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); @@ -249,24 +249,24 @@ void backward_rnn_layer_gpu(layer l, network_state state) l.state_gpu += l.hidden*l.batch*l.steps; for (i = l.steps-1; i >= 0; --i) { - s.input = l.state_gpu; - s.delta = self_layer.delta_gpu; + s.input_gpu = l.state_gpu; + s.delta_gpu = self_layer.delta_gpu; backward_connected_layer_gpu(output_layer, s); l.state_gpu -= l.hidden*l.batch; copy_ongpu(l.hidden*l.batch, self_layer.delta_gpu, 1, input_layer.delta_gpu, 1); - s.input = l.state_gpu; - s.delta = self_layer.delta_gpu - l.hidden*l.batch; - if (i == 0) s.delta = 0; + s.input_gpu = l.state_gpu; + s.delta_gpu = self_layer.delta_gpu - l.hidden*l.batch; + if (i == 0) s.delta_gpu = 0; backward_connected_layer_gpu(self_layer, s); //copy_ongpu(l.hidden*l.batch, self_layer.delta_gpu, 1, input_layer.delta_gpu, 1); if (i > 0 && l.shortcut) axpy_ongpu(l.hidden*l.batch, 1, self_layer.delta_gpu, 1, self_layer.delta_gpu - l.hidden*l.batch, 1); - s.input = state.input + i*l.inputs*l.batch; - if(state.delta) s.delta = state.delta + i*l.inputs*l.batch; - else s.delta = 0; + s.input_gpu = net.input_gpu + i*l.inputs*l.batch; + if(net.delta_gpu) s.delta_gpu = net.delta_gpu + i*l.inputs*l.batch; + else s.delta_gpu = 0; backward_connected_layer_gpu(input_layer, s); increment_layer(&input_layer, -1); diff --git a/src/rnn_layer.h b/src/rnn_layer.h index bb9478b9e26..782a90ef5c0 100644 --- a/src/rnn_layer.h +++ b/src/rnn_layer.h @@ -9,13 +9,13 @@ layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, ACTIVATION activation, int batch_normalize, int log); -void forward_rnn_layer(layer l, network_state state); -void backward_rnn_layer(layer l, network_state state); +void forward_rnn_layer(layer l, network net); +void backward_rnn_layer(layer l, network net); void update_rnn_layer(layer l, int batch, float learning_rate, float momentum, float decay); #ifdef GPU -void forward_rnn_layer_gpu(layer l, network_state state); -void backward_rnn_layer_gpu(layer l, network_state state); +void forward_rnn_layer_gpu(layer l, network net); +void backward_rnn_layer_gpu(layer l, network net); void update_rnn_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); void push_rnn_layer(layer l); void pull_rnn_layer(layer l); diff --git a/src/rnn_vid.c b/src/rnn_vid.c index 1e2264e019e..3042173f79c 100644 --- a/src/rnn_vid.c +++ b/src/rnn_vid.c @@ -103,7 +103,9 @@ void train_vid_rnn(char *cfgfile, char *weightfile) time=clock(); float_pair p = get_rnn_vid_data(extractor, paths, N, batch, steps); - float loss = train_network_datum(net, p.x, p.y) / (net.batch); + memcpy(net.input, p.x, net.inputs*net.batch); + memcpy(net.truth, p.y, net.truths*net.batch); + float loss = train_network_datum(net) / (net.batch); free(p.x); diff --git a/src/route_layer.c b/src/route_layer.c index dce71180c1f..722676892e4 100644 --- a/src/route_layer.c +++ b/src/route_layer.c @@ -70,13 +70,13 @@ void resize_route_layer(route_layer *l, network *net) } -void forward_route_layer(const route_layer l, network_state state) +void forward_route_layer(const route_layer l, network net) { int i, j; int offset = 0; for(i = 0; i < l.n; ++i){ int index = l.input_layers[i]; - float *input = state.net.layers[index].output; + float *input = net.layers[index].output; int input_size = l.input_sizes[i]; for(j = 0; j < l.batch; ++j){ copy_cpu(input_size, input + j*input_size, 1, l.output + offset + j*l.outputs, 1); @@ -85,13 +85,13 @@ void forward_route_layer(const route_layer l, network_state state) } } -void backward_route_layer(const route_layer l, network_state state) +void backward_route_layer(const route_layer l, network net) { int i, j; int offset = 0; for(i = 0; i < l.n; ++i){ int index = l.input_layers[i]; - float *delta = state.net.layers[index].delta; + float *delta = net.layers[index].delta; int input_size = l.input_sizes[i]; for(j = 0; j < l.batch; ++j){ axpy_cpu(input_size, 1, l.delta + offset + j*l.outputs, 1, delta + j*input_size, 1); @@ -101,13 +101,13 @@ void backward_route_layer(const route_layer l, network_state state) } #ifdef GPU -void forward_route_layer_gpu(const route_layer l, network_state state) +void forward_route_layer_gpu(const route_layer l, network net) { int i, j; int offset = 0; for(i = 0; i < l.n; ++i){ int index = l.input_layers[i]; - float *input = state.net.layers[index].output_gpu; + float *input = net.layers[index].output_gpu; int input_size = l.input_sizes[i]; for(j = 0; j < l.batch; ++j){ copy_ongpu(input_size, input + j*input_size, 1, l.output_gpu + offset + j*l.outputs, 1); @@ -116,13 +116,13 @@ void forward_route_layer_gpu(const route_layer l, network_state state) } } -void backward_route_layer_gpu(const route_layer l, network_state state) +void backward_route_layer_gpu(const route_layer l, network net) { int i, j; int offset = 0; for(i = 0; i < l.n; ++i){ int index = l.input_layers[i]; - float *delta = state.net.layers[index].delta_gpu; + float *delta = net.layers[index].delta_gpu; int input_size = l.input_sizes[i]; for(j = 0; j < l.batch; ++j){ axpy_ongpu(input_size, 1, l.delta_gpu + offset + j*l.outputs, 1, delta + j*input_size, 1); diff --git a/src/route_layer.h b/src/route_layer.h index 45467d953f1..1d40330ff30 100644 --- a/src/route_layer.h +++ b/src/route_layer.h @@ -6,13 +6,13 @@ typedef layer route_layer; route_layer make_route_layer(int batch, int n, int *input_layers, int *input_size); -void forward_route_layer(const route_layer l, network_state state); -void backward_route_layer(const route_layer l, network_state state); +void forward_route_layer(const route_layer l, network net); +void backward_route_layer(const route_layer l, network net); void resize_route_layer(route_layer *l, network *net); #ifdef GPU -void forward_route_layer_gpu(const route_layer l, network_state state); -void backward_route_layer_gpu(const route_layer l, network_state state); +void forward_route_layer_gpu(const route_layer l, network net); +void backward_route_layer_gpu(const route_layer l, network net); #endif #endif diff --git a/src/shortcut_layer.c b/src/shortcut_layer.c index 8bca50fb594..530d9980c51 100644 --- a/src/shortcut_layer.c +++ b/src/shortcut_layer.c @@ -36,32 +36,32 @@ layer make_shortcut_layer(int batch, int index, int w, int h, int c, int w2, int return l; } -void forward_shortcut_layer(const layer l, network_state state) +void forward_shortcut_layer(const layer l, network net) { - copy_cpu(l.outputs*l.batch, state.input, 1, l.output, 1); - shortcut_cpu(l.batch, l.w, l.h, l.c, state.net.layers[l.index].output, l.out_w, l.out_h, l.out_c, l.output); + copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1); + shortcut_cpu(l.batch, l.w, l.h, l.c, net.layers[l.index].output, l.out_w, l.out_h, l.out_c, l.output); activate_array(l.output, l.outputs*l.batch, l.activation); } -void backward_shortcut_layer(const layer l, network_state state) +void backward_shortcut_layer(const layer l, network net) { gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta); - axpy_cpu(l.outputs*l.batch, 1, l.delta, 1, state.delta, 1); - shortcut_cpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta, l.w, l.h, l.c, state.net.layers[l.index].delta); + axpy_cpu(l.outputs*l.batch, 1, l.delta, 1, net.delta, 1); + shortcut_cpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta, l.w, l.h, l.c, net.layers[l.index].delta); } #ifdef GPU -void forward_shortcut_layer_gpu(const layer l, network_state state) +void forward_shortcut_layer_gpu(const layer l, network net) { - copy_ongpu(l.outputs*l.batch, state.input, 1, l.output_gpu, 1); - shortcut_gpu(l.batch, l.w, l.h, l.c, state.net.layers[l.index].output_gpu, l.out_w, l.out_h, l.out_c, l.output_gpu); + copy_ongpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); + shortcut_gpu(l.batch, l.w, l.h, l.c, net.layers[l.index].output_gpu, l.out_w, l.out_h, l.out_c, l.output_gpu); activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); } -void backward_shortcut_layer_gpu(const layer l, network_state state) +void backward_shortcut_layer_gpu(const layer l, network net) { gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); - axpy_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1, state.delta, 1); - shortcut_gpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta_gpu, l.w, l.h, l.c, state.net.layers[l.index].delta_gpu); + axpy_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1, net.delta_gpu, 1); + shortcut_gpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta_gpu, l.w, l.h, l.c, net.layers[l.index].delta_gpu); } #endif diff --git a/src/shortcut_layer.h b/src/shortcut_layer.h index c09a8097635..32e4ebdcfbf 100644 --- a/src/shortcut_layer.h +++ b/src/shortcut_layer.h @@ -5,12 +5,12 @@ #include "network.h" layer make_shortcut_layer(int batch, int index, int w, int h, int c, int w2, int h2, int c2); -void forward_shortcut_layer(const layer l, network_state state); -void backward_shortcut_layer(const layer l, network_state state); +void forward_shortcut_layer(const layer l, network net); +void backward_shortcut_layer(const layer l, network net); #ifdef GPU -void forward_shortcut_layer_gpu(const layer l, network_state state); -void backward_shortcut_layer_gpu(const layer l, network_state state); +void forward_shortcut_layer_gpu(const layer l, network net); +void backward_shortcut_layer_gpu(const layer l, network net); #endif #endif diff --git a/src/softmax_layer.c b/src/softmax_layer.c index 88f032fc1ba..1eb6e972c7e 100644 --- a/src/softmax_layer.c +++ b/src/softmax_layer.c @@ -32,24 +32,24 @@ softmax_layer make_softmax_layer(int batch, int inputs, int groups) return l; } -void forward_softmax_layer(const softmax_layer l, network_state state) +void forward_softmax_layer(const softmax_layer l, network net) { if(l.softmax_tree){ int i; int count = 0; for (i = 0; i < l.softmax_tree->groups; ++i) { int group_size = l.softmax_tree->group_size[i]; - softmax_cpu(state.input + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output + count); + softmax_cpu(net.input + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output + count); count += group_size; } } else { - softmax_cpu(state.input, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output); + softmax_cpu(net.input, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output); } } -void backward_softmax_layer(const softmax_layer l, network_state state) +void backward_softmax_layer(const softmax_layer l, network net) { - axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, state.delta, 1); + axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, net.delta, 1); } #ifdef GPU @@ -59,24 +59,24 @@ void pull_softmax_layer_output(const softmax_layer layer) cuda_pull_array(layer.output_gpu, layer.output, layer.inputs*layer.batch); } -void forward_softmax_layer_gpu(const softmax_layer l, network_state state) +void forward_softmax_layer_gpu(const softmax_layer l, network net) { if(l.softmax_tree){ int i; int count = 0; for (i = 0; i < l.softmax_tree->groups; ++i) { int group_size = l.softmax_tree->group_size[i]; - softmax_gpu(state.input + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output_gpu + count); + softmax_gpu(net.input_gpu + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output_gpu + count); count += group_size; } } else { - softmax_gpu(state.input, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output_gpu); + softmax_gpu(net.input_gpu, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output_gpu); } } -void backward_softmax_layer_gpu(const softmax_layer layer, network_state state) +void backward_softmax_layer_gpu(const softmax_layer layer, network net) { - axpy_ongpu(layer.batch*layer.inputs, 1, layer.delta_gpu, 1, state.delta, 1); + axpy_ongpu(layer.batch*layer.inputs, 1, layer.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/softmax_layer.h b/src/softmax_layer.h index 821a8dd7387..2e3ffe01a6c 100644 --- a/src/softmax_layer.h +++ b/src/softmax_layer.h @@ -7,13 +7,13 @@ typedef layer softmax_layer; void softmax_array(float *input, int n, float temp, float *output); softmax_layer make_softmax_layer(int batch, int inputs, int groups); -void forward_softmax_layer(const softmax_layer l, network_state state); -void backward_softmax_layer(const softmax_layer l, network_state state); +void forward_softmax_layer(const softmax_layer l, network net); +void backward_softmax_layer(const softmax_layer l, network net); #ifdef GPU void pull_softmax_layer_output(const softmax_layer l); -void forward_softmax_layer_gpu(const softmax_layer l, network_state state); -void backward_softmax_layer_gpu(const softmax_layer l, network_state state); +void forward_softmax_layer_gpu(const softmax_layer l, network net); +void backward_softmax_layer_gpu(const softmax_layer l, network net); #endif #endif From 77ee1118bc7f08ec16e4c75ae734f2ff52cfc324 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 9 Apr 2017 20:15:22 -0700 Subject: [PATCH 009/118] little fix --- src/region_layer.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/region_layer.c b/src/region_layer.c index 99c54a951c4..3931b988ae8 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -347,6 +347,9 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b int col = i % l.w; for(n = 0; n < l.n; ++n){ int index = n*l.w*l.h + i; + for(j = 0; j < l.classes; ++j){ + probs[index][j] = 0; + } int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4); int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); float scale = predictions[obj_index]; From addcc4ef9692f874123bcb861c70d4b07bb3b960 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 12 Apr 2017 14:22:53 -0700 Subject: [PATCH 010/118] working on TED demo --- cfg/darknet9000.cfg | 205 +++++++++++++++++++++++++++++++ cfg/imagenet9k.hierarchy.dataset | 9 ++ cfg/yolo9000.cfg | 19 ++- src/classifier.c | 24 +--- src/convolutional_kernels.cu | 10 +- src/convolutional_layer.c | 2 +- src/convolutional_layer.h | 2 +- src/data.c | 19 +-- src/data.h | 5 +- src/deconvolutional_kernels.cu | 6 +- src/demo.c | 16 ++- src/demo.h | 4 +- src/detector.c | 4 +- src/image.c | 9 ++ src/image.h | 1 + src/lsd.c | 70 +++++------ src/network.c | 3 +- src/network.h | 1 + src/nightmare.c | 36 +++--- src/parser.c | 9 +- src/region_layer.c | 23 +++- src/region_layer.h | 1 + src/utils.c | 23 ++++ src/utils.h | 1 + 24 files changed, 392 insertions(+), 110 deletions(-) create mode 100644 cfg/darknet9000.cfg create mode 100644 cfg/imagenet9k.hierarchy.dataset diff --git a/cfg/darknet9000.cfg b/cfg/darknet9000.cfg new file mode 100644 index 00000000000..9dd2dfbbf5a --- /dev/null +++ b/cfg/darknet9000.cfg @@ -0,0 +1,205 @@ +[net] +# Training +# batch=128 +# subdivisions=4 +# Testing +batch = 1 +subdivisions = 1 +height=448 +width=448 +max_crop=512 +channels=3 +momentum=0.9 +decay=0.0005 + +learning_rate=0.001 +policy=poly +power=4 +max_batches=100000 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +filters=9418 +size=1 +stride=1 +pad=1 +activation=linear + +[avgpool] + +[softmax] +groups=1 +tree=data/9k.tree + +[cost] +type=masked + diff --git a/cfg/imagenet9k.hierarchy.dataset b/cfg/imagenet9k.hierarchy.dataset new file mode 100644 index 00000000000..41fb71b0655 --- /dev/null +++ b/cfg/imagenet9k.hierarchy.dataset @@ -0,0 +1,9 @@ +classes=9418 +train = data/9k.train.list +valid = /data/imagenet/imagenet1k.valid.list +leaves = data/imagenet1k.labels +backup = /home/pjreddie/backup/ +labels = data/9k.labels +names = data/9k.names +top=5 + diff --git a/cfg/yolo9000.cfg b/cfg/yolo9000.cfg index 981491d8629..9a8dd62f7bf 100644 --- a/cfg/yolo9000.cfg +++ b/cfg/yolo9000.cfg @@ -1,17 +1,24 @@ [net] +# Testing +# batch=1 +# subdivisions=1 +# Training +batch=64 +subdivisions=8 batch=1 subdivisions=1 -height=416 -width=416 +height=544 +width=544 channels=3 momentum=0.9 decay=0.0005 -learning_rate=0.00001 -max_batches = 242200 +learning_rate=0.001 +burn_in=1000 +max_batches = 500200 policy=steps -steps=500,200000,240000 -scales=10,.1,.1 +steps=400000,450000 +scales=.1,.1 hue=.1 saturation=.75 diff --git a/src/classifier.c b/src/classifier.c index 1b7ff38aeb0..32fd288aeb2 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -1113,27 +1113,9 @@ void run_classifier(int argc, char **argv) } char *gpu_list = find_char_arg(argc, argv, "-gpus", 0); - int *gpus = 0; - int gpu = 0; - int ngpus = 0; - if(gpu_list){ - printf("%s\n", gpu_list); - int len = strlen(gpu_list); - ngpus = 1; - int i; - for(i = 0; i < len; ++i){ - if (gpu_list[i] == ',') ++ngpus; - } - gpus = calloc(ngpus, sizeof(int)); - for(i = 0; i < ngpus; ++i){ - gpus[i] = atoi(gpu_list); - gpu_list = strchr(gpu_list, ',')+1; - } - } else { - gpu = gpu_index; - gpus = &gpu; - ngpus = 1; - } + int ngpus; + int *gpus = read_intlist(gpu_list, &ngpus, gpu_index); + int cam_index = find_int_arg(argc, argv, "-c", 0); int top = find_int_arg(argc, argv, "-t", 0); diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index 41dec50d364..b53dd16a27b 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -286,7 +286,7 @@ void push_convolutional_layer(convolutional_layer layer) } } -void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch) +void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch, int t) { scal_ongpu(n, B1, m, 1); scal_ongpu(n, B2, v, 1); @@ -296,7 +296,7 @@ void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, mul_ongpu(n, d, 1, d, 1); axpy_ongpu(n, (1-B2), d, 1, v, 1); - adam_gpu(n, w, m, v, B1, B2, rate/batch, eps, 1000); + adam_gpu(n, w, m, v, B1, B2, rate/batch, eps, t); fill_ongpu(n, 0, d, 1); } @@ -305,10 +305,10 @@ void update_convolutional_layer_gpu(layer l, int batch, float learning_rate, flo int size = l.size*l.size*l.c*l.n; if(l.adam){ - adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, size, batch); - adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch); + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, size, batch, l.t); + adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch, l.t); if(l.scales_gpu){ - adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch); + adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch, l.t); } }else{ axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index 182a113dc66..e5b5bb6f2be 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -188,7 +188,7 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int // float scale = 1./sqrt(size*size*c); float scale = sqrt(2./(size*size*c)); - scale = .02; + //scale = .02; //for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_uniform(-1, 1); for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_normal(); int out_w = convolutional_out_width(l); diff --git a/src/convolutional_layer.h b/src/convolutional_layer.h index e00e6788eea..d25ef649838 100644 --- a/src/convolutional_layer.h +++ b/src/convolutional_layer.h @@ -19,7 +19,7 @@ void pull_convolutional_layer(convolutional_layer layer); void add_bias_gpu(float *output, float *biases, int batch, int n, int size); void backward_bias_gpu(float *bias_updates, float *delta, int batch, int n, int size); -void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch); +void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch, int t); #ifdef CUDNN void cudnn_convolutional_setup(layer *l); #endif diff --git a/src/data.c b/src/data.c index 533ae8e024c..e78b17edc1d 100644 --- a/src/data.c +++ b/src/data.c @@ -102,7 +102,7 @@ matrix load_image_paths(char **paths, int n, int w, int h) return X; } -matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure) +matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center) { int i; matrix X; @@ -112,7 +112,12 @@ matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, for(i = 0; i < n; ++i){ image im = load_image_color(paths[i], 0, 0); - image crop = random_augment_image(im, angle, aspect, min, max, size); + image crop; + if(center){ + crop = center_crop_image(im, size, size); + } else { + crop = random_augment_image(im, angle, aspect, min, max, size); + } int flip = rand()%2; if (flip) flip_image(crop); random_distort_image(crop, hue, saturation, exposure); @@ -742,7 +747,7 @@ void *load_thread(void *ptr) } else if (a.type == REGRESSION_DATA){ *a.d = load_data_regression(a.paths, a.n, a.m, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } else if (a.type == CLASSIFICATION_DATA){ - *a.d = load_data_augment(a.paths, a.n, a.m, a.labels, a.classes, a.hierarchy, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure); + *a.d = load_data_augment(a.paths, a.n, a.m, a.labels, a.classes, a.hierarchy, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure, a.center); } else if (a.type == SUPER_DATA){ *a.d = load_data_super(a.paths, a.n, a.m, a.w, a.h, a.scale); } else if (a.type == WRITING_DATA){ @@ -890,18 +895,18 @@ data load_data_regression(char **paths, int n, int m, int min, int max, int size if(m) paths = get_random_paths(paths, n, m); data d = {0}; d.shallow = 0; - d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure); + d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure, 0); d.y = load_regression_labels_paths(paths, n); if(m) free(paths); return d; } -data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure) +data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center) { if(m) paths = get_random_paths(paths, n, m); data d = {0}; d.shallow = 0; - d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure); + d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure, center); d.y = load_labels_paths(paths, n, labels, k, hierarchy); if(m) free(paths); return d; @@ -914,7 +919,7 @@ data load_data_tag(char **paths, int n, int m, int k, int min, int max, int size d.w = size; d.h = size; d.shallow = 0; - d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure); + d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure, 0); d.y = load_tags_paths(paths, n, k); if(m) free(paths); return d; diff --git a/src/data.h b/src/data.h index 30e025c7966..16b334dcec0 100644 --- a/src/data.h +++ b/src/data.h @@ -49,6 +49,7 @@ typedef struct load_args{ int classes; int background; int scale; + int center; float jitter; float angle; float aspect; @@ -80,9 +81,9 @@ data load_data_captcha_encode(char **paths, int n, int m, int w, int h); data load_data_old(char **paths, int n, int m, char **labels, int k, int w, int h); data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, int classes, float jitter, float hue, float saturation, float exposure); data load_data_tag(char **paths, int n, int m, int k, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); -matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); +matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center); data load_data_super(char **paths, int n, int m, int w, int h, int scale); -data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); +data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center); data load_data_regression(char **paths, int n, int m, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); data load_go(char *filename); diff --git a/src/deconvolutional_kernels.cu b/src/deconvolutional_kernels.cu index 55aa162cfd7..166946349ab 100644 --- a/src/deconvolutional_kernels.cu +++ b/src/deconvolutional_kernels.cu @@ -114,10 +114,10 @@ void update_deconvolutional_layer_gpu(layer l, int batch, float learning_rate, f int size = l.size*l.size*l.c*l.n; if(l.adam){ - adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, size, batch); - adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch); + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, size, batch, l.t); + adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch, l.t); if(l.scales_gpu){ - adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch); + adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch, l.t); } }else{ axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); diff --git a/src/demo.c b/src/demo.c index 24c02e0e134..27fcb995eae 100644 --- a/src/demo.c +++ b/src/demo.c @@ -10,6 +10,7 @@ #include #define FRAMES 3 +#define DEMO 1 #ifdef OPENCV @@ -37,7 +38,13 @@ static float *avg; void *fetch_in_thread(void *ptr) { - in = get_image_from_stream(cap); + image raw = get_image_from_stream(cap); + if(DEMO){ + in = center_crop_image(raw, 1440, 1080); + free_image(raw); + }else{ + in = raw; + } if(!in.data){ error("Stream closed."); } @@ -65,7 +72,7 @@ void *detect_in_thread(void *ptr) } else { error("Last layer must produce detections\n"); } - if (nms > 0) do_nms(boxes, probs, l.w*l.h*l.n, l.classes, nms); + if (nms > 0) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); printf("\033[2J"); printf("\033[1;1H"); printf("\nFPS:%.1f\n",fps); @@ -113,6 +120,11 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch cap = cvCaptureFromFile(filename); }else{ cap = cvCaptureFromCAM(cam_index); + if(DEMO){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, 1920); + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, 1080); + cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, 60); + } } if(!cap) error("Couldn't connect to webcam.\n"); diff --git a/src/demo.h b/src/demo.h index c3d6a61ac6e..15f21f82320 100644 --- a/src/demo.h +++ b/src/demo.h @@ -1,5 +1,5 @@ -#ifndef DEMO -#define DEMO +#ifndef DEMO_H +#define DEMO_H #include "image.h" void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh); diff --git a/src/detector.c b/src/detector.c index 8a429ed867f..3884a0b363b 100644 --- a/src/detector.c +++ b/src/detector.c @@ -625,8 +625,8 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); get_region_boxes(l, 1, 1, thresh, probs, boxes, 0, 0, hier_thresh, 0); - if (l.softmax_tree && nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); - else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); + if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); + //else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); draw_detections(sized, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); if(outfile){ save_image(sized, outfile); diff --git a/src/image.c b/src/image.c index 8b2fae90ace..6ddf7985674 100644 --- a/src/image.c +++ b/src/image.c @@ -187,6 +187,7 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, alphabet = 0; } + //printf("%d %s: %.0f%%\n", i, names[class], prob*100); printf("%s: %.0f%%\n", names[class], prob*100); int offset = class*123457 % classes; float red = get_color(2,offset,classes); @@ -641,6 +642,14 @@ void place_image(image im, int w, int h, int dx, int dy, image canvas) } } +image center_crop_image(image im, int w, int h) +{ + int m = (im.w < im.h) ? im.w : im.h; + image c = crop_image(im, (im.w - m) / 2, (im.h - m)/2, m, m); + image r = resize_image(c, w, h); + free_image(c); + return r; +} image rotate_crop_image(image im, float rad, float s, int w, int h, float dx, float dy, float aspect) { diff --git a/src/image.h b/src/image.h index 3109094e303..fd4ca414d0d 100644 --- a/src/image.h +++ b/src/image.h @@ -44,6 +44,7 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, image image_distance(image a, image b); void scale_image(image m, float s); image crop_image(image im, int dx, int dy, int w, int h); +image center_crop_image(image im, int w, int h); image random_crop_image(image im, int w, int h); image random_augment_image(image im, float angle, float aspect, int low, int high, int size); void random_distort_image(image im, float hue, float saturation, float exposure); diff --git a/src/lsd.c b/src/lsd.c index 8801c70f17e..312679ae9e1 100644 --- a/src/lsd.c +++ b/src/lsd.c @@ -599,14 +599,14 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, aloss_avg = aloss_avg*.9 + aloss*.1; printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs); - if(i%1000==0){ + if(i%10000==0){ char buff[256]; sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); save_weights(gnet, buff); sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); save_weights(anet, buff); } - if(i%100==0){ + if(i%1000==0){ char buff[256]; sprintf(buff, "%s/%s.backup", backup_directory, base); save_weights(gnet, buff); @@ -620,8 +620,7 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, #endif } -/* -void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int clear) +void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display) { #ifdef GPU //char *train_images = "/home/pjreddie/data/coco/train1.txt"; @@ -668,31 +667,19 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle pthread_t load_thread = load_data_in_thread(args); clock_t time; - network_state gstate = {0}; - gstate.index = 0; - gstate.net = net; - int x_size = get_network_input_size(net)*net.batch; + int x_size = net.inputs*net.batch; int y_size = x_size; - gstate.input = cuda_make_array(0, x_size); - gstate.truth = cuda_make_array(0, y_size); - gstate.delta = 0; - gstate.train = 1; + net.delta = 0; + net.train = 1; float *pixs = calloc(x_size, sizeof(float)); float *graypixs = calloc(x_size, sizeof(float)); float *y = calloc(y_size, sizeof(float)); - network_state astate = {0}; - astate.index = 0; - astate.net = anet; - int ay_size = get_network_output_size(anet)*anet.batch; - astate.input = 0; - astate.truth = 0; - astate.delta = 0; - astate.train = 1; + int ay_size = anet.outputs*anet.batch; + anet.delta = 0; + anet.train = 1; float *imerror = cuda_make_array(0, imlayer.outputs*imlayer.batch); - float *ones_gpu = cuda_make_array(0, ay_size); - fill_ongpu(ay_size, 1, ones_gpu, 1); float aloss_avg = -1; float gloss_avg = -1; @@ -712,8 +699,8 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle for(j = 0; j < imgs; ++j){ image gim = float_to_image(net.w, net.h, net.c, gray.X.vals[j]); grayscale_image_3c(gim); - train.y.vals[j][0] = 1; - gray.y.vals[j][0] = 0; + train.y.vals[j][0] = .95; + gray.y.vals[j][0] = .05; } time=clock(); float gloss = 0; @@ -721,9 +708,8 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle for(j = 0; j < net.subdivisions; ++j){ get_next_batch(train, net.batch, j*net.batch, pixs, 0); get_next_batch(gray, net.batch, j*net.batch, graypixs, 0); - cuda_push_array(gstate.input, graypixs, x_size); - cuda_push_array(gstate.truth, pixs, y_size); - */ + cuda_push_array(net.input_gpu, graypixs, net.inputs*net.batch); + cuda_push_array(net.truth_gpu, pixs, net.truths*net.batch); /* image origi = float_to_image(net.w, net.h, 3, pixs); image grayi = float_to_image(net.w, net.h, 3, graypixs); @@ -731,16 +717,15 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle show_image(origi, "orig"); cvWaitKey(0); */ - /* *net.seen += net.batch; - forward_network_gpu(net, gstate); + forward_network_gpu(net); fill_ongpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); - astate.input = imlayer.output_gpu; - astate.delta = imerror; - astate.truth = ones_gpu; - forward_network_gpu(anet, astate); - backward_network_gpu(anet, astate); + copy_ongpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1); + fill_ongpu(anet.inputs*anet.batch, .95, anet.truth_gpu, 1); + anet.delta_gpu = imerror; + forward_network_gpu(anet); + backward_network_gpu(anet); scal_ongpu(imlayer.outputs*imlayer.batch, 1./100., net.layers[net.n-1].delta_gpu, 1); @@ -751,12 +736,11 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1); - backward_network_gpu(net, gstate); + backward_network_gpu(net); - gloss += get_network_cost(net) /(net.subdivisions*net.batch); + gloss += *net.cost /(net.subdivisions*net.batch); - cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); for(k = 0; k < net.batch; ++k){ int index = j*net.batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1); @@ -769,6 +753,16 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle float aloss = train_network(anet, merge); update_network_gpu(net); + + #ifdef OPENCV + if(display){ + image im = float_to_image(anet.w, anet.h, anet.c, gray.X.vals[0]); + image im2 = float_to_image(anet.w, anet.h, anet.c, train.X.vals[0]); + show_image(im, "gen"); + show_image(im2, "train"); + cvWaitKey(50); + } + #endif free_data(merge); free_data(train); free_data(gray); @@ -797,7 +791,6 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle save_weights(net, buff); #endif } -*/ /* void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfile, int clear) @@ -1136,6 +1129,7 @@ void run_lsd(int argc, char **argv) //else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear); //else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear); if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear, display, file); + else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear, display); else if(0==strcmp(argv[2], "gan")) test_dcgan(cfg, weights); else if(0==strcmp(argv[2], "test")) test_lsd(cfg, weights, filename, 0); else if(0==strcmp(argv[2], "color")) test_lsd(cfg, weights, filename, 1); diff --git a/src/network.c b/src/network.c index abf1b8aab70..2b21338dca9 100644 --- a/src/network.c +++ b/src/network.c @@ -42,6 +42,7 @@ load_args get_base_args(network net) args.angle = net.angle; args.aspect = net.aspect; args.exposure = net.exposure; + args.center = net.center; args.saturation = net.saturation; args.hue = net.hue; return args; @@ -385,7 +386,7 @@ image get_network_image_layer(network net, int i) { layer l = net.layers[i]; #ifdef GPU - cuda_pull_array(l.output_gpu, l.output, l.outputs); + //cuda_pull_array(l.output_gpu, l.output, l.outputs); #endif if (l.out_w && l.out_h && l.out_c){ return float_to_image(l.out_w, l.out_h, l.out_c, l.output); diff --git a/src/network.h b/src/network.h index d27119ed82f..64d0b61c274 100644 --- a/src/network.h +++ b/src/network.h @@ -47,6 +47,7 @@ typedef struct network{ int h, w, c; int max_crop; int min_crop; + int center; float angle; float aspect; float exposure; diff --git a/src/nightmare.c b/src/nightmare.c index 4bcf18775db..3ab735cef9b 100644 --- a/src/nightmare.c +++ b/src/nightmare.c @@ -2,6 +2,7 @@ #include "parser.h" #include "blas.h" #include "utils.h" +#include "region_layer.h" // ./darknet nightmare cfg/extractor.recon.cfg ~/trained/yolo-coco.conv frame6.png -reconstruct -iters 500 -i 3 -lambda .1 -rate .01 -smooth 2 @@ -137,11 +138,11 @@ void reconstruct_picture(network net, float *features, image recon, image update #ifdef GPU cuda_push_array(net.input_gpu, recon.data, recon.w*recon.h*recon.c); - cuda_push_array(net.truth_gpu, features, net.truths); + //cuda_push_array(net.truth_gpu, features, net.truths); net.delta_gpu = cuda_make_array(delta.data, delta.w*delta.h*delta.c); forward_network_gpu(net); - copy_ongpu(l.outputs, net.truth_gpu, 1, l.delta_gpu, 1); + cuda_push_array(l.delta_gpu, features, l.outputs); axpy_ongpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1); backward_network_gpu(net); @@ -157,13 +158,15 @@ void reconstruct_picture(network net, float *features, image recon, image update backward_network(net); #endif + //normalize_array(delta.data, delta.w*delta.h*delta.c); axpy_cpu(recon.w*recon.h*recon.c, 1, delta.data, 1, update.data, 1); - smooth(recon, update, lambda, smooth_size); + //smooth(recon, update, lambda, smooth_size); axpy_cpu(recon.w*recon.h*recon.c, rate, update.data, 1, recon.data, 1); scal_cpu(recon.w*recon.h*recon.c, momentum, update.data, 1); - //float mag = mag_array(recon.data, recon.w*recon.h*recon.c); + float mag = mag_array(delta.data, recon.w*recon.h*recon.c); + printf("mag: %f\n", mag); //scal_cpu(recon.w*recon.h*recon.c, 600/mag, recon.data, 1); constrain_image(recon); @@ -330,28 +333,33 @@ void run_nightmare(int argc, char **argv) image update; if (reconstruct){ net.n = max_layer; - resize_network(&net, im.w, im.h); + im = letterbox_image(im, net.w, net.h); + //resize_network(&net, im.w, im.h); - int zz = 0; network_predict(net, im.data); - image out_im = get_network_image(net); - image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz); + if(net.layers[net.n-1].type == REGION){ + printf("region!\n"); + zero_objectness(net.layers[net.n-1]); + } + image out_im = copy_image(get_network_image(net)); + /* + image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz); //flip_image(crop); image f_im = resize_image(crop, out_im.w, out_im.h); free_image(crop); + */ printf("%d features\n", out_im.w*out_im.h*out_im.c); + features = out_im.data; - im = resize_image(im, im.w, im.h); - f_im = resize_image(f_im, f_im.w, f_im.h); - features = f_im.data; - + /* int i; - for(i = 0; i < 14*14*512; ++i){ - //features[i] += rand_uniform(-.19, .19); + for(i = 0; i < 14*14*512; ++i){ + //features[i] += rand_uniform(-.19, .19); } free_image(im); im = make_random_image(im.w, im.h, im.c); + */ update = make_image(im.w, im.h, im.c); } diff --git a/src/parser.c b/src/parser.c index 2c03c7f55ff..4add3573199 100644 --- a/src/parser.c +++ b/src/parser.c @@ -558,6 +558,7 @@ void parse_net_options(list *options, network *net) net->inputs = option_find_int_quiet(options, "inputs", net->h * net->w * net->c); net->max_crop = option_find_int_quiet(options, "max_crop",net->w*2); net->min_crop = option_find_int_quiet(options, "min_crop",net->w); + net->center = option_find_int_quiet(options, "center",0); net->angle = option_find_float_quiet(options, "angle", 0); net->aspect = option_find_float_quiet(options, "aspect", 1); @@ -835,8 +836,8 @@ void save_convolutional_weights(layer l, FILE *fp) } fwrite(l.weights, sizeof(float), num, fp); if(l.adam){ - fwrite(l.m, sizeof(float), num, fp); - fwrite(l.v, sizeof(float), num, fp); + //fwrite(l.m, sizeof(float), num, fp); + //fwrite(l.v, sizeof(float), num, fp); } } @@ -1039,8 +1040,8 @@ void load_convolutional_weights(layer l, FILE *fp) } fread(l.weights, sizeof(float), num, fp); if(l.adam){ - fread(l.m, sizeof(float), num, fp); - fread(l.v, sizeof(float), num, fp); + //fread(l.m, sizeof(float), num, fp); + //fread(l.v, sizeof(float), num, fp); } //if(l.c == 3) scal_cpu(num, 1./256, l.weights, 1); if (l.flipped) { diff --git a/src/region_layer.c b/src/region_layer.c index 3931b988ae8..275f2323e3b 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -384,14 +384,24 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b probs[index][l.classes] = scale; } } else { + float max = 0; for(j = 0; j < l.classes; ++j){ int class_index = entry_index(l, 0, n*l.w*l.h + i, 5 + j); float prob = scale*predictions[class_index]; probs[index][j] = (prob > thresh) ? prob : 0; + if(prob > max) max = prob; // TODO REMOVE // if (j != 15 && j != 16) probs[index][j] = 0; - // if (j != 0) probs[index][j] = 0; + /* + if (j != 0) probs[index][j] = 0; + int blacklist[] = {121, 497, 482, 504, 122, 518,481, 418, 542, 491, 914, 478, 120, 510,500}; + int bb; + for (bb = 0; bb < sizeof(blacklist)/sizeof(int); ++bb){ + if(index == blacklist[bb]) probs[index][j] = 0; + } + */ } + probs[index][l.classes] = max; } if(only_objectness){ probs[index][0] = scale; @@ -461,3 +471,14 @@ void backward_region_layer_gpu(const layer l, network net) } #endif +void zero_objectness(layer l) +{ + int i, n; + for (i = 0; i < l.w*l.h; ++i){ + for(n = 0; n < l.n; ++n){ + int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4); + l.output[obj_index] = 0; + } + } +} + diff --git a/src/region_layer.h b/src/region_layer.h index 6375445f77c..5177d3bef26 100644 --- a/src/region_layer.h +++ b/src/region_layer.h @@ -9,6 +9,7 @@ void forward_region_layer(const layer l, network net); void backward_region_layer(const layer l, network net); void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int nomult); void resize_region_layer(layer *l, int w, int h); +void zero_objectness(layer l); #ifdef GPU void forward_region_layer_gpu(const layer l, network net); diff --git a/src/utils.c b/src/utils.c index b5181d78fa2..9fa2d6bfe75 100644 --- a/src/utils.c +++ b/src/utils.c @@ -9,6 +9,29 @@ #include "utils.h" +int *read_intlist(char *gpu_list, int *ngpus, int d) +{ + int *gpus = 0; + if(gpu_list){ + int len = strlen(gpu_list); + *ngpus = 1; + int i; + for(i = 0; i < len; ++i){ + if (gpu_list[i] == ',') ++*ngpus; + } + gpus = calloc(*ngpus, sizeof(int)); + for(i = 0; i < *ngpus; ++i){ + gpus[i] = atoi(gpu_list); + gpu_list = strchr(gpu_list, ',')+1; + } + } else { + gpus = calloc(1, sizeof(float)); + *gpus = d; + *ngpus = 1; + } + return gpus; +} + int *read_map(char *filename) { int n = 0; diff --git a/src/utils.h b/src/utils.h index bbc676548a3..ab4c6959530 100644 --- a/src/utils.h +++ b/src/utils.h @@ -7,6 +7,7 @@ #define SECRET_NUM -1234 #define TWO_PI 6.2831853071795864769252866 +int *read_intlist(char *s, int *n, int d); int *read_map(char *filename); void shuffle(void *arr, size_t n, size_t size); void sorta_shuffle(void *arr, size_t n, size_t size, size_t sections); From 6731a3552d9c95280d7a27b18cea342751d79e3d Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 17 Apr 2017 14:53:48 -0700 Subject: [PATCH 011/118] :charizard: fixed non-square aspect ratio thing :charizard: --- cfg/yolo9000.cfg | 8 +++---- src/coco.c | 2 +- src/demo.c | 33 +++++++++++++++++++-------- src/demo.h | 2 +- src/detector.c | 22 ++++++++++-------- src/lsd.c | 2 +- src/region_layer.c | 56 +++++++++++++++++++++++++++++----------------- src/region_layer.h | 2 +- src/yolo.c | 2 +- 9 files changed, 82 insertions(+), 47 deletions(-) diff --git a/cfg/yolo9000.cfg b/cfg/yolo9000.cfg index 9a8dd62f7bf..e745f78a6e3 100644 --- a/cfg/yolo9000.cfg +++ b/cfg/yolo9000.cfg @@ -1,10 +1,10 @@ [net] # Testing -# batch=1 -# subdivisions=1 +batch=1 +subdivisions=1 # Training -batch=64 -subdivisions=8 +# batch=64 +# subdivisions=8 batch=1 subdivisions=1 height=544 diff --git a/src/coco.c b/src/coco.c index b8505ff28ec..74fe3b2f8b5 100644 --- a/src/coco.c +++ b/src/coco.c @@ -380,5 +380,5 @@ void run_coco(int argc, char **argv) else if(0==strcmp(argv[2], "train")) train_coco(cfg, weights); else if(0==strcmp(argv[2], "valid")) validate_coco(cfg, weights); else if(0==strcmp(argv[2], "recall")) validate_coco_recall(cfg, weights); - else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, .5); + else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, .5, 0,0,0,0); } diff --git a/src/demo.c b/src/demo.c index 27fcb995eae..c4da7b015f2 100644 --- a/src/demo.c +++ b/src/demo.c @@ -68,7 +68,7 @@ void *detect_in_thread(void *ptr) if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else if (l.type == REGION){ - get_region_boxes(l, in.w, in.h, demo_thresh, probs, boxes, 0, 0, demo_hier_thresh, 1); + get_region_boxes(l, in.w, in.h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, demo_hier_thresh, 1); } else { error("Last layer must produce detections\n"); } @@ -96,7 +96,7 @@ double get_wall_time() return (double)time.tv_sec + (double)time.tv_usec * .000001; } -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh) +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh, int w, int h, int fps, int fullscreen) { //skip = frame_skip; image **alphabet = load_alphabet(); @@ -120,10 +120,15 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch cap = cvCaptureFromFile(filename); }else{ cap = cvCaptureFromCAM(cam_index); - if(DEMO){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, 1920); - cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, 1080); - cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, 60); + + if(w){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); + } + if(h){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); + } + if(fps){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, fps); } } @@ -164,8 +169,12 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch int count = 0; if(!prefix){ cvNamedWindow("Demo", CV_WINDOW_NORMAL); - cvMoveWindow("Demo", 0, 0); - cvResizeWindow("Demo", 1352, 1013); + if(fullscreen){ + cvSetWindowProperty("Demo", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); + } else { + cvMoveWindow("Demo", 0, 0); + cvResizeWindow("Demo", 1352, 1013); + } } double before = get_wall_time(); @@ -184,6 +193,12 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch else if(frame_skip == 4) frame_skip = 0; else if(frame_skip == 60) frame_skip = 4; else frame_skip = 0; + } else if (c == 27) { + return; + } else if (c == 63232) { + demo_thresh += .01; + } else if (c == 63233) { + demo_thresh -= .01; } }else{ char buff[256]; @@ -224,7 +239,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch } } #else -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh) +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh, int w, int h, int fps, int fullscreen) { fprintf(stderr, "Demo needs OpenCV for webcam images.\n"); } diff --git a/src/demo.h b/src/demo.h index 15f21f82320..2c64a4692c0 100644 --- a/src/demo.h +++ b/src/demo.h @@ -2,6 +2,6 @@ #define DEMO_H #include "image.h" -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh); +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh, int w, int h, int fps, int fullscreen); #endif diff --git a/src/detector.c b/src/detector.c index 3884a0b363b..1b3e488dcdd 100644 --- a/src/detector.c +++ b/src/detector.c @@ -346,7 +346,7 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char network_predict(net, input.data); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, thresh, probs, boxes, 0, map, .5, 0); + get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, map, .5, 0); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -477,7 +477,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out network_predict(net, X); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, thresh, probs, boxes, 0, map, .5, 0); + get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, map, .5, 0); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -541,7 +541,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) image sized = resize_image(orig, net.w, net.h); char *id = basecfg(path); network_predict(net, sized.data); - get_region_boxes(l, 1, 1, thresh, probs, boxes, 1, 0, .5, 0); + get_region_boxes(l, sized.w, sized.h, net.w, net.h, thresh, probs, boxes, 1, 0, .5, 1); if (nms) do_nms(boxes, probs, l.w*l.h*l.n, 1, nms); char labelpath[4096]; @@ -624,16 +624,16 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam time=clock(); network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - get_region_boxes(l, 1, 1, thresh, probs, boxes, 0, 0, hier_thresh, 0); + get_region_boxes(l, im.w, im.h, net.w, net.h, thresh, probs, boxes, 0, 0, hier_thresh, 1); if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); //else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); - draw_detections(sized, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); + draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); if(outfile){ - save_image(sized, outfile); + save_image(im, outfile); } else{ - save_image(sized, "predictions"); - show_image(sized, "predictions"); + save_image(im, "predictions"); + show_image(im, "predictions"); #ifdef OPENCV cvWaitKey(0); cvDestroyAllWindows(); @@ -684,6 +684,10 @@ void run_detector(int argc, char **argv) } int clear = find_arg(argc, argv, "-clear"); + int fullscreen = find_arg(argc, argv, "-fullscreen"); + int height = find_int_arg(argc, argv, "-h", 0); + int width = find_int_arg(argc, argv, "-w", 0); + int fps = find_int_arg(argc, argv, "-fps", 0); char *datacfg = argv[3]; char *cfg = argv[4]; @@ -699,6 +703,6 @@ void run_detector(int argc, char **argv) int classes = option_find_int(options, "classes", 20); char *name_list = option_find_str(options, "names", "data/names.list"); char **names = get_labels(name_list); - demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, hier_thresh); + demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, hier_thresh, width, height, fps, fullscreen); } } diff --git a/src/lsd.c b/src/lsd.c index 312679ae9e1..bb0b0445f75 100644 --- a/src/lsd.c +++ b/src/lsd.c @@ -548,7 +548,7 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, printf("%f\n", genaloss); scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); - scal_ongpu(imlayer.outputs*imlayer.batch, .00, gnet.layers[gnet.n-1].delta_gpu, 1); + scal_ongpu(imlayer.outputs*imlayer.batch, .1, gnet.layers[gnet.n-1].delta_gpu, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); printf("features %f\n", cuda_mag_array(gnet.layers[gnet.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); diff --git a/src/region_layer.c b/src/region_layer.c index 275f2323e3b..e9f18b526ea 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -315,7 +315,35 @@ void backward_region_layer(const layer l, network net) */ } -void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int nomult) +void correct_region_boxes(box *boxes, int n, int w, int h, int netw, int neth, int relative) +{ + int i; + int new_w=0; + int new_h=0; + if (((float)netw/w) < ((float)neth/h)) { + new_w = netw; + new_h = (h * netw)/w; + } else { + new_h = neth; + new_w = (w * neth)/h; + } + for (i = 0; i < n; ++i){ + box b = boxes[i]; + b.x = (b.x - (netw - new_w)/2./netw) / ((float)new_w/netw); + b.y = (b.y - (neth - new_h)/2./neth) / ((float)new_h/neth); + b.w *= (float)netw/new_w; + b.h *= (float)neth/new_h; + if(!relative){ + b.x *= w; + b.w *= w; + b.y *= h; + b.h *= h; + } + boxes[i] = b; + } +} + +void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int relative) { int i,j,n,z; float *predictions = l.output; @@ -354,19 +382,6 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); float scale = predictions[obj_index]; boxes[index] = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h, l.w*l.h); - if(1){ - int max = w > h ? w : h; - boxes[index].x = (boxes[index].x - (max - w)/2./max) / ((float)w/max); - boxes[index].y = (boxes[index].y - (max - h)/2./max) / ((float)h/max); - boxes[index].w *= (float)max/w; - boxes[index].h *= (float)max/h; - } - if(!nomult){ - boxes[index].x *= w; - boxes[index].y *= h; - boxes[index].w *= w; - boxes[index].h *= h; - } int class_index = entry_index(l, 0, n*l.w*l.h + i, 5); if(l.softmax_tree){ @@ -393,12 +408,12 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b // TODO REMOVE // if (j != 15 && j != 16) probs[index][j] = 0; /* - if (j != 0) probs[index][j] = 0; - int blacklist[] = {121, 497, 482, 504, 122, 518,481, 418, 542, 491, 914, 478, 120, 510,500}; - int bb; - for (bb = 0; bb < sizeof(blacklist)/sizeof(int); ++bb){ - if(index == blacklist[bb]) probs[index][j] = 0; - } + if (j != 0) probs[index][j] = 0; + int blacklist[] = {121, 497, 482, 504, 122, 518,481, 418, 542, 491, 914, 478, 120, 510,500}; + int bb; + for (bb = 0; bb < sizeof(blacklist)/sizeof(int); ++bb){ + if(index == blacklist[bb]) probs[index][j] = 0; + } */ } probs[index][l.classes] = max; @@ -408,6 +423,7 @@ void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *b } } } + correct_region_boxes(boxes, l.w*l.h*l.n, w, h, netw, neth, relative); } #ifdef GPU diff --git a/src/region_layer.h b/src/region_layer.h index 5177d3bef26..03b1a3d2d03 100644 --- a/src/region_layer.h +++ b/src/region_layer.h @@ -7,7 +7,7 @@ layer make_region_layer(int batch, int h, int w, int n, int classes, int coords); void forward_region_layer(const layer l, network net); void backward_region_layer(const layer l, network net); -void get_region_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int nomult); +void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int relative); void resize_region_layer(layer *l, int w, int h); void zero_objectness(layer l); diff --git a/src/yolo.c b/src/yolo.c index 3f77278ae5c..48d63dfb912 100644 --- a/src/yolo.c +++ b/src/yolo.c @@ -347,5 +347,5 @@ void run_yolo(int argc, char **argv) else if(0==strcmp(argv[2], "train")) train_yolo(cfg, weights); else if(0==strcmp(argv[2], "valid")) validate_yolo(cfg, weights); else if(0==strcmp(argv[2], "recall")) validate_yolo_recall(cfg, weights); - else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, .5); + else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, .5, 0,0,0,0); } From e501a09e0637f36dca1a9ae64bf61ae112977568 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 17 Apr 2017 16:23:50 -0700 Subject: [PATCH 012/118] little fixes --- cfg/yolo.cfg | 2 +- src/classifier.c | 5 +++-- src/demo.c | 35 ++++++++++++++++++----------------- src/detector.c | 2 +- src/image.c | 8 +++----- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg index c530f915cc1..088edf81573 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolo.cfg @@ -5,8 +5,8 @@ subdivisions=1 # Training # batch=64 # subdivisions=8 -height=608 width=608 +height=608 channels=3 momentum=0.9 decay=0.0005 diff --git a/src/classifier.c b/src/classifier.c index 32fd288aeb2..8581d81e4c1 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -703,8 +703,9 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); for(i = 0; i < top; ++i){ int index = indexes[i]; - if(net.hierarchy) printf("%d, %s: %f, parent: %s \n",index, names[index], predictions[index], (net.hierarchy->parent[index] >= 0) ? names[net.hierarchy->parent[index]] : "Root"); - else printf("%s: %f\n",names[index], predictions[index]); + //if(net.hierarchy) printf("%d, %s: %f, parent: %s \n",index, names[index], predictions[index], (net.hierarchy->parent[index] >= 0) ? names[net.hierarchy->parent[index]] : "Root"); + //else printf("%s: %f\n",names[index], predictions[index]); + printf("%5.2f%%: %s\n", predictions[index]*100, names[index]); } if(r.data != im.data) free_image(r); free_image(im); diff --git a/src/demo.c b/src/demo.c index c4da7b015f2..7d7747c6aa3 100644 --- a/src/demo.c +++ b/src/demo.c @@ -29,7 +29,7 @@ static image disp = {0}; static CvCapture * cap; static float fps = 0; static float demo_thresh = 0; -static float demo_hier_thresh = .5; +static float demo_hier = .5; static float *predictions[FRAMES]; static int demo_index = 0; @@ -38,13 +38,7 @@ static float *avg; void *fetch_in_thread(void *ptr) { - image raw = get_image_from_stream(cap); - if(DEMO){ - in = center_crop_image(raw, 1440, 1080); - free_image(raw); - }else{ - in = raw; - } + in = get_image_from_stream(cap); if(!in.data){ error("Stream closed."); } @@ -68,7 +62,7 @@ void *detect_in_thread(void *ptr) if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else if (l.type == REGION){ - get_region_boxes(l, in.w, in.h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, demo_hier_thresh, 1); + get_region_boxes(l, in.w, in.h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, demo_hier, 1); } else { error("Last layer must produce detections\n"); } @@ -96,7 +90,7 @@ double get_wall_time() return (double)time.tv_sec + (double)time.tv_usec * .000001; } -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh, int w, int h, int fps, int fullscreen) +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier, int w, int h, int frames, int fullscreen) { //skip = frame_skip; image **alphabet = load_alphabet(); @@ -105,7 +99,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch demo_alphabet = alphabet; demo_classes = classes; demo_thresh = thresh; - demo_hier_thresh = hier_thresh; + demo_hier = hier; printf("Demo\n"); net = parse_network_cfg(cfgfile); if(weightfile){ @@ -127,8 +121,8 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(h){ cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); } - if(fps){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, fps); + if(frames){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, frames); } } @@ -188,6 +182,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(!prefix){ show_image(disp, "Demo"); int c = cvWaitKey(1); + printf("%d\n", c); if (c == 10){ if(frame_skip == 0) frame_skip = 60; else if(frame_skip == 4) frame_skip = 0; @@ -195,10 +190,16 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch else frame_skip = 0; } else if (c == 27) { return; - } else if (c == 63232) { - demo_thresh += .01; - } else if (c == 63233) { - demo_thresh -= .01; + } else if (c == 65362) { + demo_thresh += .02; + } else if (c == 65364) { + demo_thresh -= .02; + if(demo_thresh <= .02) demo_thresh = .02; + } else if (c == 65363) { + demo_hier += .02; + } else if (c == 65361) { + demo_hier -= .02; + if(demo_hier <= .0) demo_hier = .0; } }else{ char buff[256]; diff --git a/src/detector.c b/src/detector.c index 1b3e488dcdd..a0728b6c185 100644 --- a/src/detector.c +++ b/src/detector.c @@ -685,8 +685,8 @@ void run_detector(int argc, char **argv) int clear = find_arg(argc, argv, "-clear"); int fullscreen = find_arg(argc, argv, "-fullscreen"); - int height = find_int_arg(argc, argv, "-h", 0); int width = find_int_arg(argc, argv, "-w", 0); + int height = find_int_arg(argc, argv, "-h", 0); int fps = find_int_arg(argc, argv, "-fps", 0); char *datacfg = argv[3]; diff --git a/src/image.c b/src/image.c index 6ddf7985674..a5cc135c33a 100644 --- a/src/image.c +++ b/src/image.c @@ -719,9 +719,7 @@ image crop_image(image im, int dx, int dy, int w, int h) float val = 0; r = constrain_int(r, 0, im.h-1); c = constrain_int(c, 0, im.w-1); - if (r >= 0 && r < im.h && c >= 0 && c < im.w) { - val = get_pixel(im, c, r, k); - } + val = get_pixel(im, c, r, k); set_pixel(cropped, i, j, k, val); } } @@ -899,7 +897,7 @@ void yuv_to_rgb(image im) y = get_pixel(im, i , j, 0); u = get_pixel(im, i , j, 1); v = get_pixel(im, i , j, 2); - + r = y + 1.13983*v; g = y + -.39465*u + -.58060*v; b = y + 2.03211*u; @@ -922,7 +920,7 @@ void rgb_to_yuv(image im) r = get_pixel(im, i , j, 0); g = get_pixel(im, i , j, 1); b = get_pixel(im, i , j, 2); - + y = .299*r + .587*g + .114*b; u = -.14713*r + -.28886*g + .436*b; v = .615*r + -.51499*g + -.10001*b; From 9726f1e89c29fb9a8802f0a544e2cc79aafa67ff Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 17 Apr 2017 17:18:08 -0700 Subject: [PATCH 013/118] garbage opencv key codes --- src/classifier.c | 2 +- src/demo.c | 10 +++++----- src/detector.c | 10 +++++++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/classifier.c b/src/classifier.c index 8581d81e4c1..491e60b9e88 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -693,7 +693,7 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi image im = load_image_color(input, 0, 0); image r = resize_min(im, size); resize_network(&net, r.w, r.h); - printf("%d %d\n", r.w, r.h); + //printf("%d %d\n", r.w, r.h); float *X = r.data; time=clock(); diff --git a/src/demo.c b/src/demo.c index 7d7747c6aa3..4ab9716bdb7 100644 --- a/src/demo.c +++ b/src/demo.c @@ -182,7 +182,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(!prefix){ show_image(disp, "Demo"); int c = cvWaitKey(1); - printf("%d\n", c); + if (c != -1) c = c%256; if (c == 10){ if(frame_skip == 0) frame_skip = 60; else if(frame_skip == 4) frame_skip = 0; @@ -190,14 +190,14 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch else frame_skip = 0; } else if (c == 27) { return; - } else if (c == 65362) { + } else if (c == 82) { demo_thresh += .02; - } else if (c == 65364) { + } else if (c == 84) { demo_thresh -= .02; if(demo_thresh <= .02) demo_thresh = .02; - } else if (c == 65363) { + } else if (c == 83) { demo_hier += .02; - } else if (c == 65361) { + } else if (c == 81) { demo_hier -= .02; if(demo_hier <= .0) demo_hier = .0; } diff --git a/src/detector.c b/src/detector.c index a0728b6c185..b69d21ff568 100644 --- a/src/detector.c +++ b/src/detector.c @@ -580,7 +580,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) } } -void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile) +void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen) { list *options = read_data_cfg(datacfg); char *name_list = option_find_str(options, "names", "data/names.list"); @@ -633,8 +633,12 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam } else{ save_image(im, "predictions"); - show_image(im, "predictions"); #ifdef OPENCV + cvNamedWindow("predictions", CV_WINDOW_NORMAL); + if(fullscreen){ + cvSetWindowProperty("predictions", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); + } + show_image(im, "predictions"); cvWaitKey(0); cvDestroyAllWindows(); #endif @@ -693,7 +697,7 @@ void run_detector(int argc, char **argv) char *cfg = argv[4]; char *weights = (argc > 5) ? argv[5] : 0; char *filename = (argc > 6) ? argv[6]: 0; - if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile); + if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen); else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear); else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile); else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile); From 72a2fe93f94a164c7e724a9339706245362483b7 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 30 Apr 2017 13:54:40 -0700 Subject: [PATCH 014/118] redid the demo for TED, little faster --- cfg/yolo.cfg | 4 +- src/classifier.c | 2 +- src/coco.c | 3 +- src/demo.c | 233 ++++++++++++++++++++---------------------- src/demo.h | 2 +- src/detection_layer.c | 4 +- src/detector.c | 9 +- src/image.c | 77 +++++++++++--- src/image.h | 6 ++ src/region_layer.c | 2 +- src/yolo.c | 3 +- 11 files changed, 197 insertions(+), 148 deletions(-) diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg index 088edf81573..2a0cd98fbd0 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolo.cfg @@ -5,8 +5,8 @@ subdivisions=1 # Training # batch=64 # subdivisions=8 -width=608 -height=608 +width=416 +height=416 channels=3 momentum=0.9 decay=0.0005 diff --git a/src/classifier.c b/src/classifier.c index 491e60b9e88..039ad66820f 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -698,7 +698,7 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi float *X = r.data; time=clock(); float *predictions = network_predict(net, X); - if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 0, 1); + if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 1, 1); top_k(predictions, net.outputs, top, indexes); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); for(i = 0; i < top; ++i){ diff --git a/src/coco.c b/src/coco.c index 74fe3b2f8b5..3bcb651816b 100644 --- a/src/coco.c +++ b/src/coco.c @@ -376,9 +376,10 @@ void run_coco(int argc, char **argv) char *cfg = argv[3]; char *weights = (argc > 4) ? argv[4] : 0; char *filename = (argc > 5) ? argv[5]: 0; + int avg = find_int_arg(argc, argv, "-avg", 1); if(0==strcmp(argv[2], "test")) test_coco(cfg, weights, filename, thresh); else if(0==strcmp(argv[2], "train")) train_coco(cfg, weights); else if(0==strcmp(argv[2], "valid")) validate_coco(cfg, weights); else if(0==strcmp(argv[2], "recall")) validate_coco_recall(cfg, weights); - else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, .5, 0,0,0,0); + else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, avg, .5, 0,0,0,0); } diff --git a/src/demo.c b/src/demo.c index 4ab9716bdb7..ff6c732962e 100644 --- a/src/demo.c +++ b/src/demo.c @@ -9,7 +9,6 @@ #include "demo.h" #include -#define FRAMES 3 #define DEMO 1 #ifdef OPENCV @@ -21,80 +20,125 @@ static int demo_classes; static float **probs; static box *boxes; static network net; -static image in ; -static image in_s ; -static image det ; -static image det_s; -static image disp = {0}; +static image buff [3]; +static image buff_letter[3]; +static int buff_index = 0; static CvCapture * cap; +static IplImage * ipl; static float fps = 0; static float demo_thresh = 0; static float demo_hier = .5; +static int running = 0; -static float *predictions[FRAMES]; +static int demo_delay = 0; +static int demo_frame = 5; +static int demo_detections = 0; +static float **predictions; static int demo_index = 0; -static image images[FRAMES]; +static int demo_done = 0; +static float *last_avg2; +static float *last_avg; static float *avg; +double demo_time; -void *fetch_in_thread(void *ptr) +double get_wall_time() { - in = get_image_from_stream(cap); - if(!in.data){ - error("Stream closed."); + struct timeval time; + if (gettimeofday(&time,NULL)){ + return 0; } - in_s = letterbox_image(in, net.w, net.h); - return 0; + return (double)time.tv_sec + (double)time.tv_usec * .000001; } void *detect_in_thread(void *ptr) { + running = 1; float nms = .4; layer l = net.layers[net.n-1]; - float *X = det_s.data; + float *X = buff_letter[(buff_index+2)%3].data; float *prediction = network_predict(net, X); memcpy(predictions[demo_index], prediction, l.outputs*sizeof(float)); - mean_arrays(predictions, FRAMES, l.outputs, avg); - l.output = avg; - - free_image(det_s); + mean_arrays(predictions, demo_frame, l.outputs, avg); + l.output = last_avg2; + if(demo_delay == 0) l.output = avg; if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else if (l.type == REGION){ - get_region_boxes(l, in.w, in.h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, demo_hier, 1); + get_region_boxes(l, buff[0].w, buff[0].h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, demo_hier, 1); } else { error("Last layer must produce detections\n"); } if (nms > 0) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); + printf("\033[2J"); printf("\033[1;1H"); printf("\nFPS:%.1f\n",fps); printf("Objects:\n\n"); + image display = buff[(buff_index+2) % 3]; + draw_detections(display, demo_detections, demo_thresh, boxes, probs, demo_names, demo_alphabet, demo_classes); - images[demo_index] = det; - det = images[(demo_index + FRAMES/2 + 1)%FRAMES]; - demo_index = (demo_index + 1)%FRAMES; - - draw_detections(det, l.w*l.h*l.n, demo_thresh, boxes, probs, demo_names, demo_alphabet, demo_classes); + demo_index = (demo_index + 1)%demo_frame; + running = 0; + return 0; +} +void *fetch_in_thread(void *ptr) +{ + int status = fill_image_from_stream(cap, buff[buff_index]); + letterbox_image_into(buff[buff_index], net.w, net.h, buff_letter[buff_index]); + if(status == 0) demo_done = 1; return 0; } -double get_wall_time() +void *display_in_thread(void *ptr) { - struct timeval time; - if (gettimeofday(&time,NULL)){ + show_image_cv(buff[(buff_index + 1)%3], "Demo", ipl); + int c = cvWaitKey(1); + if (c != -1) c = c%256; + if (c == 10){ + if(demo_delay == 0) demo_delay = 60; + else if(demo_delay == 5) demo_delay = 0; + else if(demo_delay == 60) demo_delay = 5; + else demo_delay = 0; + } else if (c == 27) { + demo_done = 1; return 0; + } else if (c == 82) { + demo_thresh += .02; + } else if (c == 84) { + demo_thresh -= .02; + if(demo_thresh <= .02) demo_thresh = .02; + } else if (c == 83) { + demo_hier += .02; + } else if (c == 81) { + demo_hier -= .02; + if(demo_hier <= .0) demo_hier = .0; + } + return 0; +} + +void *display_loop(void *ptr) +{ + while(1){ + display_in_thread(0); } - return (double)time.tv_sec + (double)time.tv_usec * .000001; } -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier, int w, int h, int frames, int fullscreen) +void *detect_loop(void *ptr) { - //skip = frame_skip; + while(1){ + detect_in_thread(0); + } +} + +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen) +{ + demo_delay = delay; + demo_frame = avg_frames; + predictions = calloc(demo_frame, sizeof(float*)); image **alphabet = load_alphabet(); - int delay = frame_skip; demo_names = names; demo_alphabet = alphabet; demo_classes = classes; @@ -106,6 +150,8 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch load_weights(&net, weightfile); } set_batch_network(&net, 1); + pthread_t detect_thread; + pthread_t fetch_thread; srand(2222222); @@ -129,36 +175,25 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(!cap) error("Couldn't connect to webcam.\n"); layer l = net.layers[net.n-1]; + demo_detections = l.n*l.w*l.h; int j; avg = (float *) calloc(l.outputs, sizeof(float)); - for(j = 0; j < FRAMES; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float)); - for(j = 0; j < FRAMES; ++j) images[j] = make_image(1,1,3); + last_avg = (float *) calloc(l.outputs, sizeof(float)); + last_avg2 = (float *) calloc(l.outputs, sizeof(float)); + for(j = 0; j < demo_frame; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float)); boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box)); probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes, sizeof(float)); - - pthread_t fetch_thread; - pthread_t detect_thread; - - fetch_in_thread(0); - det = in; - det_s = in_s; + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes+1, sizeof(float)); - fetch_in_thread(0); - detect_in_thread(0); - disp = det; - det = in; - det_s = in_s; - - for(j = 0; j < FRAMES/2; ++j){ - fetch_in_thread(0); - detect_in_thread(0); - disp = det; - det = in; - det_s = in_s; - } + buff[0] = get_image_from_stream(cap); + buff[1] = copy_image(buff[0]); + buff[2] = copy_image(buff[0]); + buff_letter[0] = letterbox_image(buff[0], net.w, net.h); + buff_letter[1] = letterbox_image(buff[0], net.w, net.h); + buff_letter[2] = letterbox_image(buff[0], net.w, net.h); + ipl = cvCreateImage(cvSize(buff[0].w,buff[0].h), IPL_DEPTH_8U, buff[0].c); int count = 0; if(!prefix){ @@ -171,76 +206,34 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch } } - double before = get_wall_time(); - - while(1){ - ++count; - if(1){ - if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); - if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); - - if(!prefix){ - show_image(disp, "Demo"); - int c = cvWaitKey(1); - if (c != -1) c = c%256; - if (c == 10){ - if(frame_skip == 0) frame_skip = 60; - else if(frame_skip == 4) frame_skip = 0; - else if(frame_skip == 60) frame_skip = 4; - else frame_skip = 0; - } else if (c == 27) { - return; - } else if (c == 82) { - demo_thresh += .02; - } else if (c == 84) { - demo_thresh -= .02; - if(demo_thresh <= .02) demo_thresh = .02; - } else if (c == 83) { - demo_hier += .02; - } else if (c == 81) { - demo_hier -= .02; - if(demo_hier <= .0) demo_hier = .0; - } - }else{ - char buff[256]; - sprintf(buff, "%s_%08d", prefix, count); - save_image(disp, buff); - } - - pthread_join(fetch_thread, 0); - pthread_join(detect_thread, 0); - - if(delay == 0){ - free_image(disp); - disp = det; + demo_time = get_wall_time(); + + while(!demo_done){ + buff_index = (buff_index + 1) %3; + if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); + if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); + if(!prefix){ + if(count % (demo_delay+1) == 0){ + fps = 1./(get_wall_time() - demo_time); + demo_time = get_wall_time(); + float *swap = last_avg; + last_avg = last_avg2; + last_avg2 = swap; + memcpy(last_avg, avg, l.outputs*sizeof(float)); } - det = in; - det_s = in_s; - }else { - fetch_in_thread(0); - det = in; - det_s = in_s; - detect_in_thread(0); - if(delay == 0) { - free_image(disp); - disp = det; - } - show_image(disp, "Demo"); - cvWaitKey(1); - } - --delay; - if(delay < 0){ - delay = frame_skip; - - double after = get_wall_time(); - float curr = 1./(after - before); - fps = curr; - before = after; + display_in_thread(0); + }else{ + char name[256]; + sprintf(name, "%s_%08d", prefix, count); + save_image(buff[(buff_index + 1)%3], name); } + pthread_join(fetch_thread, 0); + pthread_join(detect_thread, 0); + ++count; } } #else -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh, int w, int h, int fps, int fullscreen) +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg, float hier, int w, int h, int frames, int fullscreen) { fprintf(stderr, "Demo needs OpenCV for webcam images.\n"); } diff --git a/src/demo.h b/src/demo.h index 2c64a4692c0..d920759c12a 100644 --- a/src/demo.h +++ b/src/demo.h @@ -2,6 +2,6 @@ #define DEMO_H #include "image.h" -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh, int w, int h, int fps, int fullscreen); +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, int avg, float hier_thresh, int w, int h, int fps, int fullscreen); #endif diff --git a/src/detection_layer.c b/src/detection_layer.c index f9b4e4e73ba..fd79cc70341 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -259,8 +259,8 @@ void forward_detection_layer_gpu(const detection_layer l, network net) return; } - float *in_cpu = calloc(l.batch*l.inputs, sizeof(float)); - float *truth_cpu = 0; + //float *in_cpu = calloc(l.batch*l.inputs, sizeof(float)); + //float *truth_cpu = 0; forward_detection_layer(l, net); cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); diff --git a/src/detector.c b/src/detector.c index b69d21ff568..c205f944d4b 100644 --- a/src/detector.c +++ b/src/detector.c @@ -292,7 +292,7 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *)); int m = plist->size; int i=0; @@ -428,7 +428,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *)); int m = plist->size; int i=0; @@ -521,7 +521,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) int j, k; box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *)); int m = plist->size; int i=0; @@ -659,6 +659,7 @@ void run_detector(int argc, char **argv) float hier_thresh = find_float_arg(argc, argv, "-hier", .5); int cam_index = find_int_arg(argc, argv, "-c", 0); int frame_skip = find_int_arg(argc, argv, "-s", 0); + int avg = find_int_arg(argc, argv, "-avg", 3); if(argc < 4){ fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]); return; @@ -707,6 +708,6 @@ void run_detector(int argc, char **argv) int classes = option_find_int(options, "classes", 20); char *name_list = option_find_str(options, "names", "data/names.list"); char **names = get_labels(name_list); - demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, hier_thresh, width, height, fps, fullscreen); + demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, avg, hier_thresh, width, height, fps, fullscreen); } } diff --git a/src/image.c b/src/image.c index a5cc135c33a..e1d19442acc 100644 --- a/src/image.c +++ b/src/image.c @@ -216,6 +216,7 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, if (alphabet) { image label = get_label(alphabet, names[class], (im.h*.03)/10); draw_label(im, top + width, left, label, rgb); + free_image(label); } } } @@ -394,6 +395,11 @@ void normalize_image2(image p) free(max); } +void copy_image_into(image src, image dest) +{ + memcpy(dest.data, src.data, src.h*src.w*src.c*sizeof(float)); +} + image copy_image(image p) { image copy = p; @@ -413,19 +419,16 @@ void rgbgr_image(image im) } #ifdef OPENCV -void show_image_cv(image p, const char *name) +void show_image_cv(image p, const char *name, IplImage *disp) { int x,y,k; - image copy = copy_image(p); - constrain_image(copy); - if(p.c == 3) rgbgr_image(copy); + if(p.c == 3) rgbgr_image(p); //normalize_image(copy); char buff[256]; //sprintf(buff, "%s (%d)", name, windows); sprintf(buff, "%s", name); - IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c); int step = disp->widthStep; cvNamedWindow(buff, CV_WINDOW_NORMAL); //cvMoveWindow(buff, 100*(windows%10) + 200*(windows/10), 100*(windows%10)); @@ -433,11 +436,10 @@ void show_image_cv(image p, const char *name) for(y = 0; y < p.h; ++y){ for(x = 0; x < p.w; ++x){ for(k= 0; k < p.c; ++k){ - disp->imageData[y*step + x*p.c + k] = (unsigned char)(get_pixel(copy,x,y,k)*255); + disp->imageData[y*step + x*p.c + k] = (unsigned char)(get_pixel(p,x,y,k)*255); } } } - free_image(copy); if(0){ int w = 448; int h = w*p.h/p.w; @@ -451,14 +453,18 @@ void show_image_cv(image p, const char *name) cvReleaseImage(&buffer); } cvShowImage(buff, disp); - cvReleaseImage(&disp); } #endif void show_image(image p, const char *name) { #ifdef OPENCV - show_image_cv(p, name); + IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c); + image copy = copy_image(p); + constrain_image(copy); + show_image_cv(copy, name, disp); + free_image(copy); + cvReleaseImage(&disp); #else fprintf(stderr, "Not compiled with OpenCV, saving to %s.png instead\n", name); save_image(p, name); @@ -467,23 +473,31 @@ void show_image(image p, const char *name) #ifdef OPENCV -image ipl_to_image(IplImage* src) +void ipl_into_image(IplImage* src, image im) { unsigned char *data = (unsigned char *)src->imageData; int h = src->height; int w = src->width; int c = src->nChannels; int step = src->widthStep; - image out = make_image(w, h, c); - int i, j, k, count=0;; + int i, j, k; - for(k= 0; k < c; ++k){ - for(i = 0; i < h; ++i){ + for(i = 0; i < h; ++i){ + for(k= 0; k < c; ++k){ for(j = 0; j < w; ++j){ - out.data[count++] = data[i*step + j*c + k]/255.; + im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.; } } } +} + +image ipl_to_image(IplImage* src) +{ + int h = src->height; + int w = src->width; + int c = src->nChannels; + image out = make_image(w, h, c); + ipl_into_image(src, out); return out; } @@ -513,6 +527,14 @@ image load_image_cv(char *filename, int channels) return out; } +void flush_stream_buffer(CvCapture *cap, int n) +{ + int i; + for(i = 0; i < n; ++i) { + cvQueryFrame(cap); + } +} + image get_image_from_stream(CvCapture *cap) { IplImage* src = cvQueryFrame(cap); @@ -522,6 +544,15 @@ image get_image_from_stream(CvCapture *cap) return im; } +int fill_image_from_stream(CvCapture *cap, image im) +{ + IplImage* src = cvQueryFrame(cap); + if (!src) return 0; + ipl_into_image(src, im); + rgbgr_image(im); + return 1; +} + void save_image_jpg(image p, const char *name) { image copy = copy_image(p); @@ -794,6 +825,22 @@ void composite_3d(char *f1, char *f2, char *out, int delta) #endif } +void letterbox_image_into(image im, int w, int h, image boxed) +{ + int new_w = im.w; + int new_h = im.h; + if (((float)w/im.w) < ((float)h/im.h)) { + new_w = w; + new_h = (im.h * w)/im.w; + } else { + new_h = h; + new_w = (im.w * h)/im.h; + } + image resized = resize_image(im, new_w, new_h); + embed_image(resized, boxed, (w-new_w)/2, (h-new_h)/2); + free_image(resized); +} + image letterbox_image(image im, int w, int h) { int new_w = im.w; diff --git a/src/image.h b/src/image.h index fd4ca414d0d..abe99d6cda6 100644 --- a/src/image.h +++ b/src/image.h @@ -29,7 +29,11 @@ typedef struct { #ifndef __cplusplus #ifdef OPENCV image get_image_from_stream(CvCapture *cap); +int fill_image_from_stream(CvCapture *cap, image im); image ipl_to_image(IplImage* src); +void ipl_into_image(IplImage* src, image im); +void flush_stream_buffer(CvCapture *cap, int n); +void show_image_cv(image p, const char *name, IplImage *disp); #endif #endif @@ -49,6 +53,7 @@ image random_crop_image(image im, int w, int h); image random_augment_image(image im, float angle, float aspect, int low, int high, int size); void random_distort_image(image im, float hue, float saturation, float exposure); image letterbox_image(image im, int w, int h); +void letterbox_image_into(image im, int w, int h, image boxed); image resize_image(image im, int w, int h); image resize_min(image im, int min); image resize_max(image im, int max); @@ -96,6 +101,7 @@ image make_random_image(int w, int h, int c); image make_empty_image(int w, int h, int c); image float_to_image(int w, int h, int c, float *data); image copy_image(image p); +void copy_image_into(image src, image dest); image load_image(char *filename, int w, int h, int c); image load_image_color(char *filename, int w, int h); image **load_alphabet(); diff --git a/src/region_layer.c b/src/region_layer.c index e9f18b526ea..a9a31208006 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -406,7 +406,7 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f probs[index][j] = (prob > thresh) ? prob : 0; if(prob > max) max = prob; // TODO REMOVE - // if (j != 15 && j != 16) probs[index][j] = 0; + // if (j == 56 ) probs[index][j] = 0; /* if (j != 0) probs[index][j] = 0; int blacklist[] = {121, 497, 482, 504, 122, 518,481, 418, 542, 491, 914, 478, 120, 510,500}; diff --git a/src/yolo.c b/src/yolo.c index 48d63dfb912..6ddfb6ef522 100644 --- a/src/yolo.c +++ b/src/yolo.c @@ -340,6 +340,7 @@ void run_yolo(int argc, char **argv) return; } + int avg = find_int_arg(argc, argv, "-avg", 1); char *cfg = argv[3]; char *weights = (argc > 4) ? argv[4] : 0; char *filename = (argc > 5) ? argv[5]: 0; @@ -347,5 +348,5 @@ void run_yolo(int argc, char **argv) else if(0==strcmp(argv[2], "train")) train_yolo(cfg, weights); else if(0==strcmp(argv[2], "valid")) validate_yolo(cfg, weights); else if(0==strcmp(argv[2], "recall")) validate_yolo_recall(cfg, weights); - else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, .5, 0,0,0,0); + else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, avg, .5, 0,0,0,0); } From 9358bbc57a27637fe96dd286f97c53b65df4ddf9 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 3 May 2017 15:23:03 -0700 Subject: [PATCH 015/118] coco dataset script --- scripts/get_coco_dataset.sh | 31 +++++++++++++++++++++++++++++++ src/lsd.c | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 scripts/get_coco_dataset.sh diff --git a/scripts/get_coco_dataset.sh b/scripts/get_coco_dataset.sh new file mode 100644 index 00000000000..28463015d17 --- /dev/null +++ b/scripts/get_coco_dataset.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Clone COCO API +git clone https://github.com/pdollar/coco +cd coco + +mkdir images +cd images + +# Download Images +wget -c https://pjreddie.com/media/files/train2014.zip +wget -c https://pjreddie.com/media/files/val2014.zip + +# Unzip +unzip -q train2014.zip +unzip -q val2014.zip + +cd .. + +# Download COCO Metadata +wget -c https://pjreddie.com/media/files/instances_train-val2014.zip +wget -c https://pjreddie.com/media/files/coco/5k.part +wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part +wget -c https://pjreddie.com/media/files/coco/labels.tgz +tar xzf labels.tgz +unzip -q instances_train-val2014.zip + +# Set Up Image Lists +paste <(awk "{print \"$PWD\"}" <5k.part) 5k.part | tr -d '\t' > 5k.txt +paste <(awk "{print \"$PWD\"}" trainvalno5k.txt + diff --git a/src/lsd.c b/src/lsd.c index bb0b0445f75..312679ae9e1 100644 --- a/src/lsd.c +++ b/src/lsd.c @@ -548,7 +548,7 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, printf("%f\n", genaloss); scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); - scal_ongpu(imlayer.outputs*imlayer.batch, .1, gnet.layers[gnet.n-1].delta_gpu, 1); + scal_ongpu(imlayer.outputs*imlayer.batch, .00, gnet.layers[gnet.n-1].delta_gpu, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); printf("features %f\n", cuda_mag_array(gnet.layers[gnet.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); From 40c9afa3816a60f7b126feec95b9742f4800fd50 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 3 May 2017 15:38:54 -0700 Subject: [PATCH 016/118] :fire: :darknet: :fire: --- src/detector.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/detector.c b/src/detector.c index c205f944d4b..12277b1a437 100644 --- a/src/detector.c +++ b/src/detector.c @@ -142,7 +142,15 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i i = get_current_batch(net); printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs); - if(i%1000==0 || (i < 1000 && i%100 == 0)){ + if(i%1000==0){ +#ifdef GPU + if(ngpus != 1) sync_nets(nets, ngpus, 0); +#endif + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, base); + save_weights(net, buff); + } + if(i%10000==0 || (i < 1000 && i%100 == 0)){ #ifdef GPU if(ngpus != 1) sync_nets(nets, ngpus, 0); #endif From 25a3e687a3627ac10682aa1a577adff03c0e0f2e Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 9 May 2017 15:57:22 -0700 Subject: [PATCH 017/118] let's break some shit --- Makefile | 8 ++++---- src/parser.c | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 029d02cb7b6..4f12f70b76b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -GPU=0 -CUDNN=0 -OPENCV=0 +GPU=1 +CUDNN=1 +OPENCV=1 DEBUG=0 ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ @@ -10,7 +10,7 @@ ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ -gencode arch=compute_52,code=[sm_52,compute_52] # This is what I use, uncomment if you know your arch and want to specify -# ARCH= -gencode arch=compute_52,code=compute_52 +ARCH= -gencode arch=compute_52,code=compute_52 VPATH=./src/ EXEC=darknet diff --git a/src/parser.c b/src/parser.c index 4add3573199..a1cf5f7d123 100644 --- a/src/parser.c +++ b/src/parser.c @@ -274,6 +274,7 @@ layer parse_region(list *options, size_params params) l.sqrt = option_find_int_quiet(options, "sqrt", 0); l.softmax = option_find_int(options, "softmax", 0); + l.background = option_find_int_quiet(options, "background", 0); l.max_boxes = option_find_int_quiet(options, "max",30); l.jitter = option_find_float(options, "jitter", .2); l.rescore = option_find_int_quiet(options, "rescore",0); From 07017701c29bdf4386ddd6d799c5247c1cf70ed1 Mon Sep 17 00:00:00 2001 From: Lilo Huang Date: Sun, 14 May 2017 14:59:10 +0800 Subject: [PATCH 018/118] Fix crash (SIGSEGV) on running ./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg The extern symbol of test_detector is wrong on darknet.c which leads to a SIGSEGV error. --- src/darknet.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/darknet.c b/src/darknet.c index a3aa65557e7..108343dff13 100644 --- a/src/darknet.c +++ b/src/darknet.c @@ -9,7 +9,7 @@ #include "connected_layer.h" extern void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top); -extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh); +extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen); extern void run_voxel(int argc, char **argv); extern void run_yolo(int argc, char **argv); extern void run_detector(int argc, char **argv); @@ -423,7 +423,9 @@ int main(int argc, char **argv) } else if (0 == strcmp(argv[1], "detect")){ float thresh = find_float_arg(argc, argv, "-thresh", .24); char *filename = (argc > 4) ? argv[4]: 0; - test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5); + char *outfile = find_char_arg(argc, argv, "-out", 0); + int fullscreen = find_arg(argc, argv, "-fullscreen"); + test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen); } else if (0 == strcmp(argv[1], "cifar")){ run_cifar(argc, argv); } else if (0 == strcmp(argv[1], "go")){ From 88b9ecb41438cc4cd086720b168b8dba4b02cb8e Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sat, 27 May 2017 21:41:55 -0700 Subject: [PATCH 019/118] In chess, the pawns go first --- Makefile | 2 +- src/classifier.c | 2 +- src/darknet.c | 3 + src/data.c | 128 +++++++++++++++++++++- src/data.h | 3 +- src/image.c | 42 ++++++- src/image.h | 15 ++- src/layer.h | 1 + src/parser.c | 4 + src/region_layer.c | 38 ++++--- src/segmenter.c | 262 ++++++++++++++++++++++++++++++++++++++++++++ src/softmax_layer.c | 6 +- 12 files changed, 476 insertions(+), 30 deletions(-) create mode 100644 src/segmenter.c diff --git a/Makefile b/Makefile index 4f12f70b76b..3bbaa5c07cf 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o detector.o layer.o compare.o regressor.o classifier.o local_layer.o swag.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o rnn.o rnn_vid.o crnn_layer.o demo.o tag.o cifar.o go.o batchnorm_layer.o art.o region_layer.o reorg_layer.o lsd.o super.o voxel.o tree.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o detector.o layer.o compare.o segmenter.o regressor.o classifier.o local_layer.o swag.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o rnn.o rnn_vid.o crnn_layer.o demo.o tag.o cifar.o go.o batchnorm_layer.o art.o region_layer.o reorg_layer.o lsd.o super.o voxel.o tree.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o network_kernels.o avgpool_layer_kernels.o diff --git a/src/classifier.c b/src/classifier.c index 039ad66820f..4f6a1a0bc50 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -700,7 +700,7 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi float *predictions = network_predict(net, X); if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 1, 1); top_k(predictions, net.outputs, top, indexes); - printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + fprintf(stderr, "%s: Predicted in %f seconds.\n", input, sec(clock()-time)); for(i = 0; i < top; ++i){ int index = indexes[i]; //if(net.hierarchy) printf("%d, %s: %f, parent: %s \n",index, names[index], predictions[index], (net.hierarchy->parent[index] >= 0) ? names[net.hierarchy->parent[index]] : "Root"); diff --git a/src/darknet.c b/src/darknet.c index 108343dff13..b69cd4361e8 100644 --- a/src/darknet.c +++ b/src/darknet.c @@ -21,6 +21,7 @@ extern void run_dice(int argc, char **argv); extern void run_compare(int argc, char **argv); extern void run_classifier(int argc, char **argv); extern void run_regressor(int argc, char **argv); +extern void run_segmenter(int argc, char **argv); extern void run_char_rnn(int argc, char **argv); extern void run_vid_rnn(int argc, char **argv); extern void run_tag(int argc, char **argv); @@ -442,6 +443,8 @@ int main(int argc, char **argv) run_classifier(argc, argv); } else if (0 == strcmp(argv[1], "regressor")){ run_regressor(argc, argv); + } else if (0 == strcmp(argv[1], "segmenter")){ + run_segmenter(argc, argv); } else if (0 == strcmp(argv[1], "art")){ run_art(argc, argv); } else if (0 == strcmp(argv[1], "tag")){ diff --git a/src/data.c b/src/data.c index e78b17edc1d..dcc5089b025 100644 --- a/src/data.c +++ b/src/data.c @@ -116,7 +116,7 @@ matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, if(center){ crop = center_crop_image(im, size, size); } else { - crop = random_augment_image(im, angle, aspect, min, max, size); + crop = random_augment_image(im, angle, aspect, min, max, size, size); } int flip = rand()%2; if (flip) flip_image(crop); @@ -511,6 +511,119 @@ void free_data(data d) } } +void load_rle(image im, int *rle, int n) +{ + int count = 0; + int curr = 0; + int i,j; + for(i = 0; i < n; ++i){ + for(j = 0; j < rle[i]; ++j){ + im.data[count++] = curr; + } + curr = 1 - curr; + } + for(; count < im.h*im.w*im.c; ++count){ + im.data[count] = curr; + } +} + +void or_image(image src, image dest, int c) +{ + int i; + for(i = 0; i < src.w*src.h; ++i){ + if(src.data[i]) dest.data[dest.w*dest.h*c + i] = 1; + } +} + +void fill_bg_mask(image m) +{ + int i,k; + int index = m.w*m.h*(m.c-1); + for(i = 0; i < m.w*m.h; ++i){ + m.data[index + i] = 1; + } + for(k = 0; k < m.c-1; ++k){ + for(i = 0; i < m.w*m.h; ++i){ + if(m.data[index + i] && m.data[k*m.w*m.h + i]) m.data[index + i] = 0; + } + } +} + +image get_segmentation_image(char *path, int w, int h, int classes) +{ + char labelpath[4096]; + find_replace(path, "images", "mask", labelpath); + find_replace(labelpath, "JPEGImages", "mask", labelpath); + find_replace(labelpath, ".jpg", ".txt", labelpath); + find_replace(labelpath, ".JPG", ".txt", labelpath); + find_replace(labelpath, ".JPEG", ".txt", labelpath); + image mask = make_image(w, h, classes+1); + FILE *file = fopen(labelpath, "r"); + if(!file) file_error(labelpath); + char buff[32788]; + int id; + image part = make_image(w, h, 1); + while(fscanf(file, "%d %s", &id, buff) == 2){ + int n = 0; + int *rle = read_intlist(buff, &n, 0); + load_rle(part, rle, n); + or_image(part, mask, id); + free(rle); + } + fill_bg_mask(mask); + fclose(file); + free_image(part); + return mask; +} + +data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int min, int max, float angle, float aspect, float hue, float saturation, float exposure) +{ + char **random_paths = get_random_paths(paths, n, m); + int i; + data d = {0}; + d.shallow = 0; + + d.X.rows = n; + d.X.vals = calloc(d.X.rows, sizeof(float*)); + d.X.cols = h*w*3; + + + d.y.rows = n; + d.y.cols = h*w*(classes+1); + d.y.vals = calloc(d.X.rows, sizeof(float*)); + + for(i = 0; i < n; ++i){ + image orig = load_image_color(random_paths[i], 0, 0); + augment_args a = random_augment_args(orig, angle, aspect, min, max, w, h); + image sized = rotate_crop_image(orig, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect); + + int flip = rand()%2; + if(flip) flip_image(sized); + random_distort_image(sized, hue, saturation, exposure); + d.X.vals[i] = sized.data; + + image mask = get_segmentation_image(random_paths[i], orig.w, orig.h, classes); + //image mask = make_image(orig.w, orig.h, classes+1); + image sized_m = rotate_crop_image(mask, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect); + + if(flip) flip_image(sized_m); + d.y.vals[i] = sized_m.data; + + free_image(orig); + free_image(mask); + + /* + image rgb = mask_to_rgb(sized_m, classes); + show_image(rgb, "part"); + show_image(sized, "orig"); + cvWaitKey(0); + free_image(rgb); + */ + } + free(random_paths); + return d; +} + data load_data_region(int n, char **paths, int m, int w, int h, int size, int classes, float jitter, float hue, float saturation, float exposure) { char **random_paths = get_random_paths(paths, n, m); @@ -698,7 +811,7 @@ data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, in image orig = load_image_color(random_paths[i], 0, 0); image sized = make_image(w, h, orig.c); fill_image(sized, .5); - + float dw = jitter * orig.w; float dh = jitter * orig.h; @@ -706,7 +819,7 @@ data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, in float scale = rand_uniform(.25, 2); float nw, nh; - + if(new_ar < 1){ nh = scale * h; nw = nh * new_ar; @@ -752,6 +865,8 @@ void *load_thread(void *ptr) *a.d = load_data_super(a.paths, a.n, a.m, a.w, a.h, a.scale); } else if (a.type == WRITING_DATA){ *a.d = load_data_writing(a.paths, a.n, a.m, a.w, a.h, a.out_w, a.out_h); + } else if (a.type == SEGMENTATION_DATA){ + *a.d = load_data_seg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } else if (a.type == REGION_DATA){ *a.d = load_data_region(a.n, a.paths, a.m, a.w, a.h, a.num_boxes, a.classes, a.jitter, a.hue, a.saturation, a.exposure); } else if (a.type == DETECTION_DATA){ @@ -811,6 +926,13 @@ void *load_threads(void *ptr) return 0; } +void load_data_blocking(load_args args) +{ + struct load_args *ptr = calloc(1, sizeof(struct load_args)); + *ptr = args; + load_thread(ptr); +} + pthread_t load_data(load_args args) { pthread_t thread; diff --git a/src/data.h b/src/data.h index 16b334dcec0..c366d66e078 100644 --- a/src/data.h +++ b/src/data.h @@ -28,7 +28,7 @@ typedef struct{ } data; typedef enum { - CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA + CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA, SEGMENTATION_DATA } data_type; typedef struct load_args{ @@ -72,6 +72,7 @@ typedef struct{ void free_data(data d); pthread_t load_data(load_args args); +void load_data_blocking(load_args args); pthread_t load_data_in_thread(load_args args); diff --git a/src/image.c b/src/image.c index e1d19442acc..1a8c984a6e8 100644 --- a/src/image.c +++ b/src/image.c @@ -25,6 +25,25 @@ float get_color(int c, int x, int max) return r; } +image mask_to_rgb(image mask) +{ + int n = mask.c; + image im = make_image(mask.w, mask.h, 3); + int i, j; + for(j = 0; j < n; ++j){ + int offset = j*123457 % n; + float red = get_color(2,offset,n); + float green = get_color(1,offset,n); + float blue = get_color(0,offset,n); + for(i = 0; i < im.w*im.h; ++i){ + im.data[i + 0*im.w*im.h] = mask.data[j*im.h*im.w + i]*red; + im.data[i + 1*im.w*im.h] = mask.data[j*im.h*im.w + i]*green; + im.data[i + 2*im.w*im.h] = mask.data[j*im.h*im.w + i]*blue; + } + } + return im; +} + void composite_image(image source, image dest, int dx, int dy) { int x,y,k; @@ -902,8 +921,9 @@ image random_crop_image(image im, int w, int h) return crop; } -image random_augment_image(image im, float angle, float aspect, int low, int high, int size) +augment_args random_augment_args(image im, float angle, float aspect, int low, int high, int w, int h) { + augment_args a = {0}; aspect = rand_scale(aspect); int r = rand_int(low, high); int min = (im.h < im.w*aspect) ? im.h : im.w*aspect; @@ -911,15 +931,27 @@ image random_augment_image(image im, float angle, float aspect, int low, int hig float rad = rand_uniform(-angle, angle) * TWO_PI / 360.; - float dx = (im.w*scale/aspect - size) / 2.; - float dy = (im.h*scale - size) / 2.; + float dx = (im.w*scale/aspect - w) / 2.; + float dy = (im.h*scale - w) / 2.; if(dx < 0) dx = 0; if(dy < 0) dy = 0; dx = rand_uniform(-dx, dx); dy = rand_uniform(-dy, dy); - image crop = rotate_crop_image(im, rad, scale, size, size, dx, dy, aspect); + a.rad = rad; + a.scale = scale; + a.w = w; + a.h = h; + a.dx = dx; + a.dy = dy; + a.aspect = aspect; + return a; +} +image random_augment_image(image im, float angle, float aspect, int low, int high, int w, int h) +{ + augment_args a = random_augment_args(im, angle, aspect, low, high, w, h); + image crop = rotate_crop_image(im, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect); return crop; } @@ -1300,7 +1332,7 @@ void test_resize(char *filename) show_image(c4, "C4"); #ifdef OPENCV while(1){ - image aug = random_augment_image(im, 0, .75, 320, 448, 320); + image aug = random_augment_image(im, 0, .75, 320, 448, 320, 320); show_image(aug, "aug"); free_image(aug); diff --git a/src/image.h b/src/image.h index abe99d6cda6..7201515cf9e 100644 --- a/src/image.h +++ b/src/image.h @@ -19,6 +19,16 @@ #endif #endif +typedef struct { + int w; + int h; + float scale; + float rad; + float dx; + float dy; + float aspect; +} augment_args; + typedef struct { int h; int w; @@ -37,6 +47,7 @@ void show_image_cv(image p, const char *name, IplImage *disp); #endif #endif +image mask_to_rgb(image mask); float get_color(int c, int x, int max); void flip_image(image a); void draw_box(image a, int x1, int y1, int x2, int y2, float r, float g, float b); @@ -48,9 +59,11 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, image image_distance(image a, image b); void scale_image(image m, float s); image crop_image(image im, int dx, int dy, int w, int h); +image rotate_crop_image(image im, float rad, float s, int w, int h, float dx, float dy, float aspect); image center_crop_image(image im, int w, int h); image random_crop_image(image im, int w, int h); -image random_augment_image(image im, float angle, float aspect, int low, int high, int size); +image random_augment_image(image im, float angle, float aspect, int low, int high, int w, int h); +augment_args random_augment_args(image im, float angle, float aspect, int low, int high, int w, int h); void random_distort_image(image im, float hue, float saturation, float exposure); image letterbox_image(image im, int w, int h); void letterbox_image_into(image im, int w, int h, image boxed); diff --git a/src/layer.h b/src/layer.h index 2470d84c87e..620d367419a 100644 --- a/src/layer.h +++ b/src/layer.h @@ -73,6 +73,7 @@ struct layer{ int stride; int reverse; int flatten; + int spatial; int pad; int sqrt; int flip; diff --git a/src/parser.c b/src/parser.c index a1cf5f7d123..47f2629a75e 100644 --- a/src/parser.c +++ b/src/parser.c @@ -258,6 +258,10 @@ softmax_layer parse_softmax(list *options, size_params params) layer.temperature = option_find_float_quiet(options, "temperature", 1); char *tree_file = option_find_str(options, "tree", 0); if (tree_file) layer.softmax_tree = read_tree(tree_file); + layer.w = params.w; + layer.h = params.h; + layer.c = params.c; + layer.spatial = option_find_float_quiet(options, "spatial", 0); return layer; } diff --git a/src/region_layer.c b/src/region_layer.c index a9a31208006..5fe931c67f0 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -29,7 +29,7 @@ layer make_region_layer(int batch, int w, int h, int n, int classes, int coords) l.bias_updates = calloc(n*2, sizeof(float)); l.outputs = h*w*n*(classes + coords + 1); l.inputs = l.outputs; - l.truths = 30*(5); + l.truths = 30*(l.coords + 1); l.delta = calloc(batch*l.outputs, sizeof(float)); l.output = calloc(batch*l.outputs, sizeof(float)); int i; @@ -153,7 +153,7 @@ void forward_region_layer(const layer l, network net) int index = entry_index(l, b, n*l.w*l.h, 0); activate_array(l.output + index, 2*l.w*l.h, LOGISTIC); index = entry_index(l, b, n*l.w*l.h, 4); - activate_array(l.output + index, l.w*l.h, LOGISTIC); + if(!l.background) activate_array(l.output + index, l.w*l.h, LOGISTIC); } } if (l.softmax_tree){ @@ -165,8 +165,8 @@ void forward_region_layer(const layer l, network net) count += group_size; } } else if (l.softmax){ - int index = entry_index(l, 0, 0, 5); - softmax_cpu(net.input + index, l.classes, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output + index); + int index = entry_index(l, 0, 0, l.coords + !l.background); + softmax_cpu(net.input + index, l.classes + l.background, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output + index); } #endif @@ -184,9 +184,9 @@ void forward_region_layer(const layer l, network net) if(l.softmax_tree){ int onlyclass = 0; for(t = 0; t < 30; ++t){ - box truth = float_to_box(net.truth + t*5 + b*l.truths, 1); + box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; - int class = net.truth[t*5 + b*l.truths + 4]; + int class = net.truth[t*(l.coords + 1) + b*l.truths + 4]; float maxp = 0; int maxi = 0; if(truth.x > 100000 && truth.y > 100000){ @@ -230,6 +230,7 @@ void forward_region_layer(const layer l, network net) int obj_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 4); avg_anyobj += l.output[obj_index]; l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); + if(l.background) l.delta[obj_index] = l.noobject_scale * (1 - l.output[obj_index]); if (best_iou > l.thresh) { l.delta[obj_index] = 0; } @@ -282,16 +283,19 @@ void forward_region_layer(const layer l, network net) avg_iou += iou; //l.delta[best_index + 4] = iou - l.output[best_index + 4]; - int obj_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 4); + int obj_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, l.coords); avg_obj += l.output[obj_index]; l.delta[obj_index] = l.object_scale * (1 - l.output[obj_index]); if (l.rescore) { l.delta[obj_index] = l.object_scale * (iou - l.output[obj_index]); } + if(l.background){ + l.delta[obj_index] = l.object_scale * (0 - l.output[obj_index]); + } - int class = net.truth[t*5 + b*l.truths + 4]; + int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; if (l.map) class = l.map[class]; - int class_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 5); + int class_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, l.coords + 1); delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); ++count; ++class_count; @@ -380,10 +384,10 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f } int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4); int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); - float scale = predictions[obj_index]; + float scale = l.background ? 1 : predictions[obj_index]; boxes[index] = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h, l.w*l.h); - int class_index = entry_index(l, 0, n*l.w*l.h + i, 5); + int class_index = entry_index(l, 0, n*l.w*l.h + i, l.coords + !l.background); if(l.softmax_tree){ hierarchy_predictions(predictions + class_index, l.classes, l.softmax_tree, 0, l.w*l.h); @@ -436,8 +440,8 @@ void forward_region_layer_gpu(const layer l, network net) for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); activate_array_ongpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC); - index = entry_index(l, b, n*l.w*l.h, 4); - activate_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC); + index = entry_index(l, b, n*l.w*l.h, l.coords); + if(!l.background) activate_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC); } } if (l.softmax_tree){ @@ -450,9 +454,9 @@ void forward_region_layer_gpu(const layer l, network net) count += group_size; } } else if (l.softmax) { - int index = entry_index(l, 0, 0, 5); + int index = entry_index(l, 0, 0, l.coords + !l.background); //printf("%d\n", index); - softmax_gpu(net.input_gpu + index, l.classes, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); + softmax_gpu(net.input_gpu + index, l.classes + l.background, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); } if(!net.train || l.onlyforward){ cuda_pull_array(l.output_gpu, l.output, l.batch*l.outputs); @@ -479,8 +483,8 @@ void backward_region_layer_gpu(const layer l, network net) for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); gradient_array_ongpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); - index = entry_index(l, b, n*l.w*l.h, 4); - gradient_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); + index = entry_index(l, b, n*l.w*l.h, l.coords); + if(!l.background) gradient_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); } } axpy_ongpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); diff --git a/src/segmenter.c b/src/segmenter.c new file mode 100644 index 00000000000..fab66cb0f68 --- /dev/null +++ b/src/segmenter.c @@ -0,0 +1,262 @@ +#include "network.h" +#include "utils.h" +#include "parser.h" +#include "option_list.h" +#include "blas.h" +#include "assert.h" +#include "cuda.h" +#include + +void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) +{ + int i; + + float avg_loss = -1; + char *base = basecfg(cfgfile); + printf("%s\n", base); + printf("%d\n", ngpus); + network *nets = calloc(ngpus, sizeof(network)); + + srand(time(0)); + int seed = rand(); + for(i = 0; i < ngpus; ++i){ + srand(seed); +#ifdef GPU + cuda_set_device(gpus[i]); +#endif + nets[i] = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&nets[i], weightfile); + } + if(clear) *nets[i].seen = 0; + nets[i].learning_rate *= ngpus; + } + srand(time(0)); + network net = nets[0]; + + int imgs = net.batch * net.subdivisions * ngpus; + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + list *options = read_data_cfg(datacfg); + + char *backup_directory = option_find_str(options, "backup", "/backup/"); + char *train_list = option_find_str(options, "train", "data/train.list"); + + list *plist = get_paths(train_list); + char **paths = (char **)list_to_array(plist); + printf("%d\n", plist->size); + int N = plist->size; + clock_t time; + + load_args args = {0}; + args.w = net.w; + args.h = net.h; + args.threads = 32; + + args.min = net.min_crop; + args.max = net.max_crop; + args.angle = net.angle; + args.aspect = net.aspect; + args.exposure = net.exposure; + args.saturation = net.saturation; + args.hue = net.hue; + args.size = net.w; + args.classes = 80; + + args.paths = paths; + args.n = imgs; + args.m = N; + args.type = SEGMENTATION_DATA; + + data train; + data buffer; + pthread_t load_thread; + args.d = &buffer; + load_thread = load_data(args); + + int epoch = (*net.seen)/N; + while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + time=clock(); + + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + time=clock(); + + float loss = 0; +#ifdef GPU + if(ngpus == 1){ + loss = train_network(net, train); + } else { + loss = train_networks(nets, ngpus, train, 4); + } +#else + loss = train_network(net, train); +#endif + if(avg_loss == -1) avg_loss = loss; + avg_loss = avg_loss*.9 + loss*.1; + printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + free_data(train); + if(*net.seen/N > epoch){ + epoch = *net.seen/N; + char buff[256]; + sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); + save_weights(net, buff); + } + if(get_current_batch(net)%100 == 0){ + char buff[256]; + sprintf(buff, "%s/%s.backup",backup_directory,base); + save_weights(net, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s.weights", backup_directory, base); + save_weights(net, buff); + + free_network(net); + free_ptrs((void**)paths, plist->size); + free_list(plist); + free(base); +} + +void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *filename) +{ + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + set_batch_network(&net, 1); + srand(2222222); + + clock_t time; + char buff[256]; + char *input = buff; + while(1){ + if(filename){ + strncpy(input, filename, 256); + }else{ + printf("Enter Image Path: "); + fflush(stdout); + input = fgets(input, 256, stdin); + if(!input) return; + strtok(input, "\n"); + } + image im = load_image_color(input, 0, 0); + image sized = letterbox_image(im, net.w, net.h); + + float *X = sized.data; + time=clock(); + float *predictions = network_predict(net, X); + image m = float_to_image(sized.w, sized.h, 80, predictions); + image rgb = mask_to_rgb(m); + show_image(sized, "orig"); + show_image(rgb, "pred"); + cvWaitKey(0); + printf("Predicted: %f\n", predictions[0]); + printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + free_image(im); + free_image(sized); + free_image(rgb); + if (filename) break; + } +} + + +void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename) +{ +#ifdef OPENCV + printf("Regressor Demo\n"); + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + set_batch_network(&net, 1); + + srand(2222222); + CvCapture * cap; + + if(filename){ + cap = cvCaptureFromFile(filename); + }else{ + cap = cvCaptureFromCAM(cam_index); + } + + if(!cap) error("Couldn't connect to webcam.\n"); + cvNamedWindow("Regressor", CV_WINDOW_NORMAL); + cvResizeWindow("Regressor", 512, 512); + float fps = 0; + + while(1){ + struct timeval tval_before, tval_after, tval_result; + gettimeofday(&tval_before, NULL); + + image in = get_image_from_stream(cap); + image in_s = letterbox_image(in, net.w, net.h); + show_image(in, "Regressor"); + + float *predictions = network_predict(net, in_s.data); + + printf("\033[2J"); + printf("\033[1;1H"); + printf("\nFPS:%.0f\n",fps); + + printf("People: %f\n", predictions[0]); + + free_image(in_s); + free_image(in); + + cvWaitKey(10); + + gettimeofday(&tval_after, NULL); + timersub(&tval_after, &tval_before, &tval_result); + float curr = 1000000.f/((long int)tval_result.tv_usec); + fps = .9*fps + .1*curr; + } +#endif +} + + +void run_segmenter(int argc, char **argv) +{ + if(argc < 4){ + fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]); + return; + } + + char *gpu_list = find_char_arg(argc, argv, "-gpus", 0); + int *gpus = 0; + int gpu = 0; + int ngpus = 0; + if(gpu_list){ + printf("%s\n", gpu_list); + int len = strlen(gpu_list); + ngpus = 1; + int i; + for(i = 0; i < len; ++i){ + if (gpu_list[i] == ',') ++ngpus; + } + gpus = calloc(ngpus, sizeof(int)); + for(i = 0; i < ngpus; ++i){ + gpus[i] = atoi(gpu_list); + gpu_list = strchr(gpu_list, ',')+1; + } + } else { + gpu = gpu_index; + gpus = &gpu; + ngpus = 1; + } + + int cam_index = find_int_arg(argc, argv, "-c", 0); + int clear = find_arg(argc, argv, "-clear"); + char *data = argv[3]; + char *cfg = argv[4]; + char *weights = (argc > 5) ? argv[5] : 0; + char *filename = (argc > 6) ? argv[6]: 0; + if(0==strcmp(argv[2], "test")) predict_segmenter(data, cfg, weights, filename); + else if(0==strcmp(argv[2], "train")) train_segmenter(data, cfg, weights, gpus, ngpus, clear); + else if(0==strcmp(argv[2], "demo")) demo_segmenter(data, cfg, weights, cam_index, filename); +} + + diff --git a/src/softmax_layer.c b/src/softmax_layer.c index 1eb6e972c7e..86b0237c5dd 100644 --- a/src/softmax_layer.c +++ b/src/softmax_layer.c @@ -70,7 +70,11 @@ void forward_softmax_layer_gpu(const softmax_layer l, network net) count += group_size; } } else { - softmax_gpu(net.input_gpu, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output_gpu); + if(l.spatial){ + softmax_gpu(net.input_gpu, l.c, l.batch*l.c, l.inputs/l.c, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu); + }else{ + softmax_gpu(net.input_gpu, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output_gpu); + } } } From 579e588c84c0d5bf23f9ec7197af90e5bb3579e9 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 29 May 2017 11:59:27 -0700 Subject: [PATCH 020/118] faster :tree: softmax --- src/blas.h | 2 ++ src/blas_kernels.cu | 31 +++++++++++++++++++++++++++++++ src/cuda.c | 7 ++++++- src/cuda.h | 2 +- src/maxpool_layer.c | 4 ++-- src/region_layer.c | 5 ++++- src/segmenter.c | 2 +- 7 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/blas.h b/src/blas.h index 968bb955237..a61b7d8ca66 100644 --- a/src/blas.h +++ b/src/blas.h @@ -41,6 +41,7 @@ void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, i #ifdef GPU #include "cuda.h" +#include "tree.h" void axpy_ongpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY); void axpy_ongpu_offset(int N, float ALPHA, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); @@ -86,6 +87,7 @@ void softmax_gpu(float *input, int n, int batch, int batch_offset, int groups, i void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rate, float eps, int t); void flatten_ongpu(float *x, int spatial, int layers, int batch, int forward, float *out); +void softmax_tree(float *input, int spatial, int batch, int stride, float temp, float *output, tree hier); #endif #endif diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index ac29d3f0bca..9f1337ca6bc 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -788,6 +788,37 @@ __device__ void softmax_device(float *input, int n, float temp, int stride, floa } } + +__global__ void softmax_tree_kernel(float *input, int spatial, int batch, int stride, float temp, float *output, int groups, int *group_size, int *group_offset) +{ + int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if (id >= spatial*batch*groups) return; + int s = id % spatial; + id = id / spatial; + int g = id % groups; + int b = id / groups; + int goff = group_offset[g]*spatial; + int boff = b*stride; + softmax_device(input + goff + boff + s, group_size[g], temp, spatial, output + goff + boff + s); +} + +extern "C" void softmax_tree(float *input, int spatial, int batch, int stride, float temp, float *output, tree hier) +{ + //int *tree_groups_size = cuda_make_int_array(hier.group_size, hier.groups); + //int *tree_groups_offset = cuda_make_int_array(hier.group_offset, hier.groups); + static int *tree_groups_size = 0; + static int *tree_groups_offset = 0; + if(!tree_groups_size){ + tree_groups_size = cuda_make_int_array(hier.group_size, hier.groups); + tree_groups_offset = cuda_make_int_array(hier.group_offset, hier.groups); + } + int num = spatial*batch*hier.groups; + softmax_tree_kernel<<>>(input, spatial, batch, stride, temp, output, hier.groups, tree_groups_size, tree_groups_offset); + check_error(cudaPeekAtLastError()); + //cuda_free((float *)tree_groups_size); + //cuda_free((float *)tree_groups_offset); +} + __global__ void softmax_kernel(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output) { int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; diff --git a/src/cuda.c b/src/cuda.c index af3d412b564..7e53d2540dc 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -128,12 +128,17 @@ float cuda_compare(float *x_gpu, float *x, size_t n, char *s) return err; } -int *cuda_make_int_array(size_t n) +int *cuda_make_int_array(int *x, size_t n) { int *x_gpu; size_t size = sizeof(int)*n; cudaError_t status = cudaMalloc((void **)&x_gpu, size); check_error(status); + if(x){ + status = cudaMemcpy(x_gpu, x, size, cudaMemcpyHostToDevice); + check_error(status); + } + if(!x_gpu) error("Cuda malloc failed\n"); return x_gpu; } diff --git a/src/cuda.h b/src/cuda.h index a825ded5893..52794fa4a04 100644 --- a/src/cuda.h +++ b/src/cuda.h @@ -18,7 +18,7 @@ extern int gpu_index; void check_error(cudaError_t status); cublasHandle_t blas_handle(); float *cuda_make_array(float *x, size_t n); -int *cuda_make_int_array(size_t n); +int *cuda_make_int_array(int *x, size_t n); void cuda_push_array(float *x_gpu, float *x, size_t n); void cuda_pull_array(float *x_gpu, float *x, size_t n); void cuda_set_device(int n); diff --git a/src/maxpool_layer.c b/src/maxpool_layer.c index 7b3a836b9bf..17dedf7a14c 100644 --- a/src/maxpool_layer.c +++ b/src/maxpool_layer.c @@ -43,7 +43,7 @@ maxpool_layer make_maxpool_layer(int batch, int h, int w, int c, int size, int s #ifdef GPU l.forward_gpu = forward_maxpool_layer_gpu; l.backward_gpu = backward_maxpool_layer_gpu; - l.indexes_gpu = cuda_make_int_array(output_size); + l.indexes_gpu = cuda_make_int_array(0, output_size); l.output_gpu = cuda_make_array(l.output, output_size); l.delta_gpu = cuda_make_array(l.delta, output_size); #endif @@ -70,7 +70,7 @@ void resize_maxpool_layer(maxpool_layer *l, int w, int h) cuda_free((float *)l->indexes_gpu); cuda_free(l->output_gpu); cuda_free(l->delta_gpu); - l->indexes_gpu = cuda_make_int_array(output_size); + l->indexes_gpu = cuda_make_int_array(0, output_size); l->output_gpu = cuda_make_array(l->output, output_size); l->delta_gpu = cuda_make_array(l->delta, output_size); #endif diff --git a/src/region_layer.c b/src/region_layer.c index 5fe931c67f0..9b645944b7f 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -141,7 +141,6 @@ int entry_index(layer l, int batch, int location, int entry) return batch*l.outputs + n*l.w*l.h*(l.coords+l.classes+1) + entry*l.w*l.h + loc; } -void softmax_tree(float *input, int batch, int inputs, float temp, tree *hierarchy, float *output); void forward_region_layer(const layer l, network net) { int i,j,b,t,n; @@ -445,6 +444,9 @@ void forward_region_layer_gpu(const layer l, network net) } } if (l.softmax_tree){ + int index = entry_index(l, 0, 0, 5); + softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); + /* int i; int count = 5; for (i = 0; i < l.softmax_tree->groups; ++i) { @@ -453,6 +455,7 @@ void forward_region_layer_gpu(const layer l, network net) softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); count += group_size; } + */ } else if (l.softmax) { int index = entry_index(l, 0, 0, l.coords + !l.background); //printf("%d\n", index); diff --git a/src/segmenter.c b/src/segmenter.c index fab66cb0f68..32bb4843549 100644 --- a/src/segmenter.c +++ b/src/segmenter.c @@ -149,7 +149,7 @@ void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *fi float *X = sized.data; time=clock(); float *predictions = network_predict(net, X); - image m = float_to_image(sized.w, sized.h, 80, predictions); + image m = float_to_image(sized.w, sized.h, 81, predictions); image rgb = mask_to_rgb(m); show_image(sized, "orig"); show_image(rgb, "pred"); From 1ef829e585c86e14504e4aae9ee0085c8f6a80be Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 31 May 2017 21:06:35 -0700 Subject: [PATCH 021/118] @crossbot I will murder you in your sleep :crossed_swords: --- Makefile | 25 ++++++++++----- cfg/imagenet1k.data | 2 +- cfg/yolo.cfg | 4 +-- {src => examples}/art.c | 12 +++---- {src => examples}/captcha.c | 6 ++-- {src => examples}/cifar.c | 10 +++--- {src => examples}/classifier.c | 16 +++++----- {src => examples}/coco.c | 14 ++++---- {src => examples}/darknet.c | 12 +++---- {src => examples}/detector.c | 18 +++++------ {src => examples}/dice.c | 6 ++-- {src => examples}/go.c | 12 +++---- {src => examples}/lsd.c | 10 +++--- {src => examples}/nightmare.c | 10 +++--- {src => examples}/regressor.c | 14 ++++---- {src => examples}/rnn.c | 12 +++---- {src => examples}/rnn_vid.c | 10 +++--- {src => examples}/segmenter.c | 14 ++++---- {src => examples}/super.c | 8 ++--- {src => examples}/swag.c | 12 +++---- {src => examples}/tag.c | 6 ++-- {src => examples}/voxel.c | 8 ++--- {src => examples}/writing.c | 6 ++-- {src => examples}/yolo.c | 14 ++++---- src/activation_kernels.cu | 4 +-- src/activation_layer.c | 10 +++--- src/activations.c | 2 +- src/avgpool_layer.c | 4 +-- src/avgpool_layer_kernels.cu | 4 +-- src/batchnorm_layer.c | 14 ++------ src/blas.c | 5 +-- src/blas_kernels.cu | 6 ++-- src/box.c | 2 +- src/col2im_kernels.cu | 4 +-- src/compare.c | 12 +++---- src/connected_layer.c | 12 +++---- src/convolutional_kernels.cu | 16 +++++----- src/convolutional_layer.c | 14 ++++---- src/cost_layer.c | 8 ++--- src/crnn_layer.c | 12 +++---- src/crop_layer.c | 4 +-- src/crop_layer_kernels.cu | 8 ++--- src/cuda.c | 8 ++--- src/data.c | 8 ++--- src/deconvolutional_kernels.cu | 18 +++++------ src/deconvolutional_layer.c | 17 +++++----- src/demo.c | 18 +++++------ src/detection_layer.c | 15 +++++---- src/dropout_layer.c | 6 ++-- src/dropout_layer_kernels.cu | 6 ++-- src/gemm.c | 6 ++-- src/gru_layer.c | 12 +++---- src/im2col.c | 2 +- src/im2col_kernels.cu | 4 +-- src/image.c | 12 +++---- src/layer.c | 5 +-- src/list.c | 2 +- src/local_layer.c | 12 +++---- src/matrix.c | 6 ++-- src/maxpool_layer.c | 4 +-- src/maxpool_layer_kernels.cu | 4 +-- src/network.c | 56 ++++++++++++++++---------------- src/network_kernels.cu | 52 +++++++++++++++--------------- src/normalization_layer.c | 5 +-- src/option_list.c | 4 +-- src/parser.c | 58 +++++++++++++++++----------------- src/region_layer.c | 13 ++++---- src/reorg_layer.c | 7 ++-- src/rnn_layer.c | 12 +++---- src/route_layer.c | 7 ++-- src/shortcut_layer.c | 7 ++-- src/softmax_layer.c | 7 ++-- src/tree.c | 6 ++-- src/utils.c | 2 +- 74 files changed, 407 insertions(+), 396 deletions(-) rename {src => examples}/art.c (89%) rename {src => examples}/captcha.c (99%) rename {src => examples}/cifar.c (98%) rename {src => examples}/classifier.c (99%) rename {src => examples}/coco.c (98%) rename {src => examples}/darknet.c (98%) rename {src => examples}/detector.c (98%) rename {src => examples}/dice.c (97%) rename {src => examples}/go.c (99%) rename {src => examples}/lsd.c (99%) rename {src => examples}/nightmare.c (98%) rename {src => examples}/regressor.c (97%) rename {src => examples}/rnn.c (98%) rename {src => examples}/rnn_vid.c (97%) rename {src => examples}/segmenter.c (97%) rename {src => examples}/super.c (96%) rename {src => examples}/swag.c (93%) rename {src => examples}/tag.c (98%) rename {src => examples}/voxel.c (97%) rename {src => examples}/writing.c (98%) rename {src => examples}/yolo.c (98%) diff --git a/Makefile b/Makefile index 3bbaa5c07cf..b67ecacd34f 100644 --- a/Makefile +++ b/Makefile @@ -12,15 +12,18 @@ ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ # This is what I use, uncomment if you know your arch and want to specify ARCH= -gencode arch=compute_52,code=compute_52 -VPATH=./src/ +VPATH=./src/:./examples +LIB=libdarknet.a EXEC=darknet OBJDIR=./obj/ CC=gcc NVCC=nvcc +AR=ar +ARFLAGS=-rv OPTS=-Ofast LDFLAGS= -lm -pthread -COMMON= +COMMON= -Iinclude/ CFLAGS=-Wall -Wfatal-errors ifeq ($(DEBUG), 1) @@ -48,19 +51,25 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o detector.o layer.o compare.o segmenter.o regressor.o classifier.o local_layer.o swag.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o rnn.o rnn_vid.o crnn_layer.o demo.o tag.o cifar.o go.o batchnorm_layer.o art.o region_layer.o reorg_layer.o lsd.o super.o voxel.o tree.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o +EXECOBJA=captcha.o lsd.o super.o voxel.o art.o tag.o cifar.o go.o rnn.o rnn_vid.o compare.o segmenter.o regressor.o classifier.o coco.o dice.o yolo.o detector.o writing.o nightmare.o swag.o darknet.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o network_kernels.o avgpool_layer_kernels.o endif +EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA)) OBJS = $(addprefix $(OBJDIR), $(OBJ)) -DEPS = $(wildcard src/*.h) Makefile +DEPS = $(wildcard include/darknet/*.h) Makefile -all: obj backup results $(EXEC) +all: obj backup results $(LIB) $(EXEC) -$(EXEC): $(OBJS) - $(CC) $(COMMON) $(CFLAGS) $^ -o $@ $(LDFLAGS) + +$(EXEC): $(EXECOBJ) $(LIB) + $(CC) $(COMMON) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LIB) + +$(LIB): $(OBJS) + $(AR) $(ARFLAGS) $@ $^ $(OBJDIR)%.o: %.c $(DEPS) $(CC) $(COMMON) $(CFLAGS) -c $< -o $@ @@ -78,5 +87,5 @@ results: .PHONY: clean clean: - rm -rf $(OBJS) $(EXEC) + rm -rf $(OBJS) $(LIB) $(EXEC) $(EXECOBJ) diff --git a/cfg/imagenet1k.data b/cfg/imagenet1k.data index 6634a2740cf..b28c26c57b5 100644 --- a/cfg/imagenet1k.data +++ b/cfg/imagenet1k.data @@ -1,6 +1,6 @@ classes=1000 train = /data/imagenet/imagenet1k.train.list -valid = /data/imagenet/imagenet1k.valid.list +valid = /data/imagenet/imagenet1k.train.list backup = /home/pjreddie/backup/ labels = data/imagenet.labels.list names = data/imagenet.shortnames.list diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg index 2a0cd98fbd0..088edf81573 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolo.cfg @@ -5,8 +5,8 @@ subdivisions=1 # Training # batch=64 # subdivisions=8 -width=416 -height=416 +width=608 +height=608 channels=3 momentum=0.9 decay=0.0005 diff --git a/src/art.c b/examples/art.c similarity index 89% rename from src/art.c rename to examples/art.c index 694ae8e76a7..53fe60d0fb9 100644 --- a/src/art.c +++ b/examples/art.c @@ -1,9 +1,9 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" -#include "option_list.h" -#include "blas.h" -#include "classifier.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/option_list.h" +#include "darknet/blas.h" +#include "darknet/classifier.h" #include void demo_art(char *cfgfile, char *weightfile, int cam_index) diff --git a/src/captcha.c b/examples/captcha.c similarity index 99% rename from src/captcha.c rename to examples/captcha.c index 3d449b267cc..dce713ae953 100644 --- a/src/captcha.c +++ b/examples/captcha.c @@ -1,6 +1,6 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" void fix_data_captcha(data d, int mask) { diff --git a/src/cifar.c b/examples/cifar.c similarity index 98% rename from src/cifar.c rename to examples/cifar.c index 5a6f96b9b46..fbbea28535c 100644 --- a/src/cifar.c +++ b/examples/cifar.c @@ -1,8 +1,8 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" -#include "option_list.h" -#include "blas.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/option_list.h" +#include "darknet/blas.h" void train_cifar(char *cfgfile, char *weightfile) { diff --git a/src/classifier.c b/examples/classifier.c similarity index 99% rename from src/classifier.c rename to examples/classifier.c index 4f6a1a0bc50..440ab21a98e 100644 --- a/src/classifier.c +++ b/examples/classifier.c @@ -1,12 +1,12 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" -#include "option_list.h" -#include "blas.h" -#include "assert.h" -#include "classifier.h" -#include "cuda.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/option_list.h" +#include "darknet/blas.h" +#include "darknet/classifier.h" +#include "darknet/cuda.h" #include +#include float *get_regression_values(char **labels, int n) { diff --git a/src/coco.c b/examples/coco.c similarity index 98% rename from src/coco.c rename to examples/coco.c index 3bcb651816b..02e62455053 100644 --- a/src/coco.c +++ b/examples/coco.c @@ -1,12 +1,12 @@ #include -#include "network.h" -#include "detection_layer.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "box.h" -#include "demo.h" +#include "darknet/network.h" +#include "darknet/detection_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/box.h" +#include "darknet/demo.h" char *coco_classes[] = {"person","bicycle","car","motorcycle","airplane","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","couch","potted plant","bed","dining table","toilet","tv","laptop","mouse","remote","keyboard","cell phone","microwave","oven","toaster","sink","refrigerator","book","clock","vase","scissors","teddy bear","hair drier","toothbrush"}; diff --git a/src/darknet.c b/examples/darknet.c similarity index 98% rename from src/darknet.c rename to examples/darknet.c index b69cd4361e8..4592dc3e6ad 100644 --- a/src/darknet.c +++ b/examples/darknet.c @@ -2,11 +2,12 @@ #include #include -#include "parser.h" -#include "utils.h" -#include "cuda.h" -#include "blas.h" -#include "connected_layer.h" +#include "darknet/parser.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" +#include "darknet/connected_layer.h" +#include "darknet/convolutional_layer.h" extern void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top); extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen); @@ -172,7 +173,6 @@ void partial(char *cfgfile, char *weightfile, char *outfile, int max) save_weights_upto(net, outfile, max); } -#include "convolutional_layer.h" void rescale_net(char *cfgfile, char *weightfile, char *outfile) { gpu_index = -1; diff --git a/src/detector.c b/examples/detector.c similarity index 98% rename from src/detector.c rename to examples/detector.c index 12277b1a437..2c8234d8e4c 100644 --- a/src/detector.c +++ b/examples/detector.c @@ -1,12 +1,12 @@ -#include "network.h" -#include "region_layer.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "box.h" -#include "demo.h" -#include "option_list.h" -#include "blas.h" +#include "darknet/network.h" +#include "darknet/region_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/box.h" +#include "darknet/demo.h" +#include "darknet/option_list.h" +#include "darknet/blas.h" static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90}; diff --git a/src/dice.c b/examples/dice.c similarity index 97% rename from src/dice.c rename to examples/dice.c index 228645985d8..7a2a194955d 100644 --- a/src/dice.c +++ b/examples/dice.c @@ -1,6 +1,6 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" char *dice_labels[] = {"face1","face2","face3","face4","face5","face6"}; diff --git a/src/go.c b/examples/go.c similarity index 99% rename from src/go.c rename to examples/go.c index c5c125cd201..3e3d5f67785 100644 --- a/src/go.c +++ b/examples/go.c @@ -1,9 +1,9 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" -#include "option_list.h" -#include "blas.h" -#include "data.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/option_list.h" +#include "darknet/blas.h" +#include "darknet/data.h" #include int inverted = 1; diff --git a/src/lsd.c b/examples/lsd.c similarity index 99% rename from src/lsd.c rename to examples/lsd.c index 312679ae9e1..61f8e8f2cc7 100644 --- a/src/lsd.c +++ b/examples/lsd.c @@ -1,8 +1,8 @@ -#include "network.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "blas.h" +#include "darknet/network.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/blas.h" /* void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg, char *aweight, int clear) diff --git a/src/nightmare.c b/examples/nightmare.c similarity index 98% rename from src/nightmare.c rename to examples/nightmare.c index 3ab735cef9b..3eda5fb6c65 100644 --- a/src/nightmare.c +++ b/examples/nightmare.c @@ -1,8 +1,8 @@ -#include "network.h" -#include "parser.h" -#include "blas.h" -#include "utils.h" -#include "region_layer.h" +#include "darknet/network.h" +#include "darknet/parser.h" +#include "darknet/blas.h" +#include "darknet/utils.h" +#include "darknet/region_layer.h" // ./darknet nightmare cfg/extractor.recon.cfg ~/trained/yolo-coco.conv frame6.png -reconstruct -iters 500 -i 3 -lambda .1 -rate .01 -smooth 2 diff --git a/src/regressor.c b/examples/regressor.c similarity index 97% rename from src/regressor.c rename to examples/regressor.c index 93aeb982361..30021e7fdbb 100644 --- a/src/regressor.c +++ b/examples/regressor.c @@ -1,11 +1,11 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" -#include "option_list.h" -#include "blas.h" -#include "assert.h" -#include "cuda.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/option_list.h" +#include "darknet/blas.h" +#include "darknet/cuda.h" #include +#include void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) { diff --git a/src/rnn.c b/examples/rnn.c similarity index 98% rename from src/rnn.c rename to examples/rnn.c index 62d7d8d1aa2..ded239756bb 100644 --- a/src/rnn.c +++ b/examples/rnn.c @@ -1,8 +1,8 @@ -#include "network.h" -#include "cost_layer.h" -#include "utils.h" -#include "blas.h" -#include "parser.h" +#include "darknet/network.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/blas.h" +#include "darknet/parser.h" typedef struct { float *x; @@ -152,7 +152,7 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, } int inputs = net.inputs; - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g, Inputs: %d\n", net.learning_rate, net.momentum, net.decay, inputs); int batch = net.batch; int steps = net.time_steps; if(clear) *net.seen = 0; diff --git a/src/rnn_vid.c b/examples/rnn_vid.c similarity index 97% rename from src/rnn_vid.c rename to examples/rnn_vid.c index 3042173f79c..a5e2a758107 100644 --- a/src/rnn_vid.c +++ b/examples/rnn_vid.c @@ -1,8 +1,8 @@ -#include "network.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "blas.h" +#include "darknet/network.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/blas.h" #ifdef OPENCV image get_image_from_stream(CvCapture *cap); diff --git a/src/segmenter.c b/examples/segmenter.c similarity index 97% rename from src/segmenter.c rename to examples/segmenter.c index 32bb4843549..12eb540876e 100644 --- a/src/segmenter.c +++ b/examples/segmenter.c @@ -1,11 +1,11 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" -#include "option_list.h" -#include "blas.h" -#include "assert.h" -#include "cuda.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/option_list.h" +#include "darknet/blas.h" +#include "darknet/cuda.h" #include +#include void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) { diff --git a/src/super.c b/examples/super.c similarity index 96% rename from src/super.c rename to examples/super.c index b68fef57edc..d1f1bbf6f3e 100644 --- a/src/super.c +++ b/examples/super.c @@ -1,7 +1,7 @@ -#include "network.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" +#include "darknet/network.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" void train_super(char *cfgfile, char *weightfile, int clear) { diff --git a/src/swag.c b/examples/swag.c similarity index 93% rename from src/swag.c rename to examples/swag.c index 749196932d7..91a7beb7567 100644 --- a/src/swag.c +++ b/examples/swag.c @@ -1,9 +1,9 @@ -#include "network.h" -#include "detection_layer.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "box.h" +#include "darknet/network.h" +#include "darknet/detection_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/box.h" void train_swag(char *cfgfile, char *weightfile) { diff --git a/src/tag.c b/examples/tag.c similarity index 98% rename from src/tag.c rename to examples/tag.c index 084adba0707..32a1bd1421d 100644 --- a/src/tag.c +++ b/examples/tag.c @@ -1,6 +1,6 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" void train_tag(char *cfgfile, char *weightfile, int clear) { diff --git a/src/voxel.c b/examples/voxel.c similarity index 97% rename from src/voxel.c rename to examples/voxel.c index af722e0f079..b9387bc4a8d 100644 --- a/src/voxel.c +++ b/examples/voxel.c @@ -1,7 +1,7 @@ -#include "network.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" +#include "darknet/network.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" void extract_voxel(char *lfile, char *rfile, char *prefix) { diff --git a/src/writing.c b/examples/writing.c similarity index 98% rename from src/writing.c rename to examples/writing.c index 789c0331465..7136ff71bd1 100644 --- a/src/writing.c +++ b/examples/writing.c @@ -1,6 +1,6 @@ -#include "network.h" -#include "utils.h" -#include "parser.h" +#include "darknet/network.h" +#include "darknet/utils.h" +#include "darknet/parser.h" void train_writing(char *cfgfile, char *weightfile) { diff --git a/src/yolo.c b/examples/yolo.c similarity index 98% rename from src/yolo.c rename to examples/yolo.c index 6ddfb6ef522..c1bef8bdc87 100644 --- a/src/yolo.c +++ b/examples/yolo.c @@ -1,10 +1,10 @@ -#include "network.h" -#include "detection_layer.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "box.h" -#include "demo.h" +#include "darknet/network.h" +#include "darknet/detection_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/box.h" +#include "darknet/demo.h" char *voc_names[] = {"aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"}; diff --git a/src/activation_kernels.cu b/src/activation_kernels.cu index 994e2068146..f78829903ed 100644 --- a/src/activation_kernels.cu +++ b/src/activation_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "activations.h" -#include "cuda.h" +#include "darknet/activations.h" +#include "darknet/cuda.h" } diff --git a/src/activation_layer.c b/src/activation_layer.c index de4e4b7d09b..00596f8c2a6 100644 --- a/src/activation_layer.c +++ b/src/activation_layer.c @@ -1,8 +1,8 @@ -#include "activation_layer.h" -#include "utils.h" -#include "cuda.h" -#include "blas.h" -#include "gemm.h" +#include "darknet/activation_layer.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" +#include "darknet/gemm.h" #include #include diff --git a/src/activations.c b/src/activations.c index 0cbb2f5546e..38a89f2db04 100644 --- a/src/activations.c +++ b/src/activations.c @@ -1,4 +1,4 @@ -#include "activations.h" +#include "darknet/activations.h" #include #include diff --git a/src/avgpool_layer.c b/src/avgpool_layer.c index 83034dbecf4..e7158e80765 100644 --- a/src/avgpool_layer.c +++ b/src/avgpool_layer.c @@ -1,5 +1,5 @@ -#include "avgpool_layer.h" -#include "cuda.h" +#include "darknet/avgpool_layer.h" +#include "darknet/cuda.h" #include avgpool_layer make_avgpool_layer(int batch, int w, int h, int c) diff --git a/src/avgpool_layer_kernels.cu b/src/avgpool_layer_kernels.cu index a7eca3aeae9..d8f70adc927 100644 --- a/src/avgpool_layer_kernels.cu +++ b/src/avgpool_layer_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "avgpool_layer.h" -#include "cuda.h" +#include "darknet/avgpool_layer.h" +#include "darknet/cuda.h" } __global__ void forward_avgpool_layer_kernel(int n, int w, int h, int c, float *input, float *output) diff --git a/src/batchnorm_layer.c b/src/batchnorm_layer.c index de081c4ec6a..da8ac2fec0b 100644 --- a/src/batchnorm_layer.c +++ b/src/batchnorm_layer.c @@ -1,6 +1,6 @@ -#include "convolutional_layer.h" -#include "batchnorm_layer.h" -#include "blas.h" +#include "darknet/convolutional_layer.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/blas.h" #include layer make_batchnorm_layer(int batch, int w, int h, int c) @@ -135,10 +135,6 @@ void resize_batchnorm_layer(layer *layer, int w, int h) void forward_batchnorm_layer(layer l, network net) { if(l.type == BATCHNORM) copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1); - if(l.type == CONNECTED){ - l.out_c = l.outputs; - l.out_h = l.out_w = 1; - } copy_cpu(l.outputs*l.batch, l.output, 1, l.x, 1); if(net.train){ mean_cpu(l.output, l.batch, l.out_c, l.out_h*l.out_w, l.mean); @@ -193,10 +189,6 @@ void push_batchnorm_layer(layer l) void forward_batchnorm_layer_gpu(layer l, network net) { if(l.type == BATCHNORM) copy_ongpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); - if(l.type == CONNECTED){ - l.out_c = l.outputs; - l.out_h = l.out_w = 1; - } copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); if (net.train) { #ifdef CUDNN diff --git a/src/blas.c b/src/blas.c index 1582f5fed10..751c9d7a8bc 100644 --- a/src/blas.c +++ b/src/blas.c @@ -1,5 +1,6 @@ -#include "blas.h" -#include "math.h" +#include "darknet/blas.h" + +#include #include #include #include diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index 9f1337ca6bc..b54603c9220 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -4,9 +4,9 @@ #include extern "C" { -#include "blas.h" -#include "cuda.h" -#include "utils.h" +#include "darknet/blas.h" +#include "darknet/cuda.h" +#include "darknet/utils.h" } __global__ void scale_bias_kernel(float *output, float *biases, int n, int size) diff --git a/src/box.c b/src/box.c index 88ca71ac865..dbf432eea65 100644 --- a/src/box.c +++ b/src/box.c @@ -1,4 +1,4 @@ -#include "box.h" +#include "darknet/box.h" #include #include #include diff --git a/src/col2im_kernels.cu b/src/col2im_kernels.cu index aed2df9bb62..d8a5e3714fb 100644 --- a/src/col2im_kernels.cu +++ b/src/col2im_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "col2im.h" -#include "cuda.h" +#include "darknet/col2im.h" +#include "darknet/cuda.h" } // src: https://github.com/BVLC/caffe/blob/master/src/caffe/util/im2col.cu diff --git a/src/compare.c b/src/compare.c index 4fd266c7dc3..f773bfbb1d4 100644 --- a/src/compare.c +++ b/src/compare.c @@ -1,11 +1,11 @@ #include -#include "network.h" -#include "detection_layer.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "box.h" +#include "darknet/network.h" +#include "darknet/detection_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/box.h" void train_compare(char *cfgfile, char *weightfile) { diff --git a/src/connected_layer.c b/src/connected_layer.c index f8c74235327..4300dbdc851 100644 --- a/src/connected_layer.c +++ b/src/connected_layer.c @@ -1,9 +1,9 @@ -#include "connected_layer.h" -#include "batchnorm_layer.h" -#include "utils.h" -#include "cuda.h" -#include "blas.h" -#include "gemm.h" +#include "darknet/connected_layer.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" +#include "darknet/gemm.h" #include #include diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index b53dd16a27b..4146a3e5ab7 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -3,14 +3,14 @@ #include "cublas_v2.h" extern "C" { -#include "convolutional_layer.h" -#include "batchnorm_layer.h" -#include "gemm.h" -#include "blas.h" -#include "im2col.h" -#include "col2im.h" -#include "utils.h" -#include "cuda.h" +#include "darknet/convolutional_layer.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/gemm.h" +#include "darknet/blas.h" +#include "darknet/im2col.h" +#include "darknet/col2im.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" } __global__ void binarize_kernel(float *x, int n, float *binary) diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index e5b5bb6f2be..0dbc7b74b8b 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -1,10 +1,10 @@ -#include "convolutional_layer.h" -#include "utils.h" -#include "batchnorm_layer.h" -#include "im2col.h" -#include "col2im.h" -#include "blas.h" -#include "gemm.h" +#include "darknet/convolutional_layer.h" +#include "darknet/utils.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/im2col.h" +#include "darknet/col2im.h" +#include "darknet/blas.h" +#include "darknet/gemm.h" #include #include diff --git a/src/cost_layer.c b/src/cost_layer.c index 76c001f0363..251ec5a9995 100644 --- a/src/cost_layer.c +++ b/src/cost_layer.c @@ -1,7 +1,7 @@ -#include "cost_layer.h" -#include "utils.h" -#include "cuda.h" -#include "blas.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" #include #include #include diff --git a/src/crnn_layer.c b/src/crnn_layer.c index 2478fef5e71..a8b040ddf04 100644 --- a/src/crnn_layer.c +++ b/src/crnn_layer.c @@ -1,9 +1,9 @@ -#include "crnn_layer.h" -#include "convolutional_layer.h" -#include "utils.h" -#include "cuda.h" -#include "blas.h" -#include "gemm.h" +#include "darknet/crnn_layer.h" +#include "darknet/convolutional_layer.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" +#include "darknet/gemm.h" #include #include diff --git a/src/crop_layer.c b/src/crop_layer.c index 3b918529e64..afac7ee0b7b 100644 --- a/src/crop_layer.c +++ b/src/crop_layer.c @@ -1,5 +1,5 @@ -#include "crop_layer.h" -#include "cuda.h" +#include "darknet/crop_layer.h" +#include "darknet/cuda.h" #include image get_crop_image(crop_layer l) diff --git a/src/crop_layer_kernels.cu b/src/crop_layer_kernels.cu index b6568219c34..41f6f456f48 100644 --- a/src/crop_layer_kernels.cu +++ b/src/crop_layer_kernels.cu @@ -3,10 +3,10 @@ #include "cublas_v2.h" extern "C" { -#include "crop_layer.h" -#include "utils.h" -#include "cuda.h" -#include "image.h" +#include "darknet/crop_layer.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" +#include "darknet/image.h" } __device__ float get_pixel_kernel(float *image, int w, int h, int x, int y, int c) diff --git a/src/cuda.c b/src/cuda.c index 7e53d2540dc..085a576454f 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -2,10 +2,10 @@ int gpu_index = 0; #ifdef GPU -#include "cuda.h" -#include "utils.h" -#include "blas.h" -#include "assert.h" +#include "darknet/cuda.h" +#include "darknet/utils.h" +#include "darknet/blas.h" +#include #include #include diff --git a/src/data.c b/src/data.c index dcc5089b025..1ea115a3258 100644 --- a/src/data.c +++ b/src/data.c @@ -1,7 +1,7 @@ -#include "data.h" -#include "utils.h" -#include "image.h" -#include "cuda.h" +#include "darknet/data.h" +#include "darknet/utils.h" +#include "darknet/image.h" +#include "darknet/cuda.h" #include #include diff --git a/src/deconvolutional_kernels.cu b/src/deconvolutional_kernels.cu index 166946349ab..1d4bc7c92f5 100644 --- a/src/deconvolutional_kernels.cu +++ b/src/deconvolutional_kernels.cu @@ -3,15 +3,15 @@ #include "cublas_v2.h" extern "C" { -#include "convolutional_layer.h" -#include "deconvolutional_layer.h" -#include "batchnorm_layer.h" -#include "gemm.h" -#include "blas.h" -#include "im2col.h" -#include "col2im.h" -#include "utils.h" -#include "cuda.h" +#include "darknet/convolutional_layer.h" +#include "darknet/deconvolutional_layer.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/gemm.h" +#include "darknet/blas.h" +#include "darknet/im2col.h" +#include "darknet/col2im.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" } extern "C" void forward_deconvolutional_layer_gpu(layer l, network net) diff --git a/src/deconvolutional_layer.c b/src/deconvolutional_layer.c index 917d77fb0df..3ceff782c11 100644 --- a/src/deconvolutional_layer.c +++ b/src/deconvolutional_layer.c @@ -1,11 +1,12 @@ -#include "deconvolutional_layer.h" -#include "convolutional_layer.h" -#include "batchnorm_layer.h" -#include "utils.h" -#include "im2col.h" -#include "col2im.h" -#include "blas.h" -#include "gemm.h" +#include "darknet/deconvolutional_layer.h" +#include "darknet/convolutional_layer.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/utils.h" +#include "darknet/im2col.h" +#include "darknet/col2im.h" +#include "darknet/blas.h" +#include "darknet/gemm.h" + #include #include diff --git a/src/demo.c b/src/demo.c index ff6c732962e..cf22273b8e3 100644 --- a/src/demo.c +++ b/src/demo.c @@ -1,12 +1,12 @@ -#include "network.h" -#include "detection_layer.h" -#include "region_layer.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "box.h" -#include "image.h" -#include "demo.h" +#include "darknet/network.h" +#include "darknet/detection_layer.h" +#include "darknet/region_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/utils.h" +#include "darknet/parser.h" +#include "darknet/box.h" +#include "darknet/image.h" +#include "darknet/demo.h" #include #define DEMO 1 diff --git a/src/detection_layer.c b/src/detection_layer.c index fd79cc70341..721d64c2c73 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -1,10 +1,11 @@ -#include "detection_layer.h" -#include "activations.h" -#include "softmax_layer.h" -#include "blas.h" -#include "box.h" -#include "cuda.h" -#include "utils.h" +#include "darknet/detection_layer.h" +#include "darknet/activations.h" +#include "darknet/softmax_layer.h" +#include "darknet/blas.h" +#include "darknet/box.h" +#include "darknet/cuda.h" +#include "darknet/utils.h" + #include #include #include diff --git a/src/dropout_layer.c b/src/dropout_layer.c index 780554fb371..1e344f45fd7 100644 --- a/src/dropout_layer.c +++ b/src/dropout_layer.c @@ -1,6 +1,6 @@ -#include "dropout_layer.h" -#include "utils.h" -#include "cuda.h" +#include "darknet/dropout_layer.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" #include #include diff --git a/src/dropout_layer_kernels.cu b/src/dropout_layer_kernels.cu index bd12b678758..862e6f45a86 100644 --- a/src/dropout_layer_kernels.cu +++ b/src/dropout_layer_kernels.cu @@ -3,9 +3,9 @@ #include "cublas_v2.h" extern "C" { -#include "dropout_layer.h" -#include "cuda.h" -#include "utils.h" +#include "darknet/dropout_layer.h" +#include "darknet/cuda.h" +#include "darknet/utils.h" } __global__ void yoloswag420blazeit360noscope(float *input, int size, float *rand, float prob, float scale) diff --git a/src/gemm.c b/src/gemm.c index 3003be0ed5a..245ae641195 100644 --- a/src/gemm.c +++ b/src/gemm.c @@ -1,6 +1,6 @@ -#include "gemm.h" -#include "utils.h" -#include "cuda.h" +#include "darknet/gemm.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" #include #include #include diff --git a/src/gru_layer.c b/src/gru_layer.c index 7139f798f29..68ffed34102 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -1,9 +1,9 @@ -#include "gru_layer.h" -#include "connected_layer.h" -#include "utils.h" -#include "cuda.h" -#include "blas.h" -#include "gemm.h" +#include "darknet/gru_layer.h" +#include "darknet/connected_layer.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" +#include "darknet/gemm.h" #include #include diff --git a/src/im2col.c b/src/im2col.c index 69ec98a9d12..67c078bc734 100644 --- a/src/im2col.c +++ b/src/im2col.c @@ -1,4 +1,4 @@ -#include "im2col.h" +#include "darknet/im2col.h" #include float im2col_get_pixel(float *im, int height, int width, int channels, int row, int col, int channel, int pad) diff --git a/src/im2col_kernels.cu b/src/im2col_kernels.cu index d42d600be18..02f0e07033f 100644 --- a/src/im2col_kernels.cu +++ b/src/im2col_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "im2col.h" -#include "cuda.h" +#include "darknet/im2col.h" +#include "darknet/cuda.h" } // src: https://github.com/BVLC/caffe/blob/master/src/caffe/util/im2col.cu diff --git a/src/image.c b/src/image.c index 1a8c984a6e8..b9f629cae5a 100644 --- a/src/image.c +++ b/src/image.c @@ -1,14 +1,14 @@ -#include "image.h" -#include "utils.h" -#include "blas.h" -#include "cuda.h" +#include "darknet/image.h" +#include "darknet/utils.h" +#include "darknet/blas.h" +#include "darknet/cuda.h" #include #include #define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" +#include "darknet/stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION -#include "stb_image_write.h" +#include "darknet/stb_image_write.h" int windows = 0; diff --git a/src/layer.c b/src/layer.c index 791c5e77463..bfa56e7879e 100644 --- a/src/layer.c +++ b/src/layer.c @@ -1,5 +1,6 @@ -#include "layer.h" -#include "cuda.h" +#include "darknet/layer.h" +#include "darknet/cuda.h" + #include void free_layer(layer l) diff --git a/src/list.c b/src/list.c index 0e4165d3780..2be48d71aa5 100644 --- a/src/list.c +++ b/src/list.c @@ -1,6 +1,6 @@ #include #include -#include "list.h" +#include "darknet/list.h" list *make_list() { diff --git a/src/local_layer.c b/src/local_layer.c index aad036e050c..4fa934c50cf 100644 --- a/src/local_layer.c +++ b/src/local_layer.c @@ -1,9 +1,9 @@ -#include "local_layer.h" -#include "utils.h" -#include "im2col.h" -#include "col2im.h" -#include "blas.h" -#include "gemm.h" +#include "darknet/local_layer.h" +#include "darknet/utils.h" +#include "darknet/im2col.h" +#include "darknet/col2im.h" +#include "darknet/blas.h" +#include "darknet/gemm.h" #include #include diff --git a/src/matrix.c b/src/matrix.c index 799916bff01..6a0c4fd44f3 100644 --- a/src/matrix.c +++ b/src/matrix.c @@ -1,6 +1,6 @@ -#include "matrix.h" -#include "utils.h" -#include "blas.h" +#include "darknet/matrix.h" +#include "darknet/utils.h" +#include "darknet/blas.h" #include #include #include diff --git a/src/maxpool_layer.c b/src/maxpool_layer.c index 17dedf7a14c..520dda540c1 100644 --- a/src/maxpool_layer.c +++ b/src/maxpool_layer.c @@ -1,5 +1,5 @@ -#include "maxpool_layer.h" -#include "cuda.h" +#include "darknet/maxpool_layer.h" +#include "darknet/cuda.h" #include image get_maxpool_image(maxpool_layer l) diff --git a/src/maxpool_layer_kernels.cu b/src/maxpool_layer_kernels.cu index 3202e84b695..749c3880b21 100644 --- a/src/maxpool_layer_kernels.cu +++ b/src/maxpool_layer_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "maxpool_layer.h" -#include "cuda.h" +#include "darknet/maxpool_layer.h" +#include "darknet/cuda.h" } __global__ void forward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c, int stride, int size, int pad, float *input, float *output, int *indexes) diff --git a/src/network.c b/src/network.c index 2b21338dca9..7b753549c8e 100644 --- a/src/network.c +++ b/src/network.c @@ -1,34 +1,34 @@ #include #include #include -#include "network.h" -#include "image.h" -#include "data.h" -#include "utils.h" -#include "blas.h" - -#include "crop_layer.h" -#include "connected_layer.h" -#include "gru_layer.h" -#include "rnn_layer.h" -#include "crnn_layer.h" -#include "local_layer.h" -#include "convolutional_layer.h" -#include "activation_layer.h" -#include "detection_layer.h" -#include "region_layer.h" -#include "normalization_layer.h" -#include "batchnorm_layer.h" -#include "maxpool_layer.h" -#include "reorg_layer.h" -#include "avgpool_layer.h" -#include "cost_layer.h" -#include "softmax_layer.h" -#include "dropout_layer.h" -#include "route_layer.h" -#include "shortcut_layer.h" -#include "parser.h" -#include "data.h" +#include "darknet/network.h" +#include "darknet/image.h" +#include "darknet/data.h" +#include "darknet/utils.h" +#include "darknet/blas.h" + +#include "darknet/crop_layer.h" +#include "darknet/connected_layer.h" +#include "darknet/gru_layer.h" +#include "darknet/rnn_layer.h" +#include "darknet/crnn_layer.h" +#include "darknet/local_layer.h" +#include "darknet/convolutional_layer.h" +#include "darknet/activation_layer.h" +#include "darknet/detection_layer.h" +#include "darknet/region_layer.h" +#include "darknet/normalization_layer.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/maxpool_layer.h" +#include "darknet/reorg_layer.h" +#include "darknet/avgpool_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/softmax_layer.h" +#include "darknet/dropout_layer.h" +#include "darknet/route_layer.h" +#include "darknet/shortcut_layer.h" +#include "darknet/parser.h" +#include "darknet/data.h" load_args get_base_args(network net) { diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 2fbc2dd47f2..56ef50d7f90 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -7,32 +7,32 @@ extern "C" { #include #include -#include "network.h" -#include "data.h" -#include "utils.h" -#include "parser.h" - -#include "crop_layer.h" -#include "connected_layer.h" -#include "rnn_layer.h" -#include "gru_layer.h" -#include "crnn_layer.h" -#include "detection_layer.h" -#include "region_layer.h" -#include "convolutional_layer.h" -#include "activation_layer.h" -#include "maxpool_layer.h" -#include "reorg_layer.h" -#include "avgpool_layer.h" -#include "normalization_layer.h" -#include "batchnorm_layer.h" -#include "cost_layer.h" -#include "local_layer.h" -#include "softmax_layer.h" -#include "dropout_layer.h" -#include "route_layer.h" -#include "shortcut_layer.h" -#include "blas.h" +#include "darknet/network.h" +#include "darknet/data.h" +#include "darknet/utils.h" +#include "darknet/parser.h" + +#include "darknet/crop_layer.h" +#include "darknet/connected_layer.h" +#include "darknet/rnn_layer.h" +#include "darknet/gru_layer.h" +#include "darknet/crnn_layer.h" +#include "darknet/detection_layer.h" +#include "darknet/region_layer.h" +#include "darknet/convolutional_layer.h" +#include "darknet/activation_layer.h" +#include "darknet/maxpool_layer.h" +#include "darknet/reorg_layer.h" +#include "darknet/avgpool_layer.h" +#include "darknet/normalization_layer.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/local_layer.h" +#include "darknet/softmax_layer.h" +#include "darknet/dropout_layer.h" +#include "darknet/route_layer.h" +#include "darknet/shortcut_layer.h" +#include "darknet/blas.h" } void forward_network_gpu(network net) diff --git a/src/normalization_layer.c b/src/normalization_layer.c index 2be0d06922f..ce62e26ec42 100644 --- a/src/normalization_layer.c +++ b/src/normalization_layer.c @@ -1,5 +1,6 @@ -#include "normalization_layer.h" -#include "blas.h" +#include "darknet/normalization_layer.h" +#include "darknet/blas.h" + #include layer make_normalization_layer(int batch, int w, int h, int c, int size, float alpha, float beta, float kappa) diff --git a/src/option_list.c b/src/option_list.c index f935af301f8..e3cae4d2fe0 100644 --- a/src/option_list.c +++ b/src/option_list.c @@ -1,8 +1,8 @@ #include #include #include -#include "option_list.h" -#include "utils.h" +#include "darknet/option_list.h" +#include "darknet/utils.h" list *read_data_cfg(char *filename) { diff --git a/src/parser.c b/src/parser.c index 47f2629a75e..38b1cccefbe 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1,35 +1,35 @@ #include #include #include - -#include "activation_layer.h" -#include "activations.h" -#include "assert.h" -#include "avgpool_layer.h" -#include "batchnorm_layer.h" -#include "blas.h" -#include "connected_layer.h" -#include "deconvolutional_layer.h" -#include "convolutional_layer.h" -#include "cost_layer.h" -#include "crnn_layer.h" -#include "crop_layer.h" -#include "detection_layer.h" -#include "dropout_layer.h" -#include "gru_layer.h" -#include "list.h" -#include "local_layer.h" -#include "maxpool_layer.h" -#include "normalization_layer.h" -#include "option_list.h" -#include "parser.h" -#include "region_layer.h" -#include "reorg_layer.h" -#include "rnn_layer.h" -#include "route_layer.h" -#include "shortcut_layer.h" -#include "softmax_layer.h" -#include "utils.h" +#include + +#include "darknet/activation_layer.h" +#include "darknet/activations.h" +#include "darknet/avgpool_layer.h" +#include "darknet/batchnorm_layer.h" +#include "darknet/blas.h" +#include "darknet/connected_layer.h" +#include "darknet/deconvolutional_layer.h" +#include "darknet/convolutional_layer.h" +#include "darknet/cost_layer.h" +#include "darknet/crnn_layer.h" +#include "darknet/crop_layer.h" +#include "darknet/detection_layer.h" +#include "darknet/dropout_layer.h" +#include "darknet/gru_layer.h" +#include "darknet/list.h" +#include "darknet/local_layer.h" +#include "darknet/maxpool_layer.h" +#include "darknet/normalization_layer.h" +#include "darknet/option_list.h" +#include "darknet/parser.h" +#include "darknet/region_layer.h" +#include "darknet/reorg_layer.h" +#include "darknet/rnn_layer.h" +#include "darknet/route_layer.h" +#include "darknet/shortcut_layer.h" +#include "darknet/softmax_layer.h" +#include "darknet/utils.h" typedef struct{ char *type; diff --git a/src/region_layer.c b/src/region_layer.c index 9b645944b7f..49147e354cd 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -1,9 +1,10 @@ -#include "region_layer.h" -#include "activations.h" -#include "blas.h" -#include "box.h" -#include "cuda.h" -#include "utils.h" +#include "darknet/region_layer.h" +#include "darknet/activations.h" +#include "darknet/blas.h" +#include "darknet/box.h" +#include "darknet/cuda.h" +#include "darknet/utils.h" + #include #include #include diff --git a/src/reorg_layer.c b/src/reorg_layer.c index 405a4266511..d9f77154ce7 100644 --- a/src/reorg_layer.c +++ b/src/reorg_layer.c @@ -1,6 +1,7 @@ -#include "reorg_layer.h" -#include "cuda.h" -#include "blas.h" +#include "darknet/reorg_layer.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" + #include diff --git a/src/rnn_layer.c b/src/rnn_layer.c index fb4f108434e..998bbacfbd0 100644 --- a/src/rnn_layer.c +++ b/src/rnn_layer.c @@ -1,9 +1,9 @@ -#include "rnn_layer.h" -#include "connected_layer.h" -#include "utils.h" -#include "cuda.h" -#include "blas.h" -#include "gemm.h" +#include "darknet/rnn_layer.h" +#include "darknet/connected_layer.h" +#include "darknet/utils.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" +#include "darknet/gemm.h" #include #include diff --git a/src/route_layer.c b/src/route_layer.c index 722676892e4..76f80f67aec 100644 --- a/src/route_layer.c +++ b/src/route_layer.c @@ -1,6 +1,7 @@ -#include "route_layer.h" -#include "cuda.h" -#include "blas.h" +#include "darknet/route_layer.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" + #include route_layer make_route_layer(int batch, int n, int *input_layers, int *input_sizes) diff --git a/src/shortcut_layer.c b/src/shortcut_layer.c index 530d9980c51..bf60ddff695 100644 --- a/src/shortcut_layer.c +++ b/src/shortcut_layer.c @@ -1,6 +1,7 @@ -#include "shortcut_layer.h" -#include "cuda.h" -#include "blas.h" +#include "darknet/shortcut_layer.h" +#include "darknet/cuda.h" +#include "darknet/blas.h" + #include #include diff --git a/src/softmax_layer.c b/src/softmax_layer.c index 86b0237c5dd..c0853f97ed1 100644 --- a/src/softmax_layer.c +++ b/src/softmax_layer.c @@ -1,6 +1,7 @@ -#include "softmax_layer.h" -#include "blas.h" -#include "cuda.h" +#include "darknet/softmax_layer.h" +#include "darknet/blas.h" +#include "darknet/cuda.h" + #include #include #include diff --git a/src/tree.c b/src/tree.c index f36ca3a1da0..89b5a8b4130 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1,8 +1,8 @@ #include #include -#include "tree.h" -#include "utils.h" -#include "data.h" +#include "darknet/tree.h" +#include "darknet/utils.h" +#include "darknet/data.h" void change_leaves(tree *t, char *leaf_list) { diff --git a/src/utils.c b/src/utils.c index 9fa2d6bfe75..822fd3315ec 100644 --- a/src/utils.c +++ b/src/utils.c @@ -7,7 +7,7 @@ #include #include -#include "utils.h" +#include "darknet/utils.h" int *read_intlist(char *gpu_list, int *ngpus, int d) { From 56d69e73aba37283ea7b9726b81afd2f79cd1134 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 1 Jun 2017 20:31:13 -0700 Subject: [PATCH 022/118] #covfefe --- Makefile | 12 +- examples/art.c | 8 +- examples/captcha.c | 4 +- examples/cifar.c | 6 +- examples/classifier.c | 15 +- examples/coco.c | 10 +- examples/darknet.c | 9 +- examples/detector.c | 10 +- examples/dice.c | 4 +- examples/go.c | 8 +- examples/lsd.c | 6 +- examples/nightmare.c | 6 +- examples/regressor.c | 7 +- examples/rnn.c | 6 +- examples/rnn_vid.c | 6 +- examples/segmenter.c | 9 +- examples/super.c | 5 +- examples/swag.c | 8 +- examples/tag.c | 4 +- examples/voxel.c | 5 +- examples/writing.c | 4 +- examples/yolo.c | 8 +- include/darknet.h | 538 +++++++++++++++++++++++++++++++++ src/activation_kernels.cu | 4 +- src/activation_layer.c | 10 +- src/activations.c | 2 +- src/activations.h | 5 +- src/avgpool_layer.c | 4 +- src/avgpool_layer_kernels.cu | 4 +- src/batchnorm_layer.c | 6 +- src/blas.c | 2 +- src/blas.h | 2 +- src/blas_kernels.cu | 6 +- src/box.c | 2 +- src/box.h | 5 +- src/classifier.h | 1 - src/col2im_kernels.cu | 4 +- src/compare.c | 12 +- src/connected_layer.c | 12 +- src/convolutional_kernels.cu | 16 +- src/convolutional_layer.c | 14 +- src/cost_layer.c | 8 +- src/crnn_layer.c | 12 +- src/crop_layer.c | 4 +- src/crop_layer_kernels.cu | 8 +- src/cuda.c | 6 +- src/cuda.h | 12 +- src/data.c | 8 +- src/data.h | 56 +--- src/deconvolutional_kernels.cu | 18 +- src/deconvolutional_layer.c | 16 +- src/demo.c | 20 +- src/detection_layer.c | 14 +- src/dropout_layer.c | 6 +- src/dropout_layer_kernels.cu | 6 +- src/gemm.c | 6 +- src/gru_layer.c | 12 +- src/im2col.c | 2 +- src/im2col_kernels.cu | 4 +- src/image.c | 12 +- src/image.h | 29 +- src/layer.c | 4 +- src/layer.h | 290 +----------------- src/list.c | 2 +- src/list.h | 13 +- src/local_layer.c | 12 +- src/matrix.c | 6 +- src/matrix.h | 5 +- src/maxpool_layer.c | 4 +- src/maxpool_layer_kernels.cu | 4 +- src/network.c | 56 ++-- src/network.h | 72 +---- src/network_kernels.cu | 52 ++-- src/normalization_layer.c | 4 +- src/option_list.c | 4 +- src/option_list.h | 1 - src/parser.c | 60 ++-- src/region_layer.c | 68 ++++- src/reorg_layer.c | 6 +- src/rnn_layer.c | 12 +- src/route_layer.c | 6 +- src/shortcut_layer.c | 7 +- src/softmax_layer.c | 6 +- src/tree.c | 6 +- src/tree.h | 14 +- src/utils.c | 24 +- src/utils.h | 1 + 87 files changed, 917 insertions(+), 890 deletions(-) create mode 100644 include/darknet.h diff --git a/Makefile b/Makefile index b67ecacd34f..36a451cc19c 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -GPU=1 -CUDNN=1 -OPENCV=1 +GPU=0 +CUDNN=0 +OPENCV=0 DEBUG=0 ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ @@ -10,7 +10,7 @@ ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ -gencode arch=compute_52,code=[sm_52,compute_52] # This is what I use, uncomment if you know your arch and want to specify -ARCH= -gencode arch=compute_52,code=compute_52 +# ARCH= -gencode arch=compute_52,code=compute_52 VPATH=./src/:./examples LIB=libdarknet.a @@ -23,7 +23,7 @@ AR=ar ARFLAGS=-rv OPTS=-Ofast LDFLAGS= -lm -pthread -COMMON= -Iinclude/ +COMMON= -Iinclude/ -Isrc/ CFLAGS=-Wall -Wfatal-errors ifeq ($(DEBUG), 1) @@ -60,7 +60,7 @@ endif EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA)) OBJS = $(addprefix $(OBJDIR), $(OBJ)) -DEPS = $(wildcard include/darknet/*.h) Makefile +DEPS = $(wildcard src/*.h) Makefile include/darknet.h all: obj backup results $(LIB) $(EXEC) diff --git a/examples/art.c b/examples/art.c index 53fe60d0fb9..3f03f79f722 100644 --- a/examples/art.c +++ b/examples/art.c @@ -1,9 +1,5 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/option_list.h" -#include "darknet/blas.h" -#include "darknet/classifier.h" +#include "darknet.h" + #include void demo_art(char *cfgfile, char *weightfile, int cam_index) diff --git a/examples/captcha.c b/examples/captcha.c index dce713ae953..1de21fa33a6 100644 --- a/examples/captcha.c +++ b/examples/captcha.c @@ -1,6 +1,4 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" +#include "darknet.h" void fix_data_captcha(data d, int mask) { diff --git a/examples/cifar.c b/examples/cifar.c index fbbea28535c..a05d099757f 100644 --- a/examples/cifar.c +++ b/examples/cifar.c @@ -1,8 +1,4 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/option_list.h" -#include "darknet/blas.h" +#include "darknet.h" void train_cifar(char *cfgfile, char *weightfile) { diff --git a/examples/classifier.c b/examples/classifier.c index 440ab21a98e..112b913d866 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -1,10 +1,5 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/option_list.h" -#include "darknet/blas.h" -#include "darknet/classifier.h" -#include "darknet/cuda.h" +#include "darknet.h" + #include #include @@ -37,11 +32,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #ifdef GPU cuda_set_device(gpus[i]); #endif - nets[i] = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&nets[i], weightfile); - } - if(clear) *nets[i].seen = 0; + nets[i] = load_network(cfgfile, weightfile, clear); nets[i].learning_rate *= ngpus; } srand(time(0)); diff --git a/examples/coco.c b/examples/coco.c index 02e62455053..bab507d90bf 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -1,12 +1,6 @@ -#include +#include "darknet.h" -#include "darknet/network.h" -#include "darknet/detection_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/box.h" -#include "darknet/demo.h" +#include char *coco_classes[] = {"person","bicycle","car","motorcycle","airplane","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","couch","potted plant","bed","dining table","toilet","tv","laptop","mouse","remote","keyboard","cell phone","microwave","oven","toaster","sink","refrigerator","book","clock","vase","scissors","teddy bear","hair drier","toothbrush"}; diff --git a/examples/darknet.c b/examples/darknet.c index 4592dc3e6ad..31652b12f37 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -1,14 +1,9 @@ +#include "darknet.h" + #include #include #include -#include "darknet/parser.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" -#include "darknet/connected_layer.h" -#include "darknet/convolutional_layer.h" - extern void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top); extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen); extern void run_voxel(int argc, char **argv); diff --git a/examples/detector.c b/examples/detector.c index 2c8234d8e4c..0a31fc27cff 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -1,12 +1,4 @@ -#include "darknet/network.h" -#include "darknet/region_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/box.h" -#include "darknet/demo.h" -#include "darknet/option_list.h" -#include "darknet/blas.h" +#include "darknet.h" static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90}; diff --git a/examples/dice.c b/examples/dice.c index 7a2a194955d..6a810492cc1 100644 --- a/examples/dice.c +++ b/examples/dice.c @@ -1,6 +1,4 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" +#include "darknet.h" char *dice_labels[] = {"face1","face2","face3","face4","face5","face6"}; diff --git a/examples/go.c b/examples/go.c index 3e3d5f67785..f4513574f96 100644 --- a/examples/go.c +++ b/examples/go.c @@ -1,9 +1,5 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/option_list.h" -#include "darknet/blas.h" -#include "darknet/data.h" +#include "darknet.h" + #include int inverted = 1; diff --git a/examples/lsd.c b/examples/lsd.c index 61f8e8f2cc7..85641ecd64c 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -1,8 +1,4 @@ -#include "darknet/network.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/blas.h" +#include "darknet.h" /* void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg, char *aweight, int clear) diff --git a/examples/nightmare.c b/examples/nightmare.c index 3eda5fb6c65..9538238d3f5 100644 --- a/examples/nightmare.c +++ b/examples/nightmare.c @@ -1,8 +1,4 @@ -#include "darknet/network.h" -#include "darknet/parser.h" -#include "darknet/blas.h" -#include "darknet/utils.h" -#include "darknet/region_layer.h" +#include "darknet.h" // ./darknet nightmare cfg/extractor.recon.cfg ~/trained/yolo-coco.conv frame6.png -reconstruct -iters 500 -i 3 -lambda .1 -rate .01 -smooth 2 diff --git a/examples/regressor.c b/examples/regressor.c index 30021e7fdbb..6dd2b4a2e0a 100644 --- a/examples/regressor.c +++ b/examples/regressor.c @@ -1,9 +1,4 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/option_list.h" -#include "darknet/blas.h" -#include "darknet/cuda.h" +#include "darknet.h" #include #include diff --git a/examples/rnn.c b/examples/rnn.c index ded239756bb..0ea4daabc73 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -1,8 +1,4 @@ -#include "darknet/network.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/blas.h" -#include "darknet/parser.h" +#include "darknet.h" typedef struct { float *x; diff --git a/examples/rnn_vid.c b/examples/rnn_vid.c index a5e2a758107..205f24c014b 100644 --- a/examples/rnn_vid.c +++ b/examples/rnn_vid.c @@ -1,8 +1,4 @@ -#include "darknet/network.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/blas.h" +#include "darknet.h" #ifdef OPENCV image get_image_from_stream(CvCapture *cap); diff --git a/examples/segmenter.c b/examples/segmenter.c index 12eb540876e..f24bbdaa3ff 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -1,9 +1,4 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/option_list.h" -#include "darknet/blas.h" -#include "darknet/cuda.h" +#include "darknet.h" #include #include @@ -153,7 +148,9 @@ void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *fi image rgb = mask_to_rgb(m); show_image(sized, "orig"); show_image(rgb, "pred"); +#ifdef OPENCV cvWaitKey(0); +#endif printf("Predicted: %f\n", predictions[0]); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); free_image(im); diff --git a/examples/super.c b/examples/super.c index d1f1bbf6f3e..89521c94f0e 100644 --- a/examples/super.c +++ b/examples/super.c @@ -1,7 +1,4 @@ -#include "darknet/network.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" +#include "darknet.h" void train_super(char *cfgfile, char *weightfile, int clear) { diff --git a/examples/swag.c b/examples/swag.c index 91a7beb7567..c22d7855c46 100644 --- a/examples/swag.c +++ b/examples/swag.c @@ -1,9 +1,5 @@ -#include "darknet/network.h" -#include "darknet/detection_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/box.h" +#include "darknet.h" +#include void train_swag(char *cfgfile, char *weightfile) { diff --git a/examples/tag.c b/examples/tag.c index 32a1bd1421d..f10cea5f079 100644 --- a/examples/tag.c +++ b/examples/tag.c @@ -1,6 +1,4 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" +#include "darknet.h" void train_tag(char *cfgfile, char *weightfile, int clear) { diff --git a/examples/voxel.c b/examples/voxel.c index b9387bc4a8d..01ea9bb9898 100644 --- a/examples/voxel.c +++ b/examples/voxel.c @@ -1,7 +1,4 @@ -#include "darknet/network.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" +#include "darknet.h" void extract_voxel(char *lfile, char *rfile, char *prefix) { diff --git a/examples/writing.c b/examples/writing.c index 7136ff71bd1..5d30ea90bf6 100644 --- a/examples/writing.c +++ b/examples/writing.c @@ -1,6 +1,4 @@ -#include "darknet/network.h" -#include "darknet/utils.h" -#include "darknet/parser.h" +#include "darknet.h" void train_writing(char *cfgfile, char *weightfile) { diff --git a/examples/yolo.c b/examples/yolo.c index c1bef8bdc87..e6ac873ec9c 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -1,10 +1,4 @@ -#include "darknet/network.h" -#include "darknet/detection_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/box.h" -#include "darknet/demo.h" +#include "darknet.h" char *voc_names[] = {"aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"}; diff --git a/include/darknet.h b/include/darknet.h new file mode 100644 index 00000000000..986d430935f --- /dev/null +++ b/include/darknet.h @@ -0,0 +1,538 @@ +#ifndef DARKNET_API +#define DARKNET_API +#include + +extern int gpu_index; + +#ifdef GPU + #define BLOCK 512 + + #include "cuda_runtime.h" + #include "curand.h" + #include "cublas_v2.h" + + #ifdef CUDNN + #include "cudnn.h" + #endif +#endif + +#ifndef __cplusplus + #ifdef OPENCV + #include "opencv2/highgui/highgui_c.h" + #include "opencv2/imgproc/imgproc_c.h" + #include "opencv2/core/version.hpp" + #if CV_MAJOR_VERSION == 3 + #include "opencv2/videoio/videoio_c.h" + #endif + #endif +#endif + +typedef struct{ + int *leaf; + int n; + int *parent; + int *child; + int *group; + char **name; + + int groups; + int *group_size; + int *group_offset; +} tree; + +typedef enum{ + LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN +}ACTIVATION; + +typedef enum { + CONVOLUTIONAL, + DECONVOLUTIONAL, + CONNECTED, + MAXPOOL, + SOFTMAX, + DETECTION, + DROPOUT, + CROP, + ROUTE, + COST, + NORMALIZATION, + AVGPOOL, + LOCAL, + SHORTCUT, + ACTIVE, + RNN, + GRU, + CRNN, + BATCHNORM, + NETWORK, + XNOR, + REGION, + REORG, + BLANK +} LAYER_TYPE; + +typedef enum{ + SSE, MASKED, L1, SMOOTH +} COST_TYPE; + +struct network; +typedef struct network network; + +struct layer; +typedef struct layer layer; + +struct layer{ + LAYER_TYPE type; + ACTIVATION activation; + COST_TYPE cost_type; + void (*forward) (struct layer, struct network); + void (*backward) (struct layer, struct network); + void (*update) (struct layer, int, float, float, float); + void (*forward_gpu) (struct layer, struct network); + void (*backward_gpu) (struct layer, struct network); + void (*update_gpu) (struct layer, int, float, float, float); + int batch_normalize; + int shortcut; + int batch; + int forced; + int flipped; + int inputs; + int outputs; + int nweights; + int nbiases; + int extra; + int truths; + int h,w,c; + int out_h, out_w, out_c; + int n; + int max_boxes; + int groups; + int size; + int side; + int stride; + int reverse; + int flatten; + int spatial; + int pad; + int sqrt; + int flip; + int index; + int binary; + int xnor; + int steps; + int hidden; + int truth; + float smooth; + float dot; + float angle; + float jitter; + float saturation; + float exposure; + float shift; + float ratio; + float learning_rate_scale; + int softmax; + int classes; + int coords; + int background; + int rescore; + int objectness; + int does_cost; + int joint; + int noadjust; + int reorg; + int log; + + int adam; + float B1; + float B2; + float eps; + int t; + + float alpha; + float beta; + float kappa; + + float coord_scale; + float object_scale; + float noobject_scale; + float class_scale; + int bias_match; + int random; + float thresh; + int classfix; + int absolute; + + int onlyforward; + int stopbackward; + int dontload; + int dontloadscales; + + float temperature; + float probability; + float scale; + + char * cweights; + int * indexes; + int * input_layers; + int * input_sizes; + int * map; + float * rand; + float * cost; + float * state; + float * prev_state; + float * forgot_state; + float * forgot_delta; + float * state_delta; + + float * concat; + float * concat_delta; + + float * binary_weights; + + float * biases; + float * bias_updates; + + float * scales; + float * scale_updates; + + float * weights; + float * weight_updates; + + float * delta; + float * output; + float * squared; + float * norms; + + float * spatial_mean; + float * mean; + float * variance; + + float * mean_delta; + float * variance_delta; + + float * rolling_mean; + float * rolling_variance; + + float * x; + float * x_norm; + + float * m; + float * v; + + float * bias_m; + float * bias_v; + float * scale_m; + float * scale_v; + + float * z_cpu; + float * r_cpu; + float * h_cpu; + + float * binary_input; + + struct layer *input_layer; + struct layer *self_layer; + struct layer *output_layer; + + struct layer *input_gate_layer; + struct layer *state_gate_layer; + struct layer *input_save_layer; + struct layer *state_save_layer; + struct layer *input_state_layer; + struct layer *state_state_layer; + + struct layer *input_z_layer; + struct layer *state_z_layer; + + struct layer *input_r_layer; + struct layer *state_r_layer; + + struct layer *input_h_layer; + struct layer *state_h_layer; + + tree *softmax_tree; + + size_t workspace_size; + + #ifdef GPU + int *indexes_gpu; + + float *z_gpu; + float *r_gpu; + float *h_gpu; + + float *m_gpu; + float *v_gpu; + float *bias_m_gpu; + float *scale_m_gpu; + float *bias_v_gpu; + float *scale_v_gpu; + + float * prev_state_gpu; + float * forgot_state_gpu; + float * forgot_delta_gpu; + float * state_gpu; + float * state_delta_gpu; + float * gate_gpu; + float * gate_delta_gpu; + float * save_gpu; + float * save_delta_gpu; + float * concat_gpu; + float * concat_delta_gpu; + + float *binary_input_gpu; + float *binary_weights_gpu; + + float * mean_gpu; + float * variance_gpu; + + float * rolling_mean_gpu; + float * rolling_variance_gpu; + + float * variance_delta_gpu; + float * mean_delta_gpu; + + float * x_gpu; + float * x_norm_gpu; + float * weights_gpu; + float * weight_updates_gpu; + + float * biases_gpu; + float * bias_updates_gpu; + + float * scales_gpu; + float * scale_updates_gpu; + + float * output_gpu; + float * delta_gpu; + float * rand_gpu; + float * squared_gpu; + float * norms_gpu; + #ifdef CUDNN + cudnnTensorDescriptor_t srcTensorDesc, dstTensorDesc; + cudnnTensorDescriptor_t dsrcTensorDesc, ddstTensorDesc; + cudnnTensorDescriptor_t normTensorDesc; + cudnnFilterDescriptor_t weightDesc; + cudnnFilterDescriptor_t dweightDesc; + cudnnConvolutionDescriptor_t convDesc; + cudnnConvolutionFwdAlgo_t fw_algo; + cudnnConvolutionBwdDataAlgo_t bd_algo; + cudnnConvolutionBwdFilterAlgo_t bf_algo; + #endif + #endif +}; + +void free_layer(layer); + +typedef enum { + CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM +} learning_rate_policy; + +typedef struct network{ + int n; + int batch; + int *seen; + float epoch; + int subdivisions; + float momentum; + float decay; + layer *layers; + float *output; + learning_rate_policy policy; + + float learning_rate; + float gamma; + float scale; + float power; + int time_steps; + int step; + int max_batches; + float *scales; + int *steps; + int num_steps; + int burn_in; + + int adam; + float B1; + float B2; + float eps; + + int inputs; + int outputs; + int truths; + int notruth; + int h, w, c; + int max_crop; + int min_crop; + int center; + float angle; + float aspect; + float exposure; + float saturation; + float hue; + + int gpu_index; + tree *hierarchy; + + float *input; + float *truth; + float *delta; + float *workspace; + int train; + int index; + float *cost; + + #ifdef GPU + float *input_gpu; + float *truth_gpu; + float *delta_gpu; + float *output_gpu; + #endif + +} network; + +typedef struct { + int w; + int h; + float scale; + float rad; + float dx; + float dy; + float aspect; +} augment_args; + +typedef struct { + int h; + int w; + int c; + float *data; +} image; + +typedef struct{ + float x, y, w, h; +} box; + +typedef struct matrix{ + int rows, cols; + float **vals; +} matrix; + + +typedef struct{ + int w, h; + matrix X; + matrix y; + int shallow; + int *num_boxes; + box **boxes; +} data; + +typedef enum { + CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA, SEGMENTATION_DATA +} data_type; + +typedef struct load_args{ + int threads; + char **paths; + char *path; + int n; + int m; + char **labels; + int h; + int w; + int out_w; + int out_h; + int nh; + int nw; + int num_boxes; + int min, max, size; + int classes; + int background; + int scale; + int center; + float jitter; + float angle; + float aspect; + float saturation; + float exposure; + float hue; + data *d; + image *im; + image *resized; + data_type type; + tree *hierarchy; +} load_args; + +typedef struct{ + int id; + float x,y,w,h; + float left, right, top, bottom; +} box_label; + + +network load_network(char *cfg, char *weights, int clear); +load_args get_base_args(network net); + +void free_data(data d); + +typedef struct node{ + void *val; + struct node *next; + struct node *prev; +} node; + +typedef struct list{ + int size; + node *front; + node *back; +} list; + +pthread_t load_data(load_args args); +list *read_data_cfg(char *filename); +list *read_cfg(char *filename); + + +#include "activation_layer.h" +#include "activations.h" +#include "avgpool_layer.h" +#include "batchnorm_layer.h" +#include "blas.h" +#include "box.h" +#include "classifier.h" +#include "col2im.h" +#include "connected_layer.h" +#include "convolutional_layer.h" +#include "cost_layer.h" +#include "crnn_layer.h" +#include "crop_layer.h" +#include "cuda.h" +#include "data.h" +#include "deconvolutional_layer.h" +#include "demo.h" +#include "detection_layer.h" +#include "dropout_layer.h" +#include "gemm.h" +#include "gru_layer.h" +#include "im2col.h" +#include "image.h" +#include "layer.h" +#include "list.h" +#include "local_layer.h" +#include "matrix.h" +#include "maxpool_layer.h" +#include "network.h" +#include "normalization_layer.h" +#include "option_list.h" +#include "parser.h" +#include "region_layer.h" +#include "reorg_layer.h" +#include "rnn_layer.h" +#include "route_layer.h" +#include "shortcut_layer.h" +#include "softmax_layer.h" +#include "stb_image.h" +#include "stb_image_write.h" +#include "tree.h" +#include "utils.h" +#endif diff --git a/src/activation_kernels.cu b/src/activation_kernels.cu index f78829903ed..994e2068146 100644 --- a/src/activation_kernels.cu +++ b/src/activation_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/activations.h" -#include "darknet/cuda.h" +#include "activations.h" +#include "cuda.h" } diff --git a/src/activation_layer.c b/src/activation_layer.c index 00596f8c2a6..de4e4b7d09b 100644 --- a/src/activation_layer.c +++ b/src/activation_layer.c @@ -1,8 +1,8 @@ -#include "darknet/activation_layer.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" -#include "darknet/gemm.h" +#include "activation_layer.h" +#include "utils.h" +#include "cuda.h" +#include "blas.h" +#include "gemm.h" #include #include diff --git a/src/activations.c b/src/activations.c index 38a89f2db04..0cbb2f5546e 100644 --- a/src/activations.c +++ b/src/activations.c @@ -1,4 +1,4 @@ -#include "darknet/activations.h" +#include "activations.h" #include #include diff --git a/src/activations.h b/src/activations.h index 1c36ff52544..54ab3c22778 100644 --- a/src/activations.h +++ b/src/activations.h @@ -1,12 +1,9 @@ #ifndef ACTIVATIONS_H #define ACTIVATIONS_H +#include "darknet.h" #include "cuda.h" #include "math.h" -typedef enum{ - LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN -}ACTIVATION; - ACTIVATION get_activation(char *s); char *get_activation_string(ACTIVATION a); diff --git a/src/avgpool_layer.c b/src/avgpool_layer.c index e7158e80765..83034dbecf4 100644 --- a/src/avgpool_layer.c +++ b/src/avgpool_layer.c @@ -1,5 +1,5 @@ -#include "darknet/avgpool_layer.h" -#include "darknet/cuda.h" +#include "avgpool_layer.h" +#include "cuda.h" #include avgpool_layer make_avgpool_layer(int batch, int w, int h, int c) diff --git a/src/avgpool_layer_kernels.cu b/src/avgpool_layer_kernels.cu index d8f70adc927..a7eca3aeae9 100644 --- a/src/avgpool_layer_kernels.cu +++ b/src/avgpool_layer_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/avgpool_layer.h" -#include "darknet/cuda.h" +#include "avgpool_layer.h" +#include "cuda.h" } __global__ void forward_avgpool_layer_kernel(int n, int w, int h, int c, float *input, float *output) diff --git a/src/batchnorm_layer.c b/src/batchnorm_layer.c index da8ac2fec0b..4862531d8eb 100644 --- a/src/batchnorm_layer.c +++ b/src/batchnorm_layer.c @@ -1,6 +1,6 @@ -#include "darknet/convolutional_layer.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/blas.h" +#include "convolutional_layer.h" +#include "batchnorm_layer.h" +#include "blas.h" #include layer make_batchnorm_layer(int batch, int w, int h, int c) diff --git a/src/blas.c b/src/blas.c index 751c9d7a8bc..668b12c3703 100644 --- a/src/blas.c +++ b/src/blas.c @@ -1,4 +1,4 @@ -#include "darknet/blas.h" +#include "blas.h" #include #include diff --git a/src/blas.h b/src/blas.h index a61b7d8ca66..49ff08758c8 100644 --- a/src/blas.h +++ b/src/blas.h @@ -18,7 +18,7 @@ void copy_cpu(int N, float *X, int INCX, float *Y, int INCY); void scal_cpu(int N, float ALPHA, float *X, int INCX); void fill_cpu(int N, float ALPHA, float * X, int INCX); float dot_cpu(int N, float *X, int INCX, float *Y, int INCY); -void test_gpu_blas(); +int test_gpu_blas(); void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out); void mean_cpu(float *x, int batch, int filters, int spatial, float *mean); diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index b54603c9220..9f1337ca6bc 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -4,9 +4,9 @@ #include extern "C" { -#include "darknet/blas.h" -#include "darknet/cuda.h" -#include "darknet/utils.h" +#include "blas.h" +#include "cuda.h" +#include "utils.h" } __global__ void scale_bias_kernel(float *output, float *biases, int n, int size) diff --git a/src/box.c b/src/box.c index dbf432eea65..88ca71ac865 100644 --- a/src/box.c +++ b/src/box.c @@ -1,4 +1,4 @@ -#include "darknet/box.h" +#include "box.h" #include #include #include diff --git a/src/box.h b/src/box.h index 49585ed470c..59b38a58d19 100644 --- a/src/box.h +++ b/src/box.h @@ -1,9 +1,6 @@ #ifndef BOX_H #define BOX_H - -typedef struct{ - float x, y, w, h; -} box; +#include "darknet.h" typedef struct{ float dx, dy, dw, dh; diff --git a/src/classifier.h b/src/classifier.h index 3c89f49cdc5..8b137891791 100644 --- a/src/classifier.h +++ b/src/classifier.h @@ -1,2 +1 @@ -list *read_data_cfg(char *filename); diff --git a/src/col2im_kernels.cu b/src/col2im_kernels.cu index d8a5e3714fb..aed2df9bb62 100644 --- a/src/col2im_kernels.cu +++ b/src/col2im_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/col2im.h" -#include "darknet/cuda.h" +#include "col2im.h" +#include "cuda.h" } // src: https://github.com/BVLC/caffe/blob/master/src/caffe/util/im2col.cu diff --git a/src/compare.c b/src/compare.c index f773bfbb1d4..4fd266c7dc3 100644 --- a/src/compare.c +++ b/src/compare.c @@ -1,11 +1,11 @@ #include -#include "darknet/network.h" -#include "darknet/detection_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/box.h" +#include "network.h" +#include "detection_layer.h" +#include "cost_layer.h" +#include "utils.h" +#include "parser.h" +#include "box.h" void train_compare(char *cfgfile, char *weightfile) { diff --git a/src/connected_layer.c b/src/connected_layer.c index 4300dbdc851..f8c74235327 100644 --- a/src/connected_layer.c +++ b/src/connected_layer.c @@ -1,9 +1,9 @@ -#include "darknet/connected_layer.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" -#include "darknet/gemm.h" +#include "connected_layer.h" +#include "batchnorm_layer.h" +#include "utils.h" +#include "cuda.h" +#include "blas.h" +#include "gemm.h" #include #include diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index 4146a3e5ab7..b53dd16a27b 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -3,14 +3,14 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/convolutional_layer.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/gemm.h" -#include "darknet/blas.h" -#include "darknet/im2col.h" -#include "darknet/col2im.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" +#include "convolutional_layer.h" +#include "batchnorm_layer.h" +#include "gemm.h" +#include "blas.h" +#include "im2col.h" +#include "col2im.h" +#include "utils.h" +#include "cuda.h" } __global__ void binarize_kernel(float *x, int n, float *binary) diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index 0dbc7b74b8b..e5b5bb6f2be 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -1,10 +1,10 @@ -#include "darknet/convolutional_layer.h" -#include "darknet/utils.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/im2col.h" -#include "darknet/col2im.h" -#include "darknet/blas.h" -#include "darknet/gemm.h" +#include "convolutional_layer.h" +#include "utils.h" +#include "batchnorm_layer.h" +#include "im2col.h" +#include "col2im.h" +#include "blas.h" +#include "gemm.h" #include #include diff --git a/src/cost_layer.c b/src/cost_layer.c index 251ec5a9995..76c001f0363 100644 --- a/src/cost_layer.c +++ b/src/cost_layer.c @@ -1,7 +1,7 @@ -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" +#include "cost_layer.h" +#include "utils.h" +#include "cuda.h" +#include "blas.h" #include #include #include diff --git a/src/crnn_layer.c b/src/crnn_layer.c index a8b040ddf04..2478fef5e71 100644 --- a/src/crnn_layer.c +++ b/src/crnn_layer.c @@ -1,9 +1,9 @@ -#include "darknet/crnn_layer.h" -#include "darknet/convolutional_layer.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" -#include "darknet/gemm.h" +#include "crnn_layer.h" +#include "convolutional_layer.h" +#include "utils.h" +#include "cuda.h" +#include "blas.h" +#include "gemm.h" #include #include diff --git a/src/crop_layer.c b/src/crop_layer.c index afac7ee0b7b..3b918529e64 100644 --- a/src/crop_layer.c +++ b/src/crop_layer.c @@ -1,5 +1,5 @@ -#include "darknet/crop_layer.h" -#include "darknet/cuda.h" +#include "crop_layer.h" +#include "cuda.h" #include image get_crop_image(crop_layer l) diff --git a/src/crop_layer_kernels.cu b/src/crop_layer_kernels.cu index 41f6f456f48..b6568219c34 100644 --- a/src/crop_layer_kernels.cu +++ b/src/crop_layer_kernels.cu @@ -3,10 +3,10 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/crop_layer.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" -#include "darknet/image.h" +#include "crop_layer.h" +#include "utils.h" +#include "cuda.h" +#include "image.h" } __device__ float get_pixel_kernel(float *image, int w, int h, int x, int y, int c) diff --git a/src/cuda.c b/src/cuda.c index 085a576454f..e011b89d079 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -2,9 +2,9 @@ int gpu_index = 0; #ifdef GPU -#include "darknet/cuda.h" -#include "darknet/utils.h" -#include "darknet/blas.h" +#include "cuda.h" +#include "utils.h" +#include "blas.h" #include #include #include diff --git a/src/cuda.h b/src/cuda.h index 52794fa4a04..cdaba208cd7 100644 --- a/src/cuda.h +++ b/src/cuda.h @@ -1,20 +1,10 @@ #ifndef CUDA_H #define CUDA_H -extern int gpu_index; +#include "darknet.h" #ifdef GPU -#define BLOCK 512 - -#include "cuda_runtime.h" -#include "curand.h" -#include "cublas_v2.h" - -#ifdef CUDNN -#include "cudnn.h" -#endif - void check_error(cudaError_t status); cublasHandle_t blas_handle(); float *cuda_make_array(float *x, size_t n); diff --git a/src/data.c b/src/data.c index 1ea115a3258..dcc5089b025 100644 --- a/src/data.c +++ b/src/data.c @@ -1,7 +1,7 @@ -#include "darknet/data.h" -#include "darknet/utils.h" -#include "darknet/image.h" -#include "darknet/cuda.h" +#include "data.h" +#include "utils.h" +#include "image.h" +#include "cuda.h" #include #include diff --git a/src/data.h b/src/data.h index c366d66e078..8f18d9f669a 100644 --- a/src/data.h +++ b/src/data.h @@ -2,6 +2,7 @@ #define DATA_H #include +#include "darknet.h" #include "matrix.h" #include "list.h" #include "image.h" @@ -17,61 +18,6 @@ static inline float distance_from_edge(int x, int max) if (dist > 1) dist = 1; return dist; } - -typedef struct{ - int w, h; - matrix X; - matrix y; - int shallow; - int *num_boxes; - box **boxes; -} data; - -typedef enum { - CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA, SEGMENTATION_DATA -} data_type; - -typedef struct load_args{ - int threads; - char **paths; - char *path; - int n; - int m; - char **labels; - int h; - int w; - int out_w; - int out_h; - int nh; - int nw; - int num_boxes; - int min, max, size; - int classes; - int background; - int scale; - int center; - float jitter; - float angle; - float aspect; - float saturation; - float exposure; - float hue; - data *d; - image *im; - image *resized; - data_type type; - tree *hierarchy; -} load_args; - -typedef struct{ - int id; - float x,y,w,h; - float left, right, top, bottom; -} box_label; - -void free_data(data d); - -pthread_t load_data(load_args args); void load_data_blocking(load_args args); pthread_t load_data_in_thread(load_args args); diff --git a/src/deconvolutional_kernels.cu b/src/deconvolutional_kernels.cu index 1d4bc7c92f5..166946349ab 100644 --- a/src/deconvolutional_kernels.cu +++ b/src/deconvolutional_kernels.cu @@ -3,15 +3,15 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/convolutional_layer.h" -#include "darknet/deconvolutional_layer.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/gemm.h" -#include "darknet/blas.h" -#include "darknet/im2col.h" -#include "darknet/col2im.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" +#include "convolutional_layer.h" +#include "deconvolutional_layer.h" +#include "batchnorm_layer.h" +#include "gemm.h" +#include "blas.h" +#include "im2col.h" +#include "col2im.h" +#include "utils.h" +#include "cuda.h" } extern "C" void forward_deconvolutional_layer_gpu(layer l, network net) diff --git a/src/deconvolutional_layer.c b/src/deconvolutional_layer.c index 3ceff782c11..3778b418aa4 100644 --- a/src/deconvolutional_layer.c +++ b/src/deconvolutional_layer.c @@ -1,11 +1,11 @@ -#include "darknet/deconvolutional_layer.h" -#include "darknet/convolutional_layer.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/utils.h" -#include "darknet/im2col.h" -#include "darknet/col2im.h" -#include "darknet/blas.h" -#include "darknet/gemm.h" +#include "deconvolutional_layer.h" +#include "convolutional_layer.h" +#include "batchnorm_layer.h" +#include "utils.h" +#include "im2col.h" +#include "col2im.h" +#include "blas.h" +#include "gemm.h" #include #include diff --git a/src/demo.c b/src/demo.c index cf22273b8e3..9dc4946a6dc 100644 --- a/src/demo.c +++ b/src/demo.c @@ -1,12 +1,12 @@ -#include "darknet/network.h" -#include "darknet/detection_layer.h" -#include "darknet/region_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/utils.h" -#include "darknet/parser.h" -#include "darknet/box.h" -#include "darknet/image.h" -#include "darknet/demo.h" +#include "network.h" +#include "detection_layer.h" +#include "region_layer.h" +#include "cost_layer.h" +#include "utils.h" +#include "parser.h" +#include "box.h" +#include "image.h" +#include "demo.h" #include #define DEMO 1 @@ -31,7 +31,7 @@ static float demo_hier = .5; static int running = 0; static int demo_delay = 0; -static int demo_frame = 5; +static int demo_frame = 3; static int demo_detections = 0; static float **predictions; static int demo_index = 0; diff --git a/src/detection_layer.c b/src/detection_layer.c index 721d64c2c73..100694babde 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -1,10 +1,10 @@ -#include "darknet/detection_layer.h" -#include "darknet/activations.h" -#include "darknet/softmax_layer.h" -#include "darknet/blas.h" -#include "darknet/box.h" -#include "darknet/cuda.h" -#include "darknet/utils.h" +#include "detection_layer.h" +#include "activations.h" +#include "softmax_layer.h" +#include "blas.h" +#include "box.h" +#include "cuda.h" +#include "utils.h" #include #include diff --git a/src/dropout_layer.c b/src/dropout_layer.c index 1e344f45fd7..780554fb371 100644 --- a/src/dropout_layer.c +++ b/src/dropout_layer.c @@ -1,6 +1,6 @@ -#include "darknet/dropout_layer.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" +#include "dropout_layer.h" +#include "utils.h" +#include "cuda.h" #include #include diff --git a/src/dropout_layer_kernels.cu b/src/dropout_layer_kernels.cu index 862e6f45a86..bd12b678758 100644 --- a/src/dropout_layer_kernels.cu +++ b/src/dropout_layer_kernels.cu @@ -3,9 +3,9 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/dropout_layer.h" -#include "darknet/cuda.h" -#include "darknet/utils.h" +#include "dropout_layer.h" +#include "cuda.h" +#include "utils.h" } __global__ void yoloswag420blazeit360noscope(float *input, int size, float *rand, float prob, float scale) diff --git a/src/gemm.c b/src/gemm.c index 245ae641195..3003be0ed5a 100644 --- a/src/gemm.c +++ b/src/gemm.c @@ -1,6 +1,6 @@ -#include "darknet/gemm.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" +#include "gemm.h" +#include "utils.h" +#include "cuda.h" #include #include #include diff --git a/src/gru_layer.c b/src/gru_layer.c index 68ffed34102..7139f798f29 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -1,9 +1,9 @@ -#include "darknet/gru_layer.h" -#include "darknet/connected_layer.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" -#include "darknet/gemm.h" +#include "gru_layer.h" +#include "connected_layer.h" +#include "utils.h" +#include "cuda.h" +#include "blas.h" +#include "gemm.h" #include #include diff --git a/src/im2col.c b/src/im2col.c index 67c078bc734..69ec98a9d12 100644 --- a/src/im2col.c +++ b/src/im2col.c @@ -1,4 +1,4 @@ -#include "darknet/im2col.h" +#include "im2col.h" #include float im2col_get_pixel(float *im, int height, int width, int channels, int row, int col, int channel, int pad) diff --git a/src/im2col_kernels.cu b/src/im2col_kernels.cu index 02f0e07033f..d42d600be18 100644 --- a/src/im2col_kernels.cu +++ b/src/im2col_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/im2col.h" -#include "darknet/cuda.h" +#include "im2col.h" +#include "cuda.h" } // src: https://github.com/BVLC/caffe/blob/master/src/caffe/util/im2col.cu diff --git a/src/image.c b/src/image.c index b9f629cae5a..1a8c984a6e8 100644 --- a/src/image.c +++ b/src/image.c @@ -1,14 +1,14 @@ -#include "darknet/image.h" -#include "darknet/utils.h" -#include "darknet/blas.h" -#include "darknet/cuda.h" +#include "image.h" +#include "utils.h" +#include "blas.h" +#include "cuda.h" #include #include #define STB_IMAGE_IMPLEMENTATION -#include "darknet/stb_image.h" +#include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION -#include "darknet/stb_image_write.h" +#include "stb_image_write.h" int windows = 0; diff --git a/src/image.h b/src/image.h index 7201515cf9e..8b516c141ab 100644 --- a/src/image.h +++ b/src/image.h @@ -7,34 +7,7 @@ #include #include #include "box.h" - -#ifndef __cplusplus -#ifdef OPENCV -#include "opencv2/highgui/highgui_c.h" -#include "opencv2/imgproc/imgproc_c.h" -#include "opencv2/core/version.hpp" -#if CV_MAJOR_VERSION == 3 -#include "opencv2/videoio/videoio_c.h" -#endif -#endif -#endif - -typedef struct { - int w; - int h; - float scale; - float rad; - float dx; - float dy; - float aspect; -} augment_args; - -typedef struct { - int h; - int w; - int c; - float *data; -} image; +#include "darknet.h" #ifndef __cplusplus #ifdef OPENCV diff --git a/src/layer.c b/src/layer.c index bfa56e7879e..c27b4776421 100644 --- a/src/layer.c +++ b/src/layer.c @@ -1,5 +1,5 @@ -#include "darknet/layer.h" -#include "darknet/cuda.h" +#include "layer.h" +#include "cuda.h" #include diff --git a/src/layer.h b/src/layer.h index 620d367419a..af6cd2ab505 100644 --- a/src/layer.h +++ b/src/layer.h @@ -1,289 +1 @@ -#ifndef BASE_LAYER_H -#define BASE_LAYER_H - -#include "activations.h" -#include "stddef.h" -#include "tree.h" - -struct network; -typedef struct network network; - -struct layer; -typedef struct layer layer; - -typedef enum { - CONVOLUTIONAL, - DECONVOLUTIONAL, - CONNECTED, - MAXPOOL, - SOFTMAX, - DETECTION, - DROPOUT, - CROP, - ROUTE, - COST, - NORMALIZATION, - AVGPOOL, - LOCAL, - SHORTCUT, - ACTIVE, - RNN, - GRU, - CRNN, - BATCHNORM, - NETWORK, - XNOR, - REGION, - REORG, - BLANK -} LAYER_TYPE; - -typedef enum{ - SSE, MASKED, L1, SMOOTH -} COST_TYPE; - -struct layer{ - LAYER_TYPE type; - ACTIVATION activation; - COST_TYPE cost_type; - void (*forward) (struct layer, struct network); - void (*backward) (struct layer, struct network); - void (*update) (struct layer, int, float, float, float); - void (*forward_gpu) (struct layer, struct network); - void (*backward_gpu) (struct layer, struct network); - void (*update_gpu) (struct layer, int, float, float, float); - int batch_normalize; - int shortcut; - int batch; - int forced; - int flipped; - int inputs; - int outputs; - int nweights; - int nbiases; - int extra; - int truths; - int h,w,c; - int out_h, out_w, out_c; - int n; - int max_boxes; - int groups; - int size; - int side; - int stride; - int reverse; - int flatten; - int spatial; - int pad; - int sqrt; - int flip; - int index; - int binary; - int xnor; - int steps; - int hidden; - int truth; - float smooth; - float dot; - float angle; - float jitter; - float saturation; - float exposure; - float shift; - float ratio; - float learning_rate_scale; - int softmax; - int classes; - int coords; - int background; - int rescore; - int objectness; - int does_cost; - int joint; - int noadjust; - int reorg; - int log; - - int adam; - float B1; - float B2; - float eps; - int t; - - float alpha; - float beta; - float kappa; - - float coord_scale; - float object_scale; - float noobject_scale; - float class_scale; - int bias_match; - int random; - float thresh; - int classfix; - int absolute; - - int onlyforward; - int stopbackward; - int dontload; - int dontloadscales; - - float temperature; - float probability; - float scale; - - char * cweights; - int * indexes; - int * input_layers; - int * input_sizes; - int * map; - float * rand; - float * cost; - float * state; - float * prev_state; - float * forgot_state; - float * forgot_delta; - float * state_delta; - - float * concat; - float * concat_delta; - - float * binary_weights; - - float * biases; - float * bias_updates; - - float * scales; - float * scale_updates; - - float * weights; - float * weight_updates; - - float * delta; - float * output; - float * squared; - float * norms; - - float * spatial_mean; - float * mean; - float * variance; - - float * mean_delta; - float * variance_delta; - - float * rolling_mean; - float * rolling_variance; - - float * x; - float * x_norm; - - float * m; - float * v; - - float * bias_m; - float * bias_v; - float * scale_m; - float * scale_v; - - float * z_cpu; - float * r_cpu; - float * h_cpu; - - float * binary_input; - - struct layer *input_layer; - struct layer *self_layer; - struct layer *output_layer; - - struct layer *input_gate_layer; - struct layer *state_gate_layer; - struct layer *input_save_layer; - struct layer *state_save_layer; - struct layer *input_state_layer; - struct layer *state_state_layer; - - struct layer *input_z_layer; - struct layer *state_z_layer; - - struct layer *input_r_layer; - struct layer *state_r_layer; - - struct layer *input_h_layer; - struct layer *state_h_layer; - - tree *softmax_tree; - - size_t workspace_size; - - #ifdef GPU - int *indexes_gpu; - - float *z_gpu; - float *r_gpu; - float *h_gpu; - - float *m_gpu; - float *v_gpu; - float *bias_m_gpu; - float *scale_m_gpu; - float *bias_v_gpu; - float *scale_v_gpu; - - float * prev_state_gpu; - float * forgot_state_gpu; - float * forgot_delta_gpu; - float * state_gpu; - float * state_delta_gpu; - float * gate_gpu; - float * gate_delta_gpu; - float * save_gpu; - float * save_delta_gpu; - float * concat_gpu; - float * concat_delta_gpu; - - float *binary_input_gpu; - float *binary_weights_gpu; - - float * mean_gpu; - float * variance_gpu; - - float * rolling_mean_gpu; - float * rolling_variance_gpu; - - float * variance_delta_gpu; - float * mean_delta_gpu; - - float * x_gpu; - float * x_norm_gpu; - float * weights_gpu; - float * weight_updates_gpu; - - float * biases_gpu; - float * bias_updates_gpu; - - float * scales_gpu; - float * scale_updates_gpu; - - float * output_gpu; - float * delta_gpu; - float * rand_gpu; - float * squared_gpu; - float * norms_gpu; - #ifdef CUDNN - cudnnTensorDescriptor_t srcTensorDesc, dstTensorDesc; - cudnnTensorDescriptor_t dsrcTensorDesc, ddstTensorDesc; - cudnnTensorDescriptor_t normTensorDesc; - cudnnFilterDescriptor_t weightDesc; - cudnnFilterDescriptor_t dweightDesc; - cudnnConvolutionDescriptor_t convDesc; - cudnnConvolutionFwdAlgo_t fw_algo; - cudnnConvolutionBwdDataAlgo_t bd_algo; - cudnnConvolutionBwdFilterAlgo_t bf_algo; - #endif - #endif -}; - -void free_layer(layer); - -#endif +#include "darknet.h" diff --git a/src/list.c b/src/list.c index 2be48d71aa5..0e4165d3780 100644 --- a/src/list.c +++ b/src/list.c @@ -1,6 +1,6 @@ #include #include -#include "darknet/list.h" +#include "list.h" list *make_list() { diff --git a/src/list.h b/src/list.h index fb818c2a0c9..214b280530d 100644 --- a/src/list.h +++ b/src/list.h @@ -1,17 +1,6 @@ #ifndef LIST_H #define LIST_H - -typedef struct node{ - void *val; - struct node *next; - struct node *prev; -} node; - -typedef struct list{ - int size; - node *front; - node *back; -} list; +#include "darknet.h" list *make_list(); int list_find(list *l, void *val); diff --git a/src/local_layer.c b/src/local_layer.c index 4fa934c50cf..aad036e050c 100644 --- a/src/local_layer.c +++ b/src/local_layer.c @@ -1,9 +1,9 @@ -#include "darknet/local_layer.h" -#include "darknet/utils.h" -#include "darknet/im2col.h" -#include "darknet/col2im.h" -#include "darknet/blas.h" -#include "darknet/gemm.h" +#include "local_layer.h" +#include "utils.h" +#include "im2col.h" +#include "col2im.h" +#include "blas.h" +#include "gemm.h" #include #include diff --git a/src/matrix.c b/src/matrix.c index 6a0c4fd44f3..799916bff01 100644 --- a/src/matrix.c +++ b/src/matrix.c @@ -1,6 +1,6 @@ -#include "darknet/matrix.h" -#include "darknet/utils.h" -#include "darknet/blas.h" +#include "matrix.h" +#include "utils.h" +#include "blas.h" #include #include #include diff --git a/src/matrix.h b/src/matrix.h index d6655eb4f0b..14afcd753fd 100644 --- a/src/matrix.h +++ b/src/matrix.h @@ -1,9 +1,6 @@ #ifndef MATRIX_H #define MATRIX_H -typedef struct matrix{ - int rows, cols; - float **vals; -} matrix; +#include "darknet.h" matrix make_matrix(int rows, int cols); matrix copy_matrix(matrix m); diff --git a/src/maxpool_layer.c b/src/maxpool_layer.c index 520dda540c1..17dedf7a14c 100644 --- a/src/maxpool_layer.c +++ b/src/maxpool_layer.c @@ -1,5 +1,5 @@ -#include "darknet/maxpool_layer.h" -#include "darknet/cuda.h" +#include "maxpool_layer.h" +#include "cuda.h" #include image get_maxpool_image(maxpool_layer l) diff --git a/src/maxpool_layer_kernels.cu b/src/maxpool_layer_kernels.cu index 749c3880b21..3202e84b695 100644 --- a/src/maxpool_layer_kernels.cu +++ b/src/maxpool_layer_kernels.cu @@ -3,8 +3,8 @@ #include "cublas_v2.h" extern "C" { -#include "darknet/maxpool_layer.h" -#include "darknet/cuda.h" +#include "maxpool_layer.h" +#include "cuda.h" } __global__ void forward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c, int stride, int size, int pad, float *input, float *output, int *indexes) diff --git a/src/network.c b/src/network.c index 7b753549c8e..2b21338dca9 100644 --- a/src/network.c +++ b/src/network.c @@ -1,34 +1,34 @@ #include #include #include -#include "darknet/network.h" -#include "darknet/image.h" -#include "darknet/data.h" -#include "darknet/utils.h" -#include "darknet/blas.h" - -#include "darknet/crop_layer.h" -#include "darknet/connected_layer.h" -#include "darknet/gru_layer.h" -#include "darknet/rnn_layer.h" -#include "darknet/crnn_layer.h" -#include "darknet/local_layer.h" -#include "darknet/convolutional_layer.h" -#include "darknet/activation_layer.h" -#include "darknet/detection_layer.h" -#include "darknet/region_layer.h" -#include "darknet/normalization_layer.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/maxpool_layer.h" -#include "darknet/reorg_layer.h" -#include "darknet/avgpool_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/softmax_layer.h" -#include "darknet/dropout_layer.h" -#include "darknet/route_layer.h" -#include "darknet/shortcut_layer.h" -#include "darknet/parser.h" -#include "darknet/data.h" +#include "network.h" +#include "image.h" +#include "data.h" +#include "utils.h" +#include "blas.h" + +#include "crop_layer.h" +#include "connected_layer.h" +#include "gru_layer.h" +#include "rnn_layer.h" +#include "crnn_layer.h" +#include "local_layer.h" +#include "convolutional_layer.h" +#include "activation_layer.h" +#include "detection_layer.h" +#include "region_layer.h" +#include "normalization_layer.h" +#include "batchnorm_layer.h" +#include "maxpool_layer.h" +#include "reorg_layer.h" +#include "avgpool_layer.h" +#include "cost_layer.h" +#include "softmax_layer.h" +#include "dropout_layer.h" +#include "route_layer.h" +#include "shortcut_layer.h" +#include "parser.h" +#include "data.h" load_args get_base_args(network net) { diff --git a/src/network.h b/src/network.h index 64d0b61c274..15a644e5e17 100644 --- a/src/network.h +++ b/src/network.h @@ -1,81 +1,13 @@ // Oh boy, why am I about to do this.... #ifndef NETWORK_H #define NETWORK_H +#include "darknet.h" #include "image.h" #include "layer.h" #include "data.h" #include "tree.h" -typedef enum { - CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM -} learning_rate_policy; - -typedef struct network{ - int n; - int batch; - int *seen; - float epoch; - int subdivisions; - float momentum; - float decay; - layer *layers; - float *output; - learning_rate_policy policy; - - float learning_rate; - float gamma; - float scale; - float power; - int time_steps; - int step; - int max_batches; - float *scales; - int *steps; - int num_steps; - int burn_in; - - int adam; - float B1; - float B2; - float eps; - - int inputs; - int outputs; - int truths; - int notruth; - int h, w, c; - int max_crop; - int min_crop; - int center; - float angle; - float aspect; - float exposure; - float saturation; - float hue; - - int gpu_index; - tree *hierarchy; - - - - float *input; - float *truth; - float *delta; - float *workspace; - int train; - int index; - float *cost; - - #ifdef GPU - float *input_gpu; - float *truth_gpu; - float *delta_gpu; - float *output_gpu; - #endif - -} network; - #ifdef GPU float train_networks(network *nets, int n, data d, int interval); @@ -118,8 +50,6 @@ void print_network(network net); void visualize_network(network net); int resize_network(network *net, int w, int h); void set_batch_network(network *net, int b); -network load_network(char *cfg, char *weights, int clear); -load_args get_base_args(network net); void calc_network_cost(network net); #endif diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 56ef50d7f90..2fbc2dd47f2 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -7,32 +7,32 @@ extern "C" { #include #include -#include "darknet/network.h" -#include "darknet/data.h" -#include "darknet/utils.h" -#include "darknet/parser.h" - -#include "darknet/crop_layer.h" -#include "darknet/connected_layer.h" -#include "darknet/rnn_layer.h" -#include "darknet/gru_layer.h" -#include "darknet/crnn_layer.h" -#include "darknet/detection_layer.h" -#include "darknet/region_layer.h" -#include "darknet/convolutional_layer.h" -#include "darknet/activation_layer.h" -#include "darknet/maxpool_layer.h" -#include "darknet/reorg_layer.h" -#include "darknet/avgpool_layer.h" -#include "darknet/normalization_layer.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/local_layer.h" -#include "darknet/softmax_layer.h" -#include "darknet/dropout_layer.h" -#include "darknet/route_layer.h" -#include "darknet/shortcut_layer.h" -#include "darknet/blas.h" +#include "network.h" +#include "data.h" +#include "utils.h" +#include "parser.h" + +#include "crop_layer.h" +#include "connected_layer.h" +#include "rnn_layer.h" +#include "gru_layer.h" +#include "crnn_layer.h" +#include "detection_layer.h" +#include "region_layer.h" +#include "convolutional_layer.h" +#include "activation_layer.h" +#include "maxpool_layer.h" +#include "reorg_layer.h" +#include "avgpool_layer.h" +#include "normalization_layer.h" +#include "batchnorm_layer.h" +#include "cost_layer.h" +#include "local_layer.h" +#include "softmax_layer.h" +#include "dropout_layer.h" +#include "route_layer.h" +#include "shortcut_layer.h" +#include "blas.h" } void forward_network_gpu(network net) diff --git a/src/normalization_layer.c b/src/normalization_layer.c index ce62e26ec42..9f959a4f6a7 100644 --- a/src/normalization_layer.c +++ b/src/normalization_layer.c @@ -1,5 +1,5 @@ -#include "darknet/normalization_layer.h" -#include "darknet/blas.h" +#include "normalization_layer.h" +#include "blas.h" #include diff --git a/src/option_list.c b/src/option_list.c index e3cae4d2fe0..f935af301f8 100644 --- a/src/option_list.c +++ b/src/option_list.c @@ -1,8 +1,8 @@ #include #include #include -#include "darknet/option_list.h" -#include "darknet/utils.h" +#include "option_list.h" +#include "utils.h" list *read_data_cfg(char *filename) { diff --git a/src/option_list.h b/src/option_list.h index 054b3fdd7e3..d0417aa9446 100644 --- a/src/option_list.h +++ b/src/option_list.h @@ -9,7 +9,6 @@ typedef struct{ } kvp; -list *read_data_cfg(char *filename); int read_option(char *s, list *options); void option_insert(list *l, char *key, char *val); char *option_find(list *l, char *key); diff --git a/src/parser.c b/src/parser.c index 38b1cccefbe..b31e1cd052a 100644 --- a/src/parser.c +++ b/src/parser.c @@ -3,33 +3,33 @@ #include #include -#include "darknet/activation_layer.h" -#include "darknet/activations.h" -#include "darknet/avgpool_layer.h" -#include "darknet/batchnorm_layer.h" -#include "darknet/blas.h" -#include "darknet/connected_layer.h" -#include "darknet/deconvolutional_layer.h" -#include "darknet/convolutional_layer.h" -#include "darknet/cost_layer.h" -#include "darknet/crnn_layer.h" -#include "darknet/crop_layer.h" -#include "darknet/detection_layer.h" -#include "darknet/dropout_layer.h" -#include "darknet/gru_layer.h" -#include "darknet/list.h" -#include "darknet/local_layer.h" -#include "darknet/maxpool_layer.h" -#include "darknet/normalization_layer.h" -#include "darknet/option_list.h" -#include "darknet/parser.h" -#include "darknet/region_layer.h" -#include "darknet/reorg_layer.h" -#include "darknet/rnn_layer.h" -#include "darknet/route_layer.h" -#include "darknet/shortcut_layer.h" -#include "darknet/softmax_layer.h" -#include "darknet/utils.h" +#include "activation_layer.h" +#include "activations.h" +#include "avgpool_layer.h" +#include "batchnorm_layer.h" +#include "blas.h" +#include "connected_layer.h" +#include "deconvolutional_layer.h" +#include "convolutional_layer.h" +#include "cost_layer.h" +#include "crnn_layer.h" +#include "crop_layer.h" +#include "detection_layer.h" +#include "dropout_layer.h" +#include "gru_layer.h" +#include "list.h" +#include "local_layer.h" +#include "maxpool_layer.h" +#include "normalization_layer.h" +#include "option_list.h" +#include "parser.h" +#include "region_layer.h" +#include "reorg_layer.h" +#include "rnn_layer.h" +#include "route_layer.h" +#include "shortcut_layer.h" +#include "softmax_layer.h" +#include "utils.h" typedef struct{ char *type; @@ -760,7 +760,7 @@ list *read_cfg(char *filename) if(file == 0) file_error(filename); char *line; int nu = 0; - list *sections = make_list(); + list *options = make_list(); section *current = 0; while((line=fgetl(file)) != 0){ ++ nu; @@ -768,7 +768,7 @@ list *read_cfg(char *filename) switch(line[0]){ case '[': current = malloc(sizeof(section)); - list_insert(sections, current); + list_insert(options, current); current->options = make_list(); current->type = line; break; @@ -786,7 +786,7 @@ list *read_cfg(char *filename) } } fclose(file); - return sections; + return options; } void save_convolutional_weights_binary(layer l, FILE *fp) diff --git a/src/region_layer.c b/src/region_layer.c index 49147e354cd..1f88bf77d69 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -1,9 +1,9 @@ -#include "darknet/region_layer.h" -#include "darknet/activations.h" -#include "darknet/blas.h" -#include "darknet/box.h" -#include "darknet/cuda.h" -#include "darknet/utils.h" +#include "region_layer.h" +#include "activations.h" +#include "blas.h" +#include "box.h" +#include "cuda.h" +#include "utils.h" #include #include @@ -448,15 +448,65 @@ void forward_region_layer_gpu(const layer l, network net) int index = entry_index(l, 0, 0, 5); softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); /* + // TIMING CODE + int zz; + int number = 1000; + int count = 0; int i; - int count = 5; for (i = 0; i < l.softmax_tree->groups; ++i) { int group_size = l.softmax_tree->group_size[i]; - int index = entry_index(l, 0, 0, count); - softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); count += group_size; } + printf("%d %d\n", l.softmax_tree->groups, count); + { + double then = what_time_is_it_now(); + for(zz = 0; zz < number; ++zz){ + int index = entry_index(l, 0, 0, 5); + softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); + } + cudaDeviceSynchronize(); + printf("Good GPU Timing: %f\n", what_time_is_it_now() - then); + } + { + double then = what_time_is_it_now(); + for(zz = 0; zz < number; ++zz){ + int i; + int count = 5; + for (i = 0; i < l.softmax_tree->groups; ++i) { + int group_size = l.softmax_tree->group_size[i]; + int index = entry_index(l, 0, 0, count); + softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); + count += group_size; + } + } + cudaDeviceSynchronize(); + printf("Bad GPU Timing: %f\n", what_time_is_it_now() - then); + } + { + double then = what_time_is_it_now(); + for(zz = 0; zz < number; ++zz){ + int i; + int count = 5; + for (i = 0; i < l.softmax_tree->groups; ++i) { + int group_size = l.softmax_tree->group_size[i]; + softmax_cpu(net.input + count, group_size, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + count); + count += group_size; + } + } + cudaDeviceSynchronize(); + printf("CPU Timing: %f\n", what_time_is_it_now() - then); + } */ + /* + int i; + int count = 5; + for (i = 0; i < l.softmax_tree->groups; ++i) { + int group_size = l.softmax_tree->group_size[i]; + int index = entry_index(l, 0, 0, count); + softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); + count += group_size; + } + */ } else if (l.softmax) { int index = entry_index(l, 0, 0, l.coords + !l.background); //printf("%d\n", index); diff --git a/src/reorg_layer.c b/src/reorg_layer.c index d9f77154ce7..d7fc00104d9 100644 --- a/src/reorg_layer.c +++ b/src/reorg_layer.c @@ -1,6 +1,6 @@ -#include "darknet/reorg_layer.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" +#include "reorg_layer.h" +#include "cuda.h" +#include "blas.h" #include diff --git a/src/rnn_layer.c b/src/rnn_layer.c index 998bbacfbd0..fb4f108434e 100644 --- a/src/rnn_layer.c +++ b/src/rnn_layer.c @@ -1,9 +1,9 @@ -#include "darknet/rnn_layer.h" -#include "darknet/connected_layer.h" -#include "darknet/utils.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" -#include "darknet/gemm.h" +#include "rnn_layer.h" +#include "connected_layer.h" +#include "utils.h" +#include "cuda.h" +#include "blas.h" +#include "gemm.h" #include #include diff --git a/src/route_layer.c b/src/route_layer.c index 76f80f67aec..bce66fa43ff 100644 --- a/src/route_layer.c +++ b/src/route_layer.c @@ -1,6 +1,6 @@ -#include "darknet/route_layer.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" +#include "route_layer.h" +#include "cuda.h" +#include "blas.h" #include diff --git a/src/shortcut_layer.c b/src/shortcut_layer.c index bf60ddff695..b39ba8e83e2 100644 --- a/src/shortcut_layer.c +++ b/src/shortcut_layer.c @@ -1,6 +1,7 @@ -#include "darknet/shortcut_layer.h" -#include "darknet/cuda.h" -#include "darknet/blas.h" +#include "shortcut_layer.h" +#include "cuda.h" +#include "blas.h" +#include "activations.h" #include #include diff --git a/src/softmax_layer.c b/src/softmax_layer.c index c0853f97ed1..7f2048028b4 100644 --- a/src/softmax_layer.c +++ b/src/softmax_layer.c @@ -1,6 +1,6 @@ -#include "darknet/softmax_layer.h" -#include "darknet/blas.h" -#include "darknet/cuda.h" +#include "softmax_layer.h" +#include "blas.h" +#include "cuda.h" #include #include diff --git a/src/tree.c b/src/tree.c index 89b5a8b4130..f36ca3a1da0 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1,8 +1,8 @@ #include #include -#include "darknet/tree.h" -#include "darknet/utils.h" -#include "darknet/data.h" +#include "tree.h" +#include "utils.h" +#include "data.h" void change_leaves(tree *t, char *leaf_list) { diff --git a/src/tree.h b/src/tree.h index 2e9c81265ea..ec74057b6d7 100644 --- a/src/tree.h +++ b/src/tree.h @@ -1,18 +1,6 @@ #ifndef TREE_H #define TREE_H - -typedef struct{ - int *leaf; - int n; - int *parent; - int *child; - int *group; - char **name; - - int groups; - int *group_size; - int *group_offset; -} tree; +#include "darknet.h" tree *read_tree(char *filename); void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves, int stride); diff --git a/src/utils.c b/src/utils.c index 822fd3315ec..9c06e1a3dae 100644 --- a/src/utils.c +++ b/src/utils.c @@ -6,8 +6,16 @@ #include #include #include +#include -#include "darknet/utils.h" +#include "utils.h" + +double what_time_is_it_now() +{ + struct timespec now; + clock_gettime(CLOCK_REALTIME, &now); + return now.tv_sec + now.tv_nsec*1e-9; +} int *read_intlist(char *gpu_list, int *ngpus, int d) { @@ -608,13 +616,13 @@ float rand_normal() size_t rand_size_t() { return ((size_t)(rand()&0xff) << 56) | - ((size_t)(rand()&0xff) << 48) | - ((size_t)(rand()&0xff) << 40) | - ((size_t)(rand()&0xff) << 32) | - ((size_t)(rand()&0xff) << 24) | - ((size_t)(rand()&0xff) << 16) | - ((size_t)(rand()&0xff) << 8) | - ((size_t)(rand()&0xff) << 0); + ((size_t)(rand()&0xff) << 48) | + ((size_t)(rand()&0xff) << 40) | + ((size_t)(rand()&0xff) << 32) | + ((size_t)(rand()&0xff) << 24) | + ((size_t)(rand()&0xff) << 16) | + ((size_t)(rand()&0xff) << 8) | + ((size_t)(rand()&0xff) << 0); } float rand_uniform(float min, float max) diff --git a/src/utils.h b/src/utils.h index ab4c6959530..27206533517 100644 --- a/src/utils.h +++ b/src/utils.h @@ -7,6 +7,7 @@ #define SECRET_NUM -1234 #define TWO_PI 6.2831853071795864769252866 +double what_time_is_it_now(); int *read_intlist(char *s, int *n, int d); int *read_map(char *filename); void shuffle(void *arr, size_t n, size_t size); From 9564549857231c3ffda602fd8efea091894ff6e9 Mon Sep 17 00:00:00 2001 From: Abe Miessler Date: Sat, 3 Jun 2017 15:58:21 -0700 Subject: [PATCH 023/118] adding missing include to get pthread_t type working --- include/darknet.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/darknet.h b/include/darknet.h index 986d430935f..3f5e9b74866 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -1,6 +1,7 @@ #ifndef DARKNET_API #define DARKNET_API #include +#include extern int gpu_index; From e9f3b79776b69818b3f53b96e35aaadc63596a93 Mon Sep 17 00:00:00 2001 From: Yao Lu Date: Tue, 6 Jun 2017 16:50:19 -0700 Subject: [PATCH 024/118] Fix GRU, Add LSTM --- Makefile | 4 +- include/darknet.h | 33 ++- src/gru_layer.c | 616 ++++++++++++++++++++-------------------------- src/gru_layer.h | 8 +- src/lstm_layer.c | 365 +++++++++++++++++++++++++++ src/lstm_layer.h | 20 ++ src/network.c | 2 + src/parser.c | 65 +++-- 8 files changed, 741 insertions(+), 372 deletions(-) create mode 100644 src/lstm_layer.c create mode 100644 src/lstm_layer.h diff --git a/Makefile b/Makefile index 36a451cc19c..9ef36b8415a 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -GPU=0 +GPU=1 CUDNN=0 OPENCV=0 DEBUG=0 @@ -51,7 +51,7 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o EXECOBJA=captcha.o lsd.o super.o voxel.o art.o tag.o cifar.o go.o rnn.o rnn_vid.o compare.o segmenter.o regressor.o classifier.o coco.o dice.o yolo.o detector.o writing.o nightmare.o swag.o darknet.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ diff --git a/include/darknet.h b/include/darknet.h index 3f5e9b74866..f2ef660aedd 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -63,6 +63,7 @@ typedef enum { ACTIVE, RNN, GRU, + LSTM, CRNN, BATCHNORM, NETWORK, @@ -185,7 +186,7 @@ struct layer{ float * forgot_state; float * forgot_delta; float * state_delta; - + float * concat; float * concat_delta; @@ -251,6 +252,21 @@ struct layer{ struct layer *input_h_layer; struct layer *state_h_layer; + + struct layer *wz; + struct layer *uz; + struct layer *wr; + struct layer *ur; + struct layer *wh; + struct layer *uh; + struct layer *uo; + struct layer *wo; + struct layer *uf; + struct layer *wf; + struct layer *ui; + struct layer *wi; + struct layer *ug; + struct layer *wg; tree *softmax_tree; @@ -263,6 +279,21 @@ struct layer{ float *r_gpu; float *h_gpu; + float *temp_gpu; + float *temp2_gpu; + float *temp3_gpu; + + float *dh_gpu; + float *hh_gpu; + float *prev_cell_gpu; + float *cell_gpu; + float *f_gpu; + float *i_gpu; + float *g_gpu; + float *o_gpu; + float *c_gpu; + float *dc_gpu; + float *m_gpu; float *v_gpu; float *bias_m_gpu; diff --git a/src/gru_layer.c b/src/gru_layer.c index 7139f798f29..78964817d55 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -12,195 +12,100 @@ static void increment_layer(layer *l, int steps) { - int num = l->outputs*l->batch*steps; - l->output += num; - l->delta += num; - l->x += num; - l->x_norm += num; + int num = l->outputs*l->batch*steps; + l->output += num; + l->delta += num; + l->x += num; + l->x_norm += num; #ifdef GPU - l->output_gpu += num; - l->delta_gpu += num; - l->x_gpu += num; - l->x_norm_gpu += num; + l->output_gpu += num; + l->delta_gpu += num; + l->x_gpu += num; + l->x_norm_gpu += num; #endif } layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_normalize) { - fprintf(stderr, "GRU Layer: %d inputs, %d outputs\n", inputs, outputs); - batch = batch / steps; - layer l = {0}; - l.batch = batch; - l.type = GRU; - l.steps = steps; - l.inputs = inputs; - - l.input_z_layer = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.input_z_layer) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); - l.input_z_layer->batch = batch; - - l.state_z_layer = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.state_z_layer) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); - l.state_z_layer->batch = batch; - - - - l.input_r_layer = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.input_r_layer) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); - l.input_r_layer->batch = batch; - - l.state_r_layer = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.state_r_layer) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); - l.state_r_layer->batch = batch; - - - - l.input_h_layer = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.input_h_layer) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); - l.input_h_layer->batch = batch; - - l.state_h_layer = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.state_h_layer) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); - l.state_h_layer->batch = batch; - -#ifdef CUDNN - cudnnSetTensor4dDescriptor(l.input_z_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.input_z_layer->out_c, l.input_z_layer->out_h, l.input_z_layer->out_w); - cudnnSetTensor4dDescriptor(l.input_h_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.input_h_layer->out_c, l.input_h_layer->out_h, l.input_h_layer->out_w); - cudnnSetTensor4dDescriptor(l.input_r_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.input_r_layer->out_c, l.input_r_layer->out_h, l.input_r_layer->out_w); - cudnnSetTensor4dDescriptor(l.state_z_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.state_z_layer->out_c, l.state_z_layer->out_h, l.state_z_layer->out_w); - cudnnSetTensor4dDescriptor(l.state_h_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.state_h_layer->out_c, l.state_h_layer->out_h, l.state_h_layer->out_w); - cudnnSetTensor4dDescriptor(l.state_r_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.state_r_layer->out_c, l.state_r_layer->out_h, l.state_r_layer->out_w); -#endif - - l.batch_normalize = batch_normalize; - - - l.outputs = outputs; - l.output = calloc(outputs*batch*steps, sizeof(float)); - l.delta = calloc(outputs*batch*steps, sizeof(float)); - l.state = calloc(outputs*batch, sizeof(float)); - l.prev_state = calloc(outputs*batch, sizeof(float)); - l.forgot_state = calloc(outputs*batch, sizeof(float)); - l.forgot_delta = calloc(outputs*batch, sizeof(float)); - - l.r_cpu = calloc(outputs*batch, sizeof(float)); - l.z_cpu = calloc(outputs*batch, sizeof(float)); - l.h_cpu = calloc(outputs*batch, sizeof(float)); - - l.forward = forward_gru_layer; - l.backward = backward_gru_layer; - l.update = update_gru_layer; + fprintf(stderr, "GRU Layer: %d inputs, %d outputs\n", inputs, outputs); + batch = batch / steps; + layer l = { 0 }; + l.batch = batch; + l.type = GRU; + l.steps = steps; + l.inputs = inputs; + + l.wz = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wz) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.wz->batch = batch; + + l.uz = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.uz) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + l.uz->batch = batch; + + l.wr = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wr) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.wr->batch = batch; + + l.ur = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.ur) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + l.ur->batch = batch; + + l.wh = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wh) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.wh->batch = batch; + + l.uh = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.uh) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + l.uh->batch = batch; + + l.batch_normalize = batch_normalize; + l.outputs = outputs; + + l.output = calloc(outputs*batch*steps, sizeof(float)); + l.state = calloc(outputs*batch, sizeof(float)); + + l.forward = forward_gru_layer; + l.backward = backward_gru_layer; + l.update = update_gru_layer; #ifdef GPU - l.forward_gpu = forward_gru_layer_gpu; - l.backward_gpu = backward_gru_layer_gpu; - l.update_gpu = update_gru_layer_gpu; - - l.forgot_state_gpu = cuda_make_array(l.output, batch*outputs); - l.forgot_delta_gpu = cuda_make_array(l.output, batch*outputs); - l.prev_state_gpu = cuda_make_array(l.output, batch*outputs); - l.state_gpu = cuda_make_array(l.output, batch*outputs); - l.output_gpu = cuda_make_array(l.output, batch*outputs*steps); - l.delta_gpu = cuda_make_array(l.delta, batch*outputs*steps); - l.r_gpu = cuda_make_array(l.output_gpu, batch*outputs); - l.z_gpu = cuda_make_array(l.output_gpu, batch*outputs); - l.h_gpu = cuda_make_array(l.output_gpu, batch*outputs); + l.forward_gpu = forward_gru_layer_gpu; + l.backward_gpu = backward_gru_layer_gpu; + l.update_gpu = update_gru_layer_gpu; + + l.prev_state_gpu = cuda_make_array(0, batch*outputs); + l.output_gpu = cuda_make_array(0, batch*outputs*steps); + l.delta_gpu = cuda_make_array(0, batch*outputs*steps); + + l.r_gpu = cuda_make_array(l.output, batch*outputs); + l.z_gpu = cuda_make_array(l.output, batch*outputs); + l.hh_gpu = cuda_make_array(l.output, batch*outputs); + l.h_gpu = cuda_make_array(l.output, batch*outputs); + l.temp_gpu = cuda_make_array(l.output, batch*outputs); + l.temp2_gpu = cuda_make_array(l.output, batch*outputs); + l.temp3_gpu = cuda_make_array(l.output, batch*outputs); + l.dh_gpu = cuda_make_array(l.output, batch*outputs); #endif - - return l; + return l; } void update_gru_layer(layer l, int batch, float learning_rate, float momentum, float decay) { - update_connected_layer(*(l.input_layer), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.self_layer), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.output_layer), batch, learning_rate, momentum, decay); } -void forward_gru_layer(layer l, network net) +void forward_gru_layer(layer l, network state) { - network s = net; - s.train = net.train; - int i; - layer input_z_layer = *(l.input_z_layer); - layer input_r_layer = *(l.input_r_layer); - layer input_h_layer = *(l.input_h_layer); - - layer state_z_layer = *(l.state_z_layer); - layer state_r_layer = *(l.state_r_layer); - layer state_h_layer = *(l.state_h_layer); - - fill_cpu(l.outputs * l.batch * l.steps, 0, input_z_layer.delta, 1); - fill_cpu(l.outputs * l.batch * l.steps, 0, input_r_layer.delta, 1); - fill_cpu(l.outputs * l.batch * l.steps, 0, input_h_layer.delta, 1); - - fill_cpu(l.outputs * l.batch * l.steps, 0, state_z_layer.delta, 1); - fill_cpu(l.outputs * l.batch * l.steps, 0, state_r_layer.delta, 1); - fill_cpu(l.outputs * l.batch * l.steps, 0, state_h_layer.delta, 1); - if(net.train) { - fill_cpu(l.outputs * l.batch * l.steps, 0, l.delta, 1); - copy_cpu(l.outputs*l.batch, l.state, 1, l.prev_state, 1); - } - - for (i = 0; i < l.steps; ++i) { - s.input = l.state; - forward_connected_layer(state_z_layer, s); - forward_connected_layer(state_r_layer, s); - - s.input = net.input; - forward_connected_layer(input_z_layer, s); - forward_connected_layer(input_r_layer, s); - forward_connected_layer(input_h_layer, s); - - - copy_cpu(l.outputs*l.batch, input_z_layer.output, 1, l.z_cpu, 1); - axpy_cpu(l.outputs*l.batch, 1, state_z_layer.output, 1, l.z_cpu, 1); - - copy_cpu(l.outputs*l.batch, input_r_layer.output, 1, l.r_cpu, 1); - axpy_cpu(l.outputs*l.batch, 1, state_r_layer.output, 1, l.r_cpu, 1); - - activate_array(l.z_cpu, l.outputs*l.batch, LOGISTIC); - activate_array(l.r_cpu, l.outputs*l.batch, LOGISTIC); - - copy_cpu(l.outputs*l.batch, l.state, 1, l.forgot_state, 1); - mul_cpu(l.outputs*l.batch, l.r_cpu, 1, l.forgot_state, 1); - - s.input = l.forgot_state; - forward_connected_layer(state_h_layer, s); - - copy_cpu(l.outputs*l.batch, input_h_layer.output, 1, l.h_cpu, 1); - axpy_cpu(l.outputs*l.batch, 1, state_h_layer.output, 1, l.h_cpu, 1); - - #ifdef USET - activate_array(l.h_cpu, l.outputs*l.batch, TANH); - #else - activate_array(l.h_cpu, l.outputs*l.batch, LOGISTIC); - #endif - - weighted_sum_cpu(l.state, l.h_cpu, l.z_cpu, l.outputs*l.batch, l.output); - - copy_cpu(l.outputs*l.batch, l.output, 1, l.state, 1); - - net.input += l.inputs*l.batch; - l.output += l.outputs*l.batch; - increment_layer(&input_z_layer, 1); - increment_layer(&input_r_layer, 1); - increment_layer(&input_h_layer, 1); - - increment_layer(&state_z_layer, 1); - increment_layer(&state_r_layer, 1); - increment_layer(&state_h_layer, 1); - } } -void backward_gru_layer(layer l, network net) +void backward_gru_layer(layer l, network state) { } @@ -216,189 +121,202 @@ void push_gru_layer(layer l) void update_gru_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) { - update_connected_layer_gpu(*(l.input_r_layer), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.input_z_layer), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.input_h_layer), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.state_r_layer), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.state_z_layer), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.state_h_layer), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wr), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wz), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wh), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.ur), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.uz), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.uh), batch, learning_rate, momentum, decay); } -void forward_gru_layer_gpu(layer l, network net) +void forward_gru_layer_gpu(layer l, network state) { - network s = net; - s.train = net.train; - int i; - layer input_z_layer = *(l.input_z_layer); - layer input_r_layer = *(l.input_r_layer); - layer input_h_layer = *(l.input_h_layer); - - layer state_z_layer = *(l.state_z_layer); - layer state_r_layer = *(l.state_r_layer); - layer state_h_layer = *(l.state_h_layer); - - fill_ongpu(l.outputs * l.batch * l.steps, 0, input_z_layer.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, input_r_layer.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, input_h_layer.delta_gpu, 1); - - fill_ongpu(l.outputs * l.batch * l.steps, 0, state_z_layer.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, state_r_layer.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, state_h_layer.delta_gpu, 1); - if(net.train) { - fill_ongpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.state_gpu, 1, l.prev_state_gpu, 1); - } - - for (i = 0; i < l.steps; ++i) { - s.input_gpu = l.state_gpu; - forward_connected_layer_gpu(state_z_layer, s); - forward_connected_layer_gpu(state_r_layer, s); - - s.input_gpu = net.input_gpu; - forward_connected_layer_gpu(input_z_layer, s); - forward_connected_layer_gpu(input_r_layer, s); - forward_connected_layer_gpu(input_h_layer, s); - - - copy_ongpu(l.outputs*l.batch, input_z_layer.output_gpu, 1, l.z_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, state_z_layer.output_gpu, 1, l.z_gpu, 1); - - copy_ongpu(l.outputs*l.batch, input_r_layer.output_gpu, 1, l.r_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, state_r_layer.output_gpu, 1, l.r_gpu, 1); - - activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); - - copy_ongpu(l.outputs*l.batch, l.state_gpu, 1, l.forgot_state_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.forgot_state_gpu, 1); - - s.input_gpu = l.forgot_state_gpu; - forward_connected_layer_gpu(state_h_layer, s); - - copy_ongpu(l.outputs*l.batch, input_h_layer.output_gpu, 1, l.h_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, state_h_layer.output_gpu, 1, l.h_gpu, 1); - - #ifdef USET - activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); - #else - activate_array_ongpu(l.h_gpu, l.outputs*l.batch, LOGISTIC); - #endif - - weighted_sum_gpu(l.state_gpu, l.h_gpu, l.z_gpu, l.outputs*l.batch, l.output_gpu); - - copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.state_gpu, 1); - - net.input_gpu += l.inputs*l.batch; - l.output_gpu += l.outputs*l.batch; - increment_layer(&input_z_layer, 1); - increment_layer(&input_r_layer, 1); - increment_layer(&input_h_layer, 1); - - increment_layer(&state_z_layer, 1); - increment_layer(&state_r_layer, 1); - increment_layer(&state_h_layer, 1); - } + network s = { 0 }; + s.train = state.train; + int i; + layer wz = *(l.wz); + layer wr = *(l.wr); + layer wh = *(l.wh); + + layer uz = *(l.uz); + layer ur = *(l.ur); + layer uh = *(l.uh); + + fill_ongpu(l.outputs * l.batch * l.steps, 0, wz.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, wr.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, wh.delta_gpu, 1); + + fill_ongpu(l.outputs * l.batch * l.steps, 0, uz.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, ur.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, uh.delta_gpu, 1); + + if (state.train) { + fill_ongpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); + } + + for (i = 0; i < l.steps; ++i) { + s.input = l.h_gpu; + forward_connected_layer_gpu(uz, s); + forward_connected_layer_gpu(ur, s); + + s.input = state.input; + forward_connected_layer_gpu(wz, s); + forward_connected_layer_gpu(wr, s); + forward_connected_layer_gpu(wh, s); + + copy_ongpu(l.outputs*l.batch, wz.output_gpu, 1, l.z_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uz.output_gpu, 1, l.z_gpu, 1); + + copy_ongpu(l.outputs*l.batch, wr.output_gpu, 1, l.r_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ur.output_gpu, 1, l.r_gpu, 1); + + activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); + + copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.hh_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.hh_gpu, 1); + + s.input = l.hh_gpu; + forward_connected_layer_gpu(uh, s); + + copy_ongpu(l.outputs*l.batch, wh.output_gpu, 1, l.hh_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uh.output_gpu, 1, l.hh_gpu, 1); + + activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); + + weighted_sum_gpu(l.h_gpu, l.hh_gpu, l.z_gpu, l.outputs*l.batch, l.output_gpu); + //ht = z .* ht-1 + (1-z) .* hh + copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.h_gpu, 1); + + state.input += l.inputs*l.batch; + l.output_gpu += l.outputs*l.batch; + + increment_layer(&wz, 1); + increment_layer(&wr, 1); + increment_layer(&wh, 1); + + increment_layer(&uz, 1); + increment_layer(&ur, 1); + increment_layer(&uh, 1); + } } -void backward_gru_layer_gpu(layer l, network net) +void backward_gru_layer_gpu(layer l, network state) { - network s = net; - s.train = net.train; - int i; - layer input_z_layer = *(l.input_z_layer); - layer input_r_layer = *(l.input_r_layer); - layer input_h_layer = *(l.input_h_layer); - - layer state_z_layer = *(l.state_z_layer); - layer state_r_layer = *(l.state_r_layer); - layer state_h_layer = *(l.state_h_layer); - - increment_layer(&input_z_layer, l.steps - 1); - increment_layer(&input_r_layer, l.steps - 1); - increment_layer(&input_h_layer, l.steps - 1); - - increment_layer(&state_z_layer, l.steps - 1); - increment_layer(&state_r_layer, l.steps - 1); - increment_layer(&state_h_layer, l.steps - 1); - - net.input_gpu += l.inputs*l.batch*(l.steps-1); - if(net.delta_gpu) net.delta_gpu += l.inputs*l.batch*(l.steps-1); - l.output_gpu += l.outputs*l.batch*(l.steps-1); - l.delta_gpu += l.outputs*l.batch*(l.steps-1); - for (i = l.steps-1; i >= 0; --i) { - if(i != 0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); - float *prev_delta_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; - - copy_ongpu(l.outputs*l.batch, input_z_layer.output_gpu, 1, l.z_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, state_z_layer.output_gpu, 1, l.z_gpu, 1); - - copy_ongpu(l.outputs*l.batch, input_r_layer.output_gpu, 1, l.r_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, state_r_layer.output_gpu, 1, l.r_gpu, 1); - - activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); - - copy_ongpu(l.outputs*l.batch, input_h_layer.output_gpu, 1, l.h_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, state_h_layer.output_gpu, 1, l.h_gpu, 1); - - #ifdef USET - activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); - #else - activate_array_ongpu(l.h_gpu, l.outputs*l.batch, LOGISTIC); - #endif - - weighted_delta_gpu(l.prev_state_gpu, l.h_gpu, l.z_gpu, prev_delta_gpu, input_h_layer.delta_gpu, input_z_layer.delta_gpu, l.outputs*l.batch, l.delta_gpu); - - #ifdef USET - gradient_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH, input_h_layer.delta_gpu); - #else - gradient_array_ongpu(l.h_gpu, l.outputs*l.batch, LOGISTIC, input_h_layer.delta_gpu); - #endif - - copy_ongpu(l.outputs*l.batch, input_h_layer.delta_gpu, 1, state_h_layer.delta_gpu, 1); - - copy_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.forgot_state_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.forgot_state_gpu, 1); - fill_ongpu(l.outputs*l.batch, 0, l.forgot_delta_gpu, 1); - - s.input_gpu = l.forgot_state_gpu; - s.delta_gpu = l.forgot_delta_gpu; - - backward_connected_layer_gpu(state_h_layer, s); - if(prev_delta_gpu) mult_add_into_gpu(l.outputs*l.batch, l.forgot_delta_gpu, l.r_gpu, prev_delta_gpu); - mult_add_into_gpu(l.outputs*l.batch, l.forgot_delta_gpu, l.prev_state_gpu, input_r_layer.delta_gpu); - - gradient_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC, input_r_layer.delta_gpu); - copy_ongpu(l.outputs*l.batch, input_r_layer.delta_gpu, 1, state_r_layer.delta_gpu, 1); - - gradient_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, input_z_layer.delta_gpu); - copy_ongpu(l.outputs*l.batch, input_z_layer.delta_gpu, 1, state_z_layer.delta_gpu, 1); - - s.input_gpu = l.prev_state_gpu; - s.delta_gpu = prev_delta_gpu; - - backward_connected_layer_gpu(state_r_layer, s); - backward_connected_layer_gpu(state_z_layer, s); - - s.input_gpu = net.input_gpu; - s.delta_gpu = net.delta_gpu; - - backward_connected_layer_gpu(input_h_layer, s); - backward_connected_layer_gpu(input_r_layer, s); - backward_connected_layer_gpu(input_z_layer, s); - - - net.input_gpu -= l.inputs*l.batch; - if(net.delta_gpu) net.delta_gpu -= l.inputs*l.batch; - l.output_gpu -= l.outputs*l.batch; - l.delta_gpu -= l.outputs*l.batch; - increment_layer(&input_z_layer, -1); - increment_layer(&input_r_layer, -1); - increment_layer(&input_h_layer, -1); - - increment_layer(&state_z_layer, -1); - increment_layer(&state_r_layer, -1); - increment_layer(&state_h_layer, -1); - } + network s = { 0 }; + s.train = state.train; + int i; + layer wz = *(l.wz); + layer wr = *(l.wr); + layer wh = *(l.wh); + + layer uz = *(l.uz); + layer ur = *(l.ur); + layer uh = *(l.uh); + + increment_layer(&wz, l.steps - 1); + increment_layer(&wr, l.steps - 1); + increment_layer(&wh, l.steps - 1); + + increment_layer(&uz, l.steps - 1); + increment_layer(&ur, l.steps - 1); + increment_layer(&uh, l.steps - 1); + + state.input += l.inputs*l.batch*(l.steps - 1); + if (state.delta) state.delta += l.inputs*l.batch*(l.steps - 1); + + l.output_gpu += l.outputs*l.batch*(l.steps - 1); + l.delta_gpu += l.outputs*l.batch*(l.steps - 1); + + for (i = l.steps - 1; i >= 0; --i) { + if (i>0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); + l.dh_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; + + copy_ongpu(l.outputs*l.batch, wz.output_gpu, 1, l.z_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uz.output_gpu, 1, l.z_gpu, 1); + + copy_ongpu(l.outputs*l.batch, wr.output_gpu, 1, l.r_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ur.output_gpu, 1, l.r_gpu, 1); + + activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); + + copy_ongpu(l.outputs*l.batch, wh.output_gpu, 1, l.hh_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uh.output_gpu, 1, l.hh_gpu, 1); + + activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); + + copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); + + fill_ongpu(l.outputs*l.batch, 1, l.temp_gpu, 1); + axpy_ongpu(l.outputs*l.batch, -1, l.z_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH, l.temp_gpu); + + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wh.delta_gpu, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer_gpu(wh, s); + + copy_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.temp2_gpu, 1); + + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uh.delta_gpu, 1); + fill_ongpu(l.outputs*l.batch, 0, l.temp_gpu, 1); + s.input = l.temp2_gpu; + s.delta = l.temp_gpu; + backward_connected_layer_gpu(uh, s); + + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp2_gpu, 1); + gradient_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC, l.temp2_gpu); + + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, wr.delta_gpu, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer_gpu(wr, s); + + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, ur.delta_gpu, 1); + s.input = l.prev_state_gpu; + s.delta = l.dh_gpu; + backward_connected_layer_gpu(ur, s); + + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.temp2_gpu, 1); + if (l.dh_gpu) axpy_ongpu(l.outputs*l.batch, 1, l.temp2_gpu, 1, l.dh_gpu, 1); + + copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.z_gpu, 1, l.temp2_gpu, 1); + if (l.dh_gpu) axpy_ongpu(l.outputs*l.batch, 1, l.temp2_gpu, 1, l.dh_gpu, 1); + + copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp3_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.hh_gpu, 1, l.temp2_gpu, 1); + axpy_ongpu(l.outputs*l.batch, -1, l.temp2_gpu, 1, l.temp3_gpu, 1); + gradient_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, l.temp3_gpu); + + copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, wz.delta_gpu, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer_gpu(wz, s); + + copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, uz.delta_gpu, 1); + s.input = l.prev_state_gpu; + s.delta = l.dh_gpu; + backward_connected_layer_gpu(uz, s); + + state.input -= l.inputs*l.batch; + if (state.delta) state.delta -= l.inputs*l.batch; + l.output_gpu -= l.outputs*l.batch; + l.delta_gpu -= l.outputs*l.batch; + + increment_layer(&wz, -1); + increment_layer(&wr, -1); + increment_layer(&wh, -1); + + increment_layer(&uz, -1); + increment_layer(&ur, -1); + increment_layer(&uh, -1); + } } -#endif +#endif \ No newline at end of file diff --git a/src/gru_layer.h b/src/gru_layer.h index 9dc456e08f6..a0e57171587 100644 --- a/src/gru_layer.h +++ b/src/gru_layer.h @@ -8,13 +8,13 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_normalize); -void forward_gru_layer(layer l, network net); -void backward_gru_layer(layer l, network net); +void forward_gru_layer(layer l, network state); +void backward_gru_layer(layer l, network state); void update_gru_layer(layer l, int batch, float learning_rate, float momentum, float decay); #ifdef GPU -void forward_gru_layer_gpu(layer l, network net); -void backward_gru_layer_gpu(layer l, network net); +void forward_gru_layer_gpu(layer l, network state); +void backward_gru_layer_gpu(layer l, network state); void update_gru_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); void push_gru_layer(layer l); void pull_gru_layer(layer l); diff --git a/src/lstm_layer.c b/src/lstm_layer.c new file mode 100644 index 00000000000..d806cb50262 --- /dev/null +++ b/src/lstm_layer.c @@ -0,0 +1,365 @@ +#include "lstm_layer.h" +#include "connected_layer.h" +#include "utils.h" +#include "cuda.h" +#include "blas.h" +#include "gemm.h" + +#include +#include +#include +#include + +static void increment_layer(layer *l, int steps) +{ + int num = l->outputs*l->batch*steps; + l->output += num; + l->delta += num; + l->x += num; + l->x_norm += num; + +#ifdef GPU + l->output_gpu += num; + l->delta_gpu += num; + l->x_gpu += num; + l->x_norm_gpu += num; +#endif +} + +layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_normalize) +{ + fprintf(stderr, "LSTM Layer: %d inputs, %d outputs\n", inputs, outputs); + batch = batch / steps; + layer l = { 0 }; + l.batch = batch; + l.type = LSTM; + l.steps = steps; + l.inputs = inputs; + + l.uf = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.uf) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.uf->batch = batch; + + l.wf = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wf) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + l.wf->batch = batch; + + l.ui = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.ui) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.ui->batch = batch; + + l.wi = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wi) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + l.wi->batch = batch; + + l.ug = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.ug) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.ug->batch = batch; + + l.wg = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wg) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + l.wg->batch = batch; + + l.uo = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.uo) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.uo->batch = batch; + + l.wo = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wo) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + l.wo->batch = batch; + + l.batch_normalize = batch_normalize; + l.outputs = outputs; + + l.output = calloc(outputs*batch*steps, sizeof(float)); + l.state = calloc(outputs*batch, sizeof(float)); + + l.forward = forward_lstm_layer; + l.update = update_lstm_layer; + +#ifdef GPU + l.forward_gpu = forward_lstm_layer_gpu; + l.backward_gpu = backward_lstm_layer_gpu; + l.update_gpu = update_lstm_layer_gpu; + + l.prev_state_gpu = cuda_make_array(0, batch*outputs); + l.prev_cell_gpu = cuda_make_array(0, batch*outputs); + + l.output_gpu = cuda_make_array(0, batch*outputs*steps); + l.cell_gpu = cuda_make_array(0, batch*outputs*steps); + l.delta_gpu = cuda_make_array(0, batch*l.outputs*steps); + + l.f_gpu = cuda_make_array(l.output, batch*outputs); + l.i_gpu = cuda_make_array(l.output, batch*outputs); + l.g_gpu = cuda_make_array(l.output, batch*outputs); + l.o_gpu = cuda_make_array(l.output, batch*outputs); + l.c_gpu = cuda_make_array(l.output, batch*outputs); + l.h_gpu = cuda_make_array(l.output, batch*outputs); + l.temp_gpu = cuda_make_array(l.output, batch*outputs); + l.temp2_gpu = cuda_make_array(l.output, batch*outputs); + l.temp3_gpu = cuda_make_array(l.output, batch*outputs); + l.dc_gpu = cuda_make_array(l.output, batch*outputs); + l.dh_gpu = cuda_make_array(l.output, batch*outputs); +#endif + + return l; +} + +void update_lstm_layer(layer l, int batch, float learning_rate, float momentum, float decay) +{ +} + +void forward_lstm_layer(layer l, network state) +{ +} + +#ifdef GPU +void update_lstm_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) +{ + update_connected_layer_gpu(*(l.wf), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wi), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wg), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wo), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.uf), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.ui), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.ug), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.uo), batch, learning_rate, momentum, decay); +} + +void forward_lstm_layer_gpu(layer l, network state) +{ + network s = { 0 }; + s.train = state.train; + int i; + layer wf = *(l.wf); + layer wi = *(l.wi); + layer wg = *(l.wg); + layer wo = *(l.wo); + + layer uf = *(l.uf); + layer ui = *(l.ui); + layer ug = *(l.ug); + layer uo = *(l.uo); + + fill_ongpu(l.outputs * l.batch * l.steps, 0, wf.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, wi.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, wg.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, wo.delta_gpu, 1); + + fill_ongpu(l.outputs * l.batch * l.steps, 0, uf.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, ui.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, ug.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, uo.delta_gpu, 1); + if (state.train) { + fill_ongpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); + } + + for (i = 0; i < l.steps; ++i) { + s.input = l.h_gpu; + forward_connected_layer_gpu(wf, s); + forward_connected_layer_gpu(wi, s); + forward_connected_layer_gpu(wg, s); + forward_connected_layer_gpu(wo, s); + + s.input = state.input; + forward_connected_layer_gpu(uf, s); + forward_connected_layer_gpu(ui, s); + forward_connected_layer_gpu(ug, s); + forward_connected_layer_gpu(uo, s); + + copy_ongpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); + + copy_ongpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); + + copy_ongpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); + + copy_ongpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); + + activate_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH); + activate_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); + + copy_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.c_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, l.temp_gpu, 1, l.c_gpu, 1); + + copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.h_gpu, 1); + activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); + mul_ongpu(l.outputs*l.batch, l.o_gpu, 1, l.h_gpu, 1); + + copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.cell_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.output_gpu, 1); + + state.input += l.inputs*l.batch; + l.output_gpu += l.outputs*l.batch; + l.cell_gpu += l.outputs*l.batch; + + increment_layer(&wf, 1); + increment_layer(&wi, 1); + increment_layer(&wg, 1); + increment_layer(&wo, 1); + + increment_layer(&uf, 1); + increment_layer(&ui, 1); + increment_layer(&ug, 1); + increment_layer(&uo, 1); + } +} + +void backward_lstm_layer_gpu(layer l, network state) +{ + network s = { 0 }; + s.train = state.train; + int i; + layer wf = *(l.wf); + layer wi = *(l.wi); + layer wg = *(l.wg); + layer wo = *(l.wo); + + layer uf = *(l.uf); + layer ui = *(l.ui); + layer ug = *(l.ug); + layer uo = *(l.uo); + + increment_layer(&wf, l.steps - 1); + increment_layer(&wi, l.steps - 1); + increment_layer(&wg, l.steps - 1); + increment_layer(&wo, l.steps - 1); + + increment_layer(&uf, l.steps - 1); + increment_layer(&ui, l.steps - 1); + increment_layer(&ug, l.steps - 1); + increment_layer(&uo, l.steps - 1); + + state.input += l.inputs*l.batch*(l.steps - 1); + if (state.delta) state.delta += l.inputs*l.batch*(l.steps - 1); + + l.output_gpu += l.outputs*l.batch*(l.steps - 1); + l.cell_gpu += l.outputs*l.batch*(l.steps - 1); + l.delta_gpu += l.outputs*l.batch*(l.steps - 1); + + for (i = l.steps - 1; i >= 0; --i) { + if (i != 0) copy_ongpu(l.outputs*l.batch, l.cell_gpu - l.outputs*l.batch, 1, l.prev_cell_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.cell_gpu, 1, l.c_gpu, 1); + if (i != 0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.h_gpu, 1); + + l.dh_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; + + copy_ongpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); + + copy_ongpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); + + copy_ongpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); + + copy_ongpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); + + activate_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH); + activate_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); + + copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); + + copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); + activate_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH); + + copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.o_gpu, 1, l.temp2_gpu, 1); + + gradient_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH, l.temp2_gpu); + axpy_ongpu(l.outputs*l.batch, 1, l.dc_gpu, 1, l.temp2_gpu, 1); + + copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); + activate_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH); + mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wo.delta_gpu, 1); + s.input = l.prev_state_gpu; + s.delta = l.dh_gpu; + backward_connected_layer_gpu(wo, s); + + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uo.delta_gpu, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer_gpu(uo, s); + + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH, l.temp_gpu); + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wg.delta_gpu, 1); + s.input = l.prev_state_gpu; + s.delta = l.dh_gpu; + backward_connected_layer_gpu(wg, s); + + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, ug.delta_gpu, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer_gpu(ug, s); + + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wi.delta_gpu, 1); + s.input = l.prev_state_gpu; + s.delta = l.dh_gpu; + backward_connected_layer_gpu(wi, s); + + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, ui.delta_gpu, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer_gpu(ui, s); + + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.prev_cell_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wf.delta_gpu, 1); + s.input = l.prev_state_gpu; + s.delta = l.dh_gpu; + backward_connected_layer_gpu(wf, s); + + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uf.delta_gpu, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer_gpu(uf, s); + + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.temp_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.dc_gpu, 1); + + state.input -= l.inputs*l.batch; + if (state.delta) state.delta -= l.inputs*l.batch; + l.output_gpu -= l.outputs*l.batch; + l.cell_gpu -= l.outputs*l.batch; + l.delta_gpu -= l.outputs*l.batch; + + increment_layer(&wf, -1); + increment_layer(&wi, -1); + increment_layer(&wg, -1); + increment_layer(&wo, -1); + + increment_layer(&uf, -1); + increment_layer(&ui, -1); + increment_layer(&ug, -1); + increment_layer(&uo, -1); + } +} +#endif \ No newline at end of file diff --git a/src/lstm_layer.h b/src/lstm_layer.h new file mode 100644 index 00000000000..a9ed792de28 --- /dev/null +++ b/src/lstm_layer.h @@ -0,0 +1,20 @@ +#ifndef LSTM_LAYER_H +#define LSTM_LAYER_H + +#include "activations.h" +#include "layer.h" +#include "network.h" +#define USET + +layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_normalize); + +void forward_lstm_layer(layer l, network state); +void update_lstm_layer(layer l, int batch, float learning, float momentum, float decay); + +#ifdef GPU +void forward_lstm_layer_gpu(layer l, network state); +void backward_lstm_layer_gpu(layer l, network state); +void update_lstm_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); + +#endif +#endif diff --git a/src/network.c b/src/network.c index 2b21338dca9..b44e3a8b96e 100644 --- a/src/network.c +++ b/src/network.c @@ -125,6 +125,8 @@ char *get_layer_string(LAYER_TYPE a) return "rnn"; case GRU: return "gru"; + case LSTM: + return "lstm"; case CRNN: return "crnn"; case MAXPOOL: diff --git a/src/parser.c b/src/parser.c index b31e1cd052a..499be075d59 100644 --- a/src/parser.c +++ b/src/parser.c @@ -29,6 +29,7 @@ #include "route_layer.h" #include "shortcut_layer.h" #include "softmax_layer.h" +#include "lstm_layer.h" #include "utils.h" typedef struct{ @@ -56,6 +57,7 @@ LAYER_TYPE string_to_layer_type(char * type) || strcmp(type, "[network]")==0) return NETWORK; if (strcmp(type, "[crnn]")==0) return CRNN; if (strcmp(type, "[gru]")==0) return GRU; + if (strcmp(type, "[lstm]") == 0) return LSTM; if (strcmp(type, "[rnn]")==0) return RNN; if (strcmp(type, "[conn]")==0 || strcmp(type, "[connected]")==0) return CONNECTED; @@ -239,6 +241,16 @@ layer parse_gru(list *options, size_params params) return l; } +layer parse_lstm(list *options, size_params params) +{ + int output = option_find_int(options, "output", 1); + int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); + + layer l = make_lstm_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize); + + return l; +} + connected_layer parse_connected(list *options, size_params params) { int output = option_find_int(options, "output",1); @@ -666,6 +678,8 @@ network parse_network_cfg(char *filename) l = parse_rnn(options, params); }else if(lt == GRU){ l = parse_gru(options, params); + }else if (lt == LSTM) { + l = parse_lstm(options, params); }else if(lt == CRNN){ l = parse_crnn(options, params); }else if(lt == CONNECTED){ @@ -906,14 +920,23 @@ void save_weights_upto(network net, char *filename, int cutoff) save_connected_weights(*(l.input_layer), fp); save_connected_weights(*(l.self_layer), fp); save_connected_weights(*(l.output_layer), fp); - } if(l.type == GRU){ - save_connected_weights(*(l.input_z_layer), fp); - save_connected_weights(*(l.input_r_layer), fp); - save_connected_weights(*(l.input_h_layer), fp); - save_connected_weights(*(l.state_z_layer), fp); - save_connected_weights(*(l.state_r_layer), fp); - save_connected_weights(*(l.state_h_layer), fp); - } if(l.type == CRNN){ + } if (l.type == LSTM) { + save_connected_weights(*(l.wi), fp); + save_connected_weights(*(l.wf), fp); + save_connected_weights(*(l.wo), fp); + save_connected_weights(*(l.wg), fp); + save_connected_weights(*(l.ui), fp); + save_connected_weights(*(l.uf), fp); + save_connected_weights(*(l.uo), fp); + save_connected_weights(*(l.ug), fp); + } if (l.type == GRU) { + save_connected_weights(*(l.wz), fp); + save_connected_weights(*(l.wr), fp); + save_connected_weights(*(l.wh), fp); + save_connected_weights(*(l.uz), fp); + save_connected_weights(*(l.ur), fp); + save_connected_weights(*(l.uh), fp); + } if(l.type == CRNN){ save_convolutional_weights(*(l.input_layer), fp); save_convolutional_weights(*(l.self_layer), fp); save_convolutional_weights(*(l.output_layer), fp); @@ -1105,14 +1128,24 @@ void load_weights_upto(network *net, char *filename, int start, int cutoff) load_connected_weights(*(l.self_layer), fp, transpose); load_connected_weights(*(l.output_layer), fp, transpose); } - if(l.type == GRU){ - load_connected_weights(*(l.input_z_layer), fp, transpose); - load_connected_weights(*(l.input_r_layer), fp, transpose); - load_connected_weights(*(l.input_h_layer), fp, transpose); - load_connected_weights(*(l.state_z_layer), fp, transpose); - load_connected_weights(*(l.state_r_layer), fp, transpose); - load_connected_weights(*(l.state_h_layer), fp, transpose); - } + if (l.type == LSTM) { + load_connected_weights(*(l.wi), fp, transpose); + load_connected_weights(*(l.wf), fp, transpose); + load_connected_weights(*(l.wo), fp, transpose); + load_connected_weights(*(l.wg), fp, transpose); + load_connected_weights(*(l.ui), fp, transpose); + load_connected_weights(*(l.uf), fp, transpose); + load_connected_weights(*(l.uo), fp, transpose); + load_connected_weights(*(l.ug), fp, transpose); + } + if (l.type == GRU) { + load_connected_weights(*(l.wz), fp, transpose); + load_connected_weights(*(l.wr), fp, transpose); + load_connected_weights(*(l.wh), fp, transpose); + load_connected_weights(*(l.uz), fp, transpose); + load_connected_weights(*(l.ur), fp, transpose); + load_connected_weights(*(l.uh), fp, transpose); + } if(l.type == LOCAL){ int locations = l.out_w*l.out_h; int size = l.size*l.size*l.c*l.n*locations; From 604a7606372714647ee46b0fc89091073b0cc7c2 Mon Sep 17 00:00:00 2001 From: Yao Lu Date: Tue, 6 Jun 2017 17:16:13 -0700 Subject: [PATCH 025/118] fix GRU, add LSTM --- Makefile | 2 +- include/darknet.h | 59 ++++++++++++++++++------------------- src/gru_layer.c | 1 - src/lstm_layer.h | 6 ++-- src/parser.c | 74 +++++++++++++++++++++++------------------------ 5 files changed, 71 insertions(+), 71 deletions(-) diff --git a/Makefile b/Makefile index 9ef36b8415a..d4a78aad5c5 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -GPU=1 +GPU=0 CUDNN=0 OPENCV=0 DEBUG=0 diff --git a/include/darknet.h b/include/darknet.h index f2ef660aedd..06d426cb60d 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -63,7 +63,7 @@ typedef enum { ACTIVE, RNN, GRU, - LSTM, + LSTM, CRNN, BATCHNORM, NETWORK, @@ -253,20 +253,20 @@ struct layer{ struct layer *input_h_layer; struct layer *state_h_layer; - struct layer *wz; - struct layer *uz; - struct layer *wr; - struct layer *ur; - struct layer *wh; - struct layer *uh; - struct layer *uo; - struct layer *wo; - struct layer *uf; - struct layer *wf; - struct layer *ui; - struct layer *wi; - struct layer *ug; - struct layer *wg; + struct layer *wz; + struct layer *uz; + struct layer *wr; + struct layer *ur; + struct layer *wh; + struct layer *uh; + struct layer *uo; + struct layer *wo; + struct layer *uf; + struct layer *wf; + struct layer *ui; + struct layer *wi; + struct layer *ug; + struct layer *wg; tree *softmax_tree; @@ -279,20 +279,20 @@ struct layer{ float *r_gpu; float *h_gpu; - float *temp_gpu; - float *temp2_gpu; - float *temp3_gpu; - - float *dh_gpu; - float *hh_gpu; - float *prev_cell_gpu; - float *cell_gpu; - float *f_gpu; - float *i_gpu; - float *g_gpu; - float *o_gpu; - float *c_gpu; - float *dc_gpu; + float *temp_gpu; + float *temp2_gpu; + float *temp3_gpu; + + float *dh_gpu; + float *hh_gpu; + float *prev_cell_gpu; + float *cell_gpu; + float *f_gpu; + float *i_gpu; + float *g_gpu; + float *o_gpu; + float *c_gpu; + float *dc_gpu; float *m_gpu; float *v_gpu; @@ -546,6 +546,7 @@ list *read_cfg(char *filename); #include "dropout_layer.h" #include "gemm.h" #include "gru_layer.h" +#include "lstm_layer.h" #include "im2col.h" #include "image.h" #include "layer.h" diff --git a/src/gru_layer.c b/src/gru_layer.c index 78964817d55..917c36f9fd3 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -185,7 +185,6 @@ void forward_gru_layer_gpu(layer l, network state) activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); weighted_sum_gpu(l.h_gpu, l.hh_gpu, l.z_gpu, l.outputs*l.batch, l.output_gpu); - //ht = z .* ht-1 + (1-z) .* hh copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.h_gpu, 1); state.input += l.inputs*l.batch; diff --git a/src/lstm_layer.h b/src/lstm_layer.h index a9ed792de28..8ed387af7ec 100644 --- a/src/lstm_layer.h +++ b/src/lstm_layer.h @@ -8,12 +8,12 @@ layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_normalize); -void forward_lstm_layer(layer l, network state); +void forward_lstm_layer(layer l, network net); void update_lstm_layer(layer l, int batch, float learning, float momentum, float decay); #ifdef GPU -void forward_lstm_layer_gpu(layer l, network state); -void backward_lstm_layer_gpu(layer l, network state); +void forward_lstm_layer_gpu(layer l, network net); +void backward_lstm_layer_gpu(layer l, network net); void update_lstm_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); #endif diff --git a/src/parser.c b/src/parser.c index 499be075d59..16012212822 100644 --- a/src/parser.c +++ b/src/parser.c @@ -57,7 +57,7 @@ LAYER_TYPE string_to_layer_type(char * type) || strcmp(type, "[network]")==0) return NETWORK; if (strcmp(type, "[crnn]")==0) return CRNN; if (strcmp(type, "[gru]")==0) return GRU; - if (strcmp(type, "[lstm]") == 0) return LSTM; + if (strcmp(type, "[lstm]") == 0) return LSTM; if (strcmp(type, "[rnn]")==0) return RNN; if (strcmp(type, "[conn]")==0 || strcmp(type, "[connected]")==0) return CONNECTED; @@ -678,8 +678,8 @@ network parse_network_cfg(char *filename) l = parse_rnn(options, params); }else if(lt == GRU){ l = parse_gru(options, params); - }else if (lt == LSTM) { - l = parse_lstm(options, params); + }else if (lt == LSTM) { + l = parse_lstm(options, params); }else if(lt == CRNN){ l = parse_crnn(options, params); }else if(lt == CONNECTED){ @@ -921,22 +921,22 @@ void save_weights_upto(network net, char *filename, int cutoff) save_connected_weights(*(l.self_layer), fp); save_connected_weights(*(l.output_layer), fp); } if (l.type == LSTM) { - save_connected_weights(*(l.wi), fp); - save_connected_weights(*(l.wf), fp); - save_connected_weights(*(l.wo), fp); - save_connected_weights(*(l.wg), fp); - save_connected_weights(*(l.ui), fp); - save_connected_weights(*(l.uf), fp); - save_connected_weights(*(l.uo), fp); - save_connected_weights(*(l.ug), fp); - } if (l.type == GRU) { - save_connected_weights(*(l.wz), fp); - save_connected_weights(*(l.wr), fp); - save_connected_weights(*(l.wh), fp); - save_connected_weights(*(l.uz), fp); - save_connected_weights(*(l.ur), fp); - save_connected_weights(*(l.uh), fp); - } if(l.type == CRNN){ + save_connected_weights(*(l.wi), fp); + save_connected_weights(*(l.wf), fp); + save_connected_weights(*(l.wo), fp); + save_connected_weights(*(l.wg), fp); + save_connected_weights(*(l.ui), fp); + save_connected_weights(*(l.uf), fp); + save_connected_weights(*(l.uo), fp); + save_connected_weights(*(l.ug), fp); + } if (l.type == GRU) { + save_connected_weights(*(l.wz), fp); + save_connected_weights(*(l.wr), fp); + save_connected_weights(*(l.wh), fp); + save_connected_weights(*(l.uz), fp); + save_connected_weights(*(l.ur), fp); + save_connected_weights(*(l.uh), fp); + } if(l.type == CRNN){ save_convolutional_weights(*(l.input_layer), fp); save_convolutional_weights(*(l.self_layer), fp); save_convolutional_weights(*(l.output_layer), fp); @@ -1128,24 +1128,24 @@ void load_weights_upto(network *net, char *filename, int start, int cutoff) load_connected_weights(*(l.self_layer), fp, transpose); load_connected_weights(*(l.output_layer), fp, transpose); } - if (l.type == LSTM) { - load_connected_weights(*(l.wi), fp, transpose); - load_connected_weights(*(l.wf), fp, transpose); - load_connected_weights(*(l.wo), fp, transpose); - load_connected_weights(*(l.wg), fp, transpose); - load_connected_weights(*(l.ui), fp, transpose); - load_connected_weights(*(l.uf), fp, transpose); - load_connected_weights(*(l.uo), fp, transpose); - load_connected_weights(*(l.ug), fp, transpose); - } - if (l.type == GRU) { - load_connected_weights(*(l.wz), fp, transpose); - load_connected_weights(*(l.wr), fp, transpose); - load_connected_weights(*(l.wh), fp, transpose); - load_connected_weights(*(l.uz), fp, transpose); - load_connected_weights(*(l.ur), fp, transpose); - load_connected_weights(*(l.uh), fp, transpose); - } + if (l.type == LSTM) { + load_connected_weights(*(l.wi), fp, transpose); + load_connected_weights(*(l.wf), fp, transpose); + load_connected_weights(*(l.wo), fp, transpose); + load_connected_weights(*(l.wg), fp, transpose); + load_connected_weights(*(l.ui), fp, transpose); + load_connected_weights(*(l.uf), fp, transpose); + load_connected_weights(*(l.uo), fp, transpose); + load_connected_weights(*(l.ug), fp, transpose); + } + if (l.type == GRU) { + load_connected_weights(*(l.wz), fp, transpose); + load_connected_weights(*(l.wr), fp, transpose); + load_connected_weights(*(l.wh), fp, transpose); + load_connected_weights(*(l.uz), fp, transpose); + load_connected_weights(*(l.ur), fp, transpose); + load_connected_weights(*(l.uh), fp, transpose); + } if(l.type == LOCAL){ int locations = l.out_w*l.out_h; int size = l.size*l.size*l.c*l.n*locations; From a4f5e71c6326ef991ea0a7669c1956a7fbd2f800 Mon Sep 17 00:00:00 2001 From: Yao Lu Date: Tue, 6 Jun 2017 17:20:26 -0700 Subject: [PATCH 026/118] fix GRU, add LSTM --- src/network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network.c b/src/network.c index b44e3a8b96e..86a98730fdc 100644 --- a/src/network.c +++ b/src/network.c @@ -125,8 +125,8 @@ char *get_layer_string(LAYER_TYPE a) return "rnn"; case GRU: return "gru"; - case LSTM: - return "lstm"; + case LSTM: + return "lstm"; case CRNN: return "crnn"; case MAXPOOL: From 59262f4c773b5185a05722d055acfbc2ca816e51 Mon Sep 17 00:00:00 2001 From: Yao Lu Date: Tue, 6 Jun 2017 17:21:12 -0700 Subject: [PATCH 027/118] Revert "fix GRU, add LSTM" This reverts commit a4f5e71c6326ef991ea0a7669c1956a7fbd2f800. --- src/network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network.c b/src/network.c index 86a98730fdc..b44e3a8b96e 100644 --- a/src/network.c +++ b/src/network.c @@ -125,8 +125,8 @@ char *get_layer_string(LAYER_TYPE a) return "rnn"; case GRU: return "gru"; - case LSTM: - return "lstm"; + case LSTM: + return "lstm"; case CRNN: return "crnn"; case MAXPOOL: From c04744d15e060e2ebedbfa9870289e8b1e8264ce Mon Sep 17 00:00:00 2001 From: Yao Lu Date: Tue, 6 Jun 2017 17:22:23 -0700 Subject: [PATCH 028/118] fix GRU, add LSTM --- src/network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network.c b/src/network.c index b44e3a8b96e..82eade3129a 100644 --- a/src/network.c +++ b/src/network.c @@ -125,8 +125,8 @@ char *get_layer_string(LAYER_TYPE a) return "rnn"; case GRU: return "gru"; - case LSTM: - return "lstm"; + case LSTM: + return "lstm"; case CRNN: return "crnn"; case MAXPOOL: From d286762c7aaccab7854b8433315b6360c2e82fb6 Mon Sep 17 00:00:00 2001 From: Yao Lu Date: Tue, 6 Jun 2017 17:23:35 -0700 Subject: [PATCH 029/118] fix GRU, add LSTM --- include/darknet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/darknet.h b/include/darknet.h index 06d426cb60d..c8bbd1d9072 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -186,7 +186,7 @@ struct layer{ float * forgot_state; float * forgot_delta; float * state_delta; - + float * concat; float * concat_delta; From fc069593f2ccc5d9026d0a65cd650dbac9ea5b3a Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 8 Jun 2017 13:47:31 -0700 Subject: [PATCH 030/118] :snake: :snake: :snake: :snake: --- .gitignore | 1 + Makefile | 10 +- cfg/cifar.cfg | 26 ++-- examples/classifier.c | 1 - examples/coco.c | 2 +- examples/detector.c | 7 +- examples/lsd.c | 10 +- examples/nightmare.c | 4 +- examples/rnn.c | 2 + examples/segmenter.c | 10 +- examples/yolo.c | 2 +- include/darknet.h | 243 ++++++++++++++++++++++++++++++-------- python/darknet.py | 70 +++++++++++ src/blas.h | 8 +- src/box.h | 4 - src/connected_layer.h | 2 - src/convolutional_layer.h | 4 - src/cuda.c | 2 + src/cuda.h | 6 - src/data.c | 28 +++-- src/data.h | 10 -- src/demo.h | 1 - src/detection_layer.h | 1 - src/image.c | 6 +- src/image.h | 34 ------ src/list.h | 2 - src/matrix.h | 7 -- src/network.c | 24 ++++ src/network.h | 29 +---- src/network_kernels.cu | 131 +++++++++++--------- src/option_list.c | 17 +++ src/option_list.h | 2 - src/parser.h | 6 +- src/region_layer.c | 9 ++ src/region_layer.h | 3 +- src/tree.h | 2 - src/utils.h | 20 +--- 37 files changed, 457 insertions(+), 289 deletions(-) create mode 100644 python/darknet.py diff --git a/.gitignore b/.gitignore index 2299a477fbb..bea19ff44fc 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.out *.png *.jpg +*.pyc old/ mnist/ data/ diff --git a/Makefile b/Makefile index 36a451cc19c..5c226af7229 100644 --- a/Makefile +++ b/Makefile @@ -10,21 +10,21 @@ ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ -gencode arch=compute_52,code=[sm_52,compute_52] # This is what I use, uncomment if you know your arch and want to specify -# ARCH= -gencode arch=compute_52,code=compute_52 +ARCH= -gencode arch=compute_52,code=compute_52 VPATH=./src/:./examples -LIB=libdarknet.a +LIB=libdarknet.so EXEC=darknet OBJDIR=./obj/ CC=gcc -NVCC=nvcc +NVCC=nvcc --compiler-options '-fPIC' AR=ar ARFLAGS=-rv OPTS=-Ofast LDFLAGS= -lm -pthread COMMON= -Iinclude/ -Isrc/ -CFLAGS=-Wall -Wfatal-errors +CFLAGS=-Wall -Wfatal-errors -fPIC ifeq ($(DEBUG), 1) OPTS=-O0 -g @@ -69,7 +69,7 @@ $(EXEC): $(EXECOBJ) $(LIB) $(CC) $(COMMON) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LIB) $(LIB): $(OBJS) - $(AR) $(ARFLAGS) $@ $^ + $(CC) $(CFLAGS) -shared $^ -o $@ $(LDFLAGS) $(OBJDIR)%.o: %.c $(DEPS) $(CC) $(COMMON) $(CFLAGS) -c $< -o $@ diff --git a/cfg/cifar.cfg b/cfg/cifar.cfg index f2c801a5a9e..c10fae5751c 100644 --- a/cfg/cifar.cfg +++ b/cfg/cifar.cfg @@ -1,25 +1,23 @@ [net] batch=128 subdivisions=1 -height=32 -width=32 +height=28 +width=28 channels=3 -momentum=0.9 -decay=0.0005 +max_crop=32 +min_crop=32 + +hue=.1 +saturation=.75 +exposure=.75 learning_rate=0.4 policy=poly power=4 -max_batches = 50000 - -[crop] -crop_width=28 -crop_height=28 -flip=1 -angle=0 -saturation = 1 -exposure = 1 -noadjust=1 +max_batches = 5000 +momentum=0.9 +decay=0.0005 + [convolutional] batch_normalize=1 diff --git a/examples/classifier.c b/examples/classifier.c index 112b913d866..645c80d4478 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -33,7 +33,6 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, cuda_set_device(gpus[i]); #endif nets[i] = load_network(cfgfile, weightfile, clear); - nets[i].learning_rate *= ngpus; } srand(time(0)); network net = nets[0]; diff --git a/examples/coco.c b/examples/coco.c index bab507d90bf..a07906e41b7 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -313,7 +313,7 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) if(weightfile){ load_weights(&net, weightfile); } - detection_layer l = net.layers[net.n-1]; + layer l = net.layers[net.n-1]; set_batch_network(&net, 1); srand(2222222); float nms = .4; diff --git a/examples/detector.c b/examples/detector.c index 0a31fc27cff..e6b57b8c903 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -22,12 +22,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i #ifdef GPU cuda_set_device(gpus[i]); #endif - nets[i] = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&nets[i], weightfile); - } - if(clear) *nets[i].seen = 0; - nets[i].learning_rate *= ngpus; + nets[i] = load_network(cfgfile, weightfile, clear); } srand(time(0)); network net = nets[0]; diff --git a/examples/lsd.c b/examples/lsd.c index 85641ecd64c..1b2b0b5f3b0 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -451,7 +451,7 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, printf("%s\n", base); network gnet = load_network(cfg, weight, clear); network anet = load_network(acfg, aweight, clear); - float orig_rate = anet.learning_rate; + //float orig_rate = anet.learning_rate; int start = 0; int i, j, k; @@ -494,7 +494,7 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int y_size = gnet.truths*gnet.batch; float *imerror = cuda_make_array(0, y_size); - int ay_size = anet.truths*anet.batch; + //int ay_size = anet.truths*anet.batch; float aloss_avg = -1; @@ -664,14 +664,14 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle clock_t time; int x_size = net.inputs*net.batch; - int y_size = x_size; + //int y_size = x_size; net.delta = 0; net.train = 1; float *pixs = calloc(x_size, sizeof(float)); float *graypixs = calloc(x_size, sizeof(float)); - float *y = calloc(y_size, sizeof(float)); + //float *y = calloc(y_size, sizeof(float)); - int ay_size = anet.outputs*anet.batch; + //int ay_size = anet.outputs*anet.batch; anet.delta = 0; anet.train = 1; diff --git a/examples/nightmare.c b/examples/nightmare.c index 9538238d3f5..fe7c5f7fa1b 100644 --- a/examples/nightmare.c +++ b/examples/nightmare.c @@ -1,5 +1,7 @@ #include "darknet.h" +#include + // ./darknet nightmare cfg/extractor.recon.cfg ~/trained/yolo-coco.conv frame6.png -reconstruct -iters 500 -i 3 -lambda .1 -rate .01 -smooth 2 float abs_mean(float *x, int n) @@ -128,11 +130,11 @@ void smooth(image recon, image update, float lambda, int num) void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters) { int iter = 0; - layer l = get_network_output_layer(net); for (iter = 0; iter < iters; ++iter) { image delta = make_image(recon.w, recon.h, recon.c); #ifdef GPU + layer l = get_network_output_layer(net); cuda_push_array(net.input_gpu, recon.data, recon.w*recon.h*recon.c); //cuda_push_array(net.truth_gpu, features, net.truths); net.delta_gpu = cuda_make_array(delta.data, delta.w*delta.h*delta.c); diff --git a/examples/rnn.c b/examples/rnn.c index 0ea4daabc73..05c8f37b077 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -1,5 +1,7 @@ #include "darknet.h" +#include + typedef struct { float *x; float *y; diff --git a/examples/segmenter.c b/examples/segmenter.c index f24bbdaa3ff..fe3d498ef77 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -24,7 +24,6 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, load_weights(&nets[i], weightfile); } if(clear) *nets[i].seen = 0; - nets[i].learning_rate *= ngpus; } srand(time(0)); network net = nets[0]; @@ -76,6 +75,15 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, pthread_join(load_thread, 0); train = buffer; load_thread = load_data(args); + image tr = float_to_image(net.w, net.h, 81, train.y.vals[0]); + image im = float_to_image(net.w, net.h, net.c, train.X.vals[0]); + image mask = mask_to_rgb(tr); + show_image(im, "input"); + show_image(mask, "truth"); +#ifdef OPENCV + cvWaitKey(100); +#endif + free_image(mask); printf("Loaded: %lf seconds\n", sec(clock()-time)); time=clock(); diff --git a/examples/yolo.c b/examples/yolo.c index e6ac873ec9c..5b3fd163b10 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -279,7 +279,7 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) if(weightfile){ load_weights(&net, weightfile); } - detection_layer l = net.layers[net.n-1]; + layer l = net.layers[net.n-1]; set_batch_network(&net, 1); srand(2222222); clock_t time; diff --git a/include/darknet.h b/include/darknet.h index 986d430935f..c78ea10f7a9 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -1,7 +1,11 @@ #ifndef DARKNET_API #define DARKNET_API #include +#include +#include +#include +#define SECRET_NUM -1234 extern int gpu_index; #ifdef GPU @@ -27,6 +31,13 @@ extern int gpu_index; #endif #endif +typedef struct{ + int classes; + char **names; +} metadata; + +metadata get_metadata(char *file); + typedef struct{ int *leaf; int n; @@ -42,7 +53,7 @@ typedef struct{ typedef enum{ LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN -}ACTIVATION; +} ACTIVATION; typedef enum { CONVOLUTIONAL, @@ -255,7 +266,7 @@ struct layer{ size_t workspace_size; - #ifdef GPU +#ifdef GPU int *indexes_gpu; float *z_gpu; @@ -281,8 +292,8 @@ struct layer{ float * concat_gpu; float * concat_delta_gpu; - float *binary_input_gpu; - float *binary_weights_gpu; + float * binary_input_gpu; + float * binary_weights_gpu; float * mean_gpu; float * variance_gpu; @@ -297,19 +308,22 @@ struct layer{ float * x_norm_gpu; float * weights_gpu; float * weight_updates_gpu; + float * weight_change_gpu; float * biases_gpu; float * bias_updates_gpu; + float * bias_change_gpu; float * scales_gpu; float * scale_updates_gpu; + float * scale_change_gpu; float * output_gpu; float * delta_gpu; float * rand_gpu; float * squared_gpu; float * norms_gpu; - #ifdef CUDNN +#ifdef CUDNN cudnnTensorDescriptor_t srcTensorDesc, dstTensorDesc; cudnnTensorDescriptor_t dsrcTensorDesc, ddstTensorDesc; cudnnTensorDescriptor_t normTensorDesc; @@ -319,8 +333,8 @@ struct layer{ cudnnConvolutionFwdAlgo_t fw_algo; cudnnConvolutionBwdDataAlgo_t bd_algo; cudnnConvolutionBwdFilterAlgo_t bf_algo; - #endif - #endif +#endif +#endif }; void free_layer(layer); @@ -383,12 +397,12 @@ typedef struct network{ int index; float *cost; - #ifdef GPU +#ifdef GPU float *input_gpu; float *truth_gpu; float *delta_gpu; float *output_gpu; - #endif +#endif } network; @@ -403,8 +417,8 @@ typedef struct { } augment_args; typedef struct { - int h; int w; + int h; int c; float *data; } image; @@ -472,6 +486,7 @@ typedef struct{ network load_network(char *cfg, char *weights, int clear); +network *load_network_p(char *cfg, char *weights, int clear); load_args get_base_args(network net); void free_data(data d); @@ -492,47 +507,171 @@ pthread_t load_data(load_args args); list *read_data_cfg(char *filename); list *read_cfg(char *filename); +void forward_network(network net); +void backward_network(network net); +void update_network(network net); + + +void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); +void copy_cpu(int N, float *X, int INCX, float *Y, int INCY); +void scal_cpu(int N, float ALPHA, float *X, int INCX); +void normalize_cpu(float *x, float *mean, float *variance, int batch, int filters, int spatial); + +int best_3d_shift_r(image a, image b, int min, int max); +#ifdef GPU +void axpy_ongpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY); +void fill_ongpu(int N, float ALPHA, float * X, int INCX); +void scal_ongpu(int N, float ALPHA, float * X, int INCX); +void copy_ongpu(int N, float * X, int INCX, float * Y, int INCY); + +void cuda_set_device(int n); +void cuda_free(float *x_gpu); +float *cuda_make_array(float *x, size_t n); +void cuda_pull_array(float *x_gpu, float *x, size_t n); +float cuda_mag_array(float *x_gpu, size_t n); +void cuda_push_array(float *x_gpu, float *x, size_t n); + +void forward_network_gpu(network net); +void backward_network_gpu(network net); +void update_network_gpu(network net); + +float train_networks(network *nets, int n, data d, int interval); +void sync_nets(network *nets, int n, int interval); +void harmless_update_network_gpu(network net); +#endif +void save_image_png(image im, const char *name); +void get_next_batch(data d, int n, int offset, float *X, float *y); +void grayscale_image_3c(image im); +void normalize_image(image p); +void matrix_to_csv(matrix m); +float train_network_sgd(network net, data d, int n); +void rgbgr_image(image im); +data copy_data(data d); +data concat_data(data d1, data d2); +data load_cifar10_data(char *filename); +float matrix_topk_accuracy(matrix truth, matrix guess, int k); +void matrix_add_matrix(matrix from, matrix to); +void scale_matrix(matrix m, float scale); +matrix csv_to_matrix(char *filename); +float *network_accuracies(network net, data d, int n); +float train_network_datum(network net); +image make_random_image(int w, int h, int c); + +void denormalize_connected_layer(layer l); +void denormalize_convolutional_layer(layer l); +void statistics_connected_layer(layer l); +void rescale_weights(layer l, float scale, float trans); +void rgbgr_weights(layer l); +image *get_weights(layer l); + +void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, int avg, float hier_thresh, int w, int h, int fps, int fullscreen); +void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness); + +char *option_find_str(list *l, char *key, char *def); +int option_find_int(list *l, char *key, int def); + +network parse_network_cfg(char *filename); +void save_weights(network net, char *filename); +void load_weights(network *net, char *filename); +void save_weights_upto(network net, char *filename, int cutoff); +void load_weights_upto(network *net, char *filename, int start, int cutoff); + +void zero_objectness(layer l); +void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int relative); +void free_network(network net); +void set_batch_network(network *net, int b); +image load_image(char *filename, int w, int h, int c); +image load_image_color(char *filename, int w, int h); +image make_image(int w, int h, int c); +image resize_image(image im, int w, int h); +image letterbox_image(image im, int w, int h); +image crop_image(image im, int dx, int dy, int w, int h); +image resize_min(image im, int min); +image threshold_image(image im, float thresh); +image mask_to_rgb(image mask); +int resize_network(network *net, int w, int h); +void free_matrix(matrix m); +void test_resize(char *filename); +void save_image(image p, const char *name); +void show_image(image p, const char *name); +image copy_image(image p); +void draw_box_width(image a, int x1, int y1, int x2, int y2, int w, float r, float g, float b); +float get_current_rate(network net); +void composite_3d(char *f1, char *f2, char *out, int delta); +data load_data_old(char **paths, int n, int m, char **labels, int k, int w, int h); +int get_current_batch(network net); +void constrain_image(image im); +image get_network_image_layer(network net, int i); +layer get_network_output_layer(network net); +void top_predictions(network net, int n, int *index); +void flip_image(image a); +image float_to_image(int w, int h, int c, float *data); +void ghost_image(image source, image dest, int dx, int dy); +float network_accuracy(network net, data d); +void random_distort_image(image im, float hue, float saturation, float exposure); +void fill_image(image m, float s); +image grayscale_image(image im); +void rotate_image_cw(image im, int times); +image rotate_image(image m, float rad); +void visualize_network(network net); +float box_iou(box a, box b); +void do_nms(box *boxes, float **probs, int total, int classes, float thresh); +data load_all_cifar10(); +box_label *read_boxes(char *filename, int *n); +void draw_detections(image im, int num, float thresh, box *boxes, float **probs, char **names, image **labels, int classes); + +matrix network_predict_data(network net, data test); +image **load_alphabet(); +image get_network_image(network net); +float *network_predict(network net, float *input); +float *network_predict_p(network *net, float *input); + +int network_width(network *net); +int network_height(network *net); +float *network_predict_image(network *net, image im); + +char **get_labels(char *filename); +void do_nms_sort(box *boxes, float **probs, int total, int classes, float thresh); +void do_nms_obj(box *boxes, float **probs, int total, int classes, float thresh); + +matrix make_matrix(int rows, int cols); + +#ifndef __cplusplus +#ifdef OPENCV +image get_image_from_stream(CvCapture *cap); +#endif +#endif +void free_image(image m); +float train_network(network net, data d); +pthread_t load_data_in_thread(load_args args); +list *get_paths(char *filename); +void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves, int stride); +void change_leaves(tree *t, char *leaf_list); + +int find_int_arg(int argc, char **argv, char *arg, int def); +float find_float_arg(int argc, char **argv, char *arg, float def); +int find_arg(int argc, char* argv[], char *arg); +char *find_char_arg(int argc, char **argv, char *arg, char *def); +char *basecfg(char *cfgfile); +void find_replace(char *str, char *orig, char *rep, char *output); +void free_ptrs(void **ptrs, int n); +char *fgetl(FILE *fp); +void strip(char *s); +float sec(clock_t clocks); +void **list_to_array(list *l); +void top_k(float *a, int n, int k, int *index); +int *read_map(char *filename); +void error(const char *s); +int max_index(float *a, int n); +int sample_array(float *a, int n); +void free_list(list *l); +float mse_array(float *a, int n); +float variance_array(float *a, int n); +float mag_array(float *a, int n); +float mean_array(float *a, int n); +void normalize_array(float *a, int n); +int *read_intlist(char *s, int *n, int d); +size_t rand_size_t(); +float rand_normal(); -#include "activation_layer.h" -#include "activations.h" -#include "avgpool_layer.h" -#include "batchnorm_layer.h" -#include "blas.h" -#include "box.h" -#include "classifier.h" -#include "col2im.h" -#include "connected_layer.h" -#include "convolutional_layer.h" -#include "cost_layer.h" -#include "crnn_layer.h" -#include "crop_layer.h" -#include "cuda.h" -#include "data.h" -#include "deconvolutional_layer.h" -#include "demo.h" -#include "detection_layer.h" -#include "dropout_layer.h" -#include "gemm.h" -#include "gru_layer.h" -#include "im2col.h" -#include "image.h" -#include "layer.h" -#include "list.h" -#include "local_layer.h" -#include "matrix.h" -#include "maxpool_layer.h" -#include "network.h" -#include "normalization_layer.h" -#include "option_list.h" -#include "parser.h" -#include "region_layer.h" -#include "reorg_layer.h" -#include "rnn_layer.h" -#include "route_layer.h" -#include "shortcut_layer.h" -#include "softmax_layer.h" -#include "stb_image.h" -#include "stb_image_write.h" -#include "tree.h" -#include "utils.h" #endif diff --git a/python/darknet.py b/python/darknet.py new file mode 100644 index 00000000000..e23e5383410 --- /dev/null +++ b/python/darknet.py @@ -0,0 +1,70 @@ +from ctypes import * + +class IMAGE(Structure): + _fields_ = [("w", c_int), + ("h", c_int), + ("c", c_int), + ("data", POINTER(c_float))] + +class METADATA(Structure): + _fields_ = [("classes", c_int), + ("names", POINTER(c_char_p))] + +lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL) +lib.network_width.argtypes = [c_void_p] +lib.network_width.restype = c_int +lib.network_height.argtypes = [c_void_p] +lib.network_height.restype = c_int + +def load_meta(f): + lib.get_metadata.argtypes = [c_char_p] + lib.get_metadata.restype = METADATA + return lib.get_metadata(f) + +def load_net(cfg, weights): + load_network = lib.load_network_p + load_network.argtypes = [c_char_p, c_char_p, c_int] + load_network.restype = c_void_p + return load_network(cfg, weights, 0) + +def load_img(f): + load_image = lib.load_image_color + load_image.argtypes = [c_char_p, c_int, c_int] + load_image.restype = IMAGE + return load_image(f, 0, 0) + +def letterbox_img(im, w, h): + letterbox_image = lib.letterbox_image + letterbox_image.argtypes = [IMAGE, c_int, c_int] + letterbox_image.restype = IMAGE + return letterbox_image(im, w, h) + +def predict(net, im): + pred = lib.network_predict_image + pred.argtypes = [c_void_p, IMAGE] + pred.restype = POINTER(c_float) + return pred(net, im) + +def classify(net, meta, im): + out = predict(net, im) + res = [] + for i in range(meta.classes): + res.append((meta.names[i], out[i])) + res = sorted(res, key=lambda x: -x[1]) + return res + +def detect(net, meta, im): + out = predict(net, im) + res = [] + for i in range(meta.classes): + res.append((meta.names[i], out[i])) + res = sorted(res, key=lambda x: -x[1]) + return res + +if __name__ == "__main__": + net = load_net("cfg/densenet.cfg", "/home/pjreddie/trained/densenet201.weights") + im = load_img("data/wolf.jpg") + meta = load_meta("cfg/imagenet1k.data") + r = classify(net, meta, im) + print r[:10] + diff --git a/src/blas.h b/src/blas.h index 49ff08758c8..7b0218f6e8a 100644 --- a/src/blas.h +++ b/src/blas.h @@ -1,5 +1,7 @@ #ifndef BLAS_H #define BLAS_H +#include "darknet.h" + void flatten(float *x, int size, int layers, int batch, int forward); void pm(int M, int N, float *A); float *random_matrix(int rows, int cols); @@ -13,9 +15,6 @@ void constrain_ongpu(int N, float ALPHA, float * X, int INCX); void pow_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void mul_cpu(int N, float *X, int INCX, float *Y, int INCY); -void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); -void copy_cpu(int N, float *X, int INCX, float *Y, int INCY); -void scal_cpu(int N, float ALPHA, float *X, int INCX); void fill_cpu(int N, float ALPHA, float * X, int INCX); float dot_cpu(int N, float *X, int INCX, float *Y, int INCY); int test_gpu_blas(); @@ -23,7 +22,6 @@ void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, void mean_cpu(float *x, int batch, int filters, int spatial, float *mean); void variance_cpu(float *x, float *mean, int batch, int filters, int spatial, float *variance); -void normalize_cpu(float *x, float *mean, float *variance, int batch, int filters, int spatial); void scale_bias(float *output, float *scales, int batch, int n, int size); void backward_scale_cpu(float *x_norm, float *delta, int batch, int n, int size, float *scale_updates); @@ -47,14 +45,12 @@ void axpy_ongpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY); void axpy_ongpu_offset(int N, float ALPHA, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); void copy_ongpu(int N, float * X, int INCX, float * Y, int INCY); void copy_ongpu_offset(int N, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); -void scal_ongpu(int N, float ALPHA, float * X, int INCX); void add_ongpu(int N, float ALPHA, float * X, int INCX); void supp_ongpu(int N, float ALPHA, float * X, int INCX); void mask_ongpu(int N, float * X, float mask_num, float * mask); void const_ongpu(int N, float ALPHA, float *X, int INCX); void pow_ongpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void mul_ongpu(int N, float *X, int INCX, float *Y, int INCY); -void fill_ongpu(int N, float ALPHA, float * X, int INCX); void mean_gpu(float *x, int batch, int filters, int spatial, float *mean); void variance_gpu(float *x, float *mean, int batch, int filters, int spatial, float *variance); diff --git a/src/box.h b/src/box.h index 59b38a58d19..35e8bdc9a21 100644 --- a/src/box.h +++ b/src/box.h @@ -7,12 +7,8 @@ typedef struct{ } dbox; box float_to_box(float *f, int stride); -float box_iou(box a, box b); float box_rmse(box a, box b); dbox diou(box a, box b); -void do_nms(box *boxes, float **probs, int total, int classes, float thresh); -void do_nms_sort(box *boxes, float **probs, int total, int classes, float thresh); -void do_nms_obj(box *boxes, float **probs, int total, int classes, float thresh); box decode_box(box b, box anchor); box encode_box(box b, box anchor); diff --git a/src/connected_layer.h b/src/connected_layer.h index 62dd497f3f2..067b256657b 100644 --- a/src/connected_layer.h +++ b/src/connected_layer.h @@ -12,8 +12,6 @@ connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVAT void forward_connected_layer(connected_layer layer, network net); void backward_connected_layer(connected_layer layer, network net); void update_connected_layer(connected_layer layer, int batch, float learning_rate, float momentum, float decay); -void denormalize_connected_layer(layer l); -void statistics_connected_layer(layer l); #ifdef GPU void forward_connected_layer_gpu(connected_layer layer, network net); diff --git a/src/convolutional_layer.h b/src/convolutional_layer.h index d25ef649838..91394c38d6d 100644 --- a/src/convolutional_layer.h +++ b/src/convolutional_layer.h @@ -26,7 +26,6 @@ void cudnn_convolutional_setup(layer *l); #endif convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int binary, int xnor, int adam); -void denormalize_convolutional_layer(convolutional_layer l); void resize_convolutional_layer(convolutional_layer *layer, int w, int h); void forward_convolutional_layer(const convolutional_layer layer, network net); void update_convolutional_layer(convolutional_layer layer, int batch, float learning_rate, float momentum, float decay); @@ -40,15 +39,12 @@ void backward_convolutional_layer(convolutional_layer layer, network net); void add_bias(float *output, float *biases, int batch, int n, int size); void backward_bias(float *bias_updates, float *delta, int batch, int n, int size); -image *get_weights(convolutional_layer l); image get_convolutional_image(convolutional_layer layer); image get_convolutional_delta(convolutional_layer layer); image get_convolutional_weight(convolutional_layer layer, int i); int convolutional_out_height(convolutional_layer layer); int convolutional_out_width(convolutional_layer layer); -void rescale_weights(convolutional_layer l, float scale, float trans); -void rgbgr_weights(convolutional_layer l); #endif diff --git a/src/cuda.c b/src/cuda.c index e011b89d079..e511403776f 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -96,6 +96,8 @@ float *cuda_make_array(float *x, size_t n) if(x){ status = cudaMemcpy(x_gpu, x, size, cudaMemcpyHostToDevice); check_error(status); + } else { + fill_ongpu(n, 0, x_gpu, 1); } if(!x_gpu) error("Cuda malloc failed\n"); return x_gpu; diff --git a/src/cuda.h b/src/cuda.h index cdaba208cd7..a1bc2160ded 100644 --- a/src/cuda.h +++ b/src/cuda.h @@ -7,16 +7,10 @@ void check_error(cudaError_t status); cublasHandle_t blas_handle(); -float *cuda_make_array(float *x, size_t n); int *cuda_make_int_array(int *x, size_t n); -void cuda_push_array(float *x_gpu, float *x, size_t n); -void cuda_pull_array(float *x_gpu, float *x, size_t n); -void cuda_set_device(int n); -void cuda_free(float *x_gpu); void cuda_random(float *x_gpu, size_t n); float cuda_compare(float *x_gpu, float *x, size_t n, char *s); dim3 cuda_gridsize(size_t n); -float cuda_mag_array(float *x_gpu, size_t n); #ifdef CUDNN cudnnHandle_t cudnn_handle(); diff --git a/src/data.c b/src/data.c index dcc5089b025..c227b6f8a1e 100644 --- a/src/data.c +++ b/src/data.c @@ -535,16 +535,17 @@ void or_image(image src, image dest, int c) } } -void fill_bg_mask(image m) +void exclusive_image(image src) { - int i,k; - int index = m.w*m.h*(m.c-1); - for(i = 0; i < m.w*m.h; ++i){ - m.data[index + i] = 1; - } - for(k = 0; k < m.c-1; ++k){ - for(i = 0; i < m.w*m.h; ++i){ - if(m.data[index + i] && m.data[k*m.w*m.h + i]) m.data[index + i] = 0; + int k, j, i; + int s = src.w*src.h; + for(k = 0; k < src.c-1; ++k){ + for(i = 0; i < s; ++i){ + if (src.data[k*s + i]){ + for(j = k+1; j < src.c; ++j){ + src.data[j*s + i] = 0; + } + } } } } @@ -558,6 +559,10 @@ image get_segmentation_image(char *path, int w, int h, int classes) find_replace(labelpath, ".JPG", ".txt", labelpath); find_replace(labelpath, ".JPEG", ".txt", labelpath); image mask = make_image(w, h, classes+1); + int i; + for(i = 0; i < w*h; ++i){ + mask.data[w*h*classes + i] = 1; + } FILE *file = fopen(labelpath, "r"); if(!file) file_error(labelpath); char buff[32788]; @@ -568,9 +573,12 @@ image get_segmentation_image(char *path, int w, int h, int classes) int *rle = read_intlist(buff, &n, 0); load_rle(part, rle, n); or_image(part, mask, id); + for(i = 0; i < w*h; ++i){ + if(part.data[i]) mask.data[w*h*classes + i] = 0; + } free(rle); } - fill_bg_mask(mask); + //exclusive_image(mask); fclose(file); free_image(part); return mask; diff --git a/src/data.h b/src/data.h index 8f18d9f669a..931b99b2780 100644 --- a/src/data.h +++ b/src/data.h @@ -20,12 +20,10 @@ static inline float distance_from_edge(int x, int max) } void load_data_blocking(load_args args); -pthread_t load_data_in_thread(load_args args); void print_letters(float *pred, int n); data load_data_captcha(char **paths, int n, int m, int k, int w, int h); data load_data_captcha_encode(char **paths, int n, int m, int w, int h); -data load_data_old(char **paths, int n, int m, char **labels, int k, int w, int h); data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, int classes, float jitter, float hue, float saturation, float exposure); data load_data_tag(char **paths, int n, int m, int k, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center); @@ -34,27 +32,19 @@ data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *h data load_data_regression(char **paths, int n, int m, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); data load_go(char *filename); -box_label *read_boxes(char *filename, int *n); -data load_cifar10_data(char *filename); -data load_all_cifar10(); data load_data_writing(char **paths, int n, int m, int w, int h, int out_w, int out_h); -list *get_paths(char *filename); -char **get_labels(char *filename); void get_random_batch(data d, int n, float *X, float *y); data get_data_part(data d, int part, int total); data get_random_data(data d, int num); -void get_next_batch(data d, int n, int offset, float *X, float *y); data load_categorical_data_csv(char *filename, int target, int k); void normalize_data_rows(data d); void scale_data_rows(data d, float s); void translate_data_rows(data d, float s); void randomize_data(data d); data *split_data(data d, int part, int total); -data concat_data(data d1, data d2); data concat_datas(data *d, int n); void fill_truth(char *path, char **labels, int k, float *truth); -data copy_data(data d); #endif diff --git a/src/demo.h b/src/demo.h index d920759c12a..86e46541d1a 100644 --- a/src/demo.h +++ b/src/demo.h @@ -2,6 +2,5 @@ #define DEMO_H #include "image.h" -void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, int avg, float hier_thresh, int w, int h, int fps, int fullscreen); #endif diff --git a/src/detection_layer.h b/src/detection_layer.h index fecfed04cc3..1c818535700 100644 --- a/src/detection_layer.h +++ b/src/detection_layer.h @@ -9,7 +9,6 @@ typedef layer detection_layer; detection_layer make_detection_layer(int batch, int inputs, int n, int size, int classes, int coords, int rescore); void forward_detection_layer(const detection_layer l, network net); void backward_detection_layer(const detection_layer l, network net); -void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness); #ifdef GPU void forward_detection_layer_gpu(const detection_layer l, network net); diff --git a/src/image.c b/src/image.c index 1a8c984a6e8..146ec355056 100644 --- a/src/image.c +++ b/src/image.c @@ -36,9 +36,9 @@ image mask_to_rgb(image mask) float green = get_color(1,offset,n); float blue = get_color(0,offset,n); for(i = 0; i < im.w*im.h; ++i){ - im.data[i + 0*im.w*im.h] = mask.data[j*im.h*im.w + i]*red; - im.data[i + 1*im.w*im.h] = mask.data[j*im.h*im.w + i]*green; - im.data[i + 2*im.w*im.h] = mask.data[j*im.h*im.w + i]*blue; + im.data[i + 0*im.w*im.h] += mask.data[j*im.h*im.w + i]*red; + im.data[i + 1*im.w*im.h] += mask.data[j*im.h*im.w + i]*green; + im.data[i + 2*im.w*im.h] += mask.data[j*im.h*im.w + i]*blue; } } return im; diff --git a/src/image.h b/src/image.h index 8b516c141ab..02c79f0887d 100644 --- a/src/image.h +++ b/src/image.h @@ -11,7 +11,6 @@ #ifndef __cplusplus #ifdef OPENCV -image get_image_from_stream(CvCapture *cap); int fill_image_from_stream(CvCapture *cap, image im); image ipl_to_image(IplImage* src); void ipl_into_image(IplImage* src, image im); @@ -20,36 +19,22 @@ void show_image_cv(image p, const char *name, IplImage *disp); #endif #endif -image mask_to_rgb(image mask); float get_color(int c, int x, int max); -void flip_image(image a); void draw_box(image a, int x1, int y1, int x2, int y2, float r, float g, float b); -void draw_box_width(image a, int x1, int y1, int x2, int y2, int w, float r, float g, float b); void draw_bbox(image a, box bbox, int w, float r, float g, float b); void draw_label(image a, int r, int c, image label, const float *rgb); void write_label(image a, int r, int c, image *characters, char *string, float *rgb); -void draw_detections(image im, int num, float thresh, box *boxes, float **probs, char **names, image **labels, int classes); image image_distance(image a, image b); void scale_image(image m, float s); -image crop_image(image im, int dx, int dy, int w, int h); image rotate_crop_image(image im, float rad, float s, int w, int h, float dx, float dy, float aspect); image center_crop_image(image im, int w, int h); image random_crop_image(image im, int w, int h); image random_augment_image(image im, float angle, float aspect, int low, int high, int w, int h); augment_args random_augment_args(image im, float angle, float aspect, int low, int high, int w, int h); -void random_distort_image(image im, float hue, float saturation, float exposure); -image letterbox_image(image im, int w, int h); void letterbox_image_into(image im, int w, int h, image boxed); -image resize_image(image im, int w, int h); -image resize_min(image im, int min); image resize_max(image im, int max); -void fill_image(image m, float s); void translate_image(image m, float s); -void normalize_image(image p); -image rotate_image(image m, float rad); -void rotate_image_cw(image im, int times); void embed_image(image source, image dest, int dx, int dy); -void ghost_image(image source, image dest, int dx, int dy); void place_image(image im, int w, int h, int dx, int dy, image canvas); void saturate_image(image im, float sat); void exposure_image(image im, float sat); @@ -59,38 +44,21 @@ void rgb_to_hsv(image im); void hsv_to_rgb(image im); void yuv_to_rgb(image im); void rgb_to_yuv(image im); -void rgbgr_image(image im); -void constrain_image(image im); -void composite_3d(char *f1, char *f2, char *out, int delta); -int best_3d_shift_r(image a, image b, int min, int max); -image grayscale_image(image im); -void grayscale_image_3c(image im); -image threshold_image(image im, float thresh); image collapse_image_layers(image source, int border); image collapse_images_horz(image *ims, int n); image collapse_images_vert(image *ims, int n); -void show_image(image p, const char *name); void show_image_normalized(image im, const char *name); -void save_image_png(image im, const char *name); -void save_image(image p, const char *name); void show_images(image *ims, int n, char *window); void show_image_layers(image p, char *name); void show_image_collapsed(image p, char *name); void print_image(image m); -image make_image(int w, int h, int c); -image make_random_image(int w, int h, int c); image make_empty_image(int w, int h, int c); -image float_to_image(int w, int h, int c, float *data); -image copy_image(image p); void copy_image_into(image src, image dest); -image load_image(char *filename, int w, int h, int c); -image load_image_color(char *filename, int w, int h); -image **load_alphabet(); float get_pixel(image m, int x, int y, int c); float get_pixel_extend(image m, int x, int y, int c); @@ -100,7 +68,5 @@ float bilinear_interpolate(image im, float x, float y, int c); image get_image_layer(image m, int l); -void free_image(image m); -void test_resize(char *filename); #endif diff --git a/src/list.h b/src/list.h index 214b280530d..6b445c717c2 100644 --- a/src/list.h +++ b/src/list.h @@ -7,9 +7,7 @@ int list_find(list *l, void *val); void list_insert(list *, void *); -void **list_to_array(list *l); -void free_list(list *l); void free_list_contents(list *l); #endif diff --git a/src/matrix.h b/src/matrix.h index 14afcd753fd..879acd70d26 100644 --- a/src/matrix.h +++ b/src/matrix.h @@ -2,17 +2,10 @@ #define MATRIX_H #include "darknet.h" -matrix make_matrix(int rows, int cols); matrix copy_matrix(matrix m); -void free_matrix(matrix m); void print_matrix(matrix m); -matrix csv_to_matrix(char *filename); -void matrix_to_csv(matrix m); matrix hold_out_matrix(matrix *m, int n); -float matrix_topk_accuracy(matrix truth, matrix guess, int k); -void matrix_add_matrix(matrix from, matrix to); -void scale_matrix(matrix m, float scale); matrix resize_matrix(matrix m, int size); float *pop_column(matrix *m, int c); diff --git a/src/network.c b/src/network.c index 2b21338dca9..c5a44b5a3a2 100644 --- a/src/network.c +++ b/src/network.c @@ -58,6 +58,13 @@ network load_network(char *cfg, char *weights, int clear) return net; } +network *load_network_p(char *cfg, char *weights, int clear) +{ + network *net = calloc(1, sizeof(network)); + *net = load_network(cfg, weights, clear); + return net; +} + int get_current_batch(network net) { int batch_num = (*net.seen)/(net.batch*net.subdivisions); @@ -439,6 +446,23 @@ float *network_predict(network net, float *input) return net.output; } +float *network_predict_p(network *net, float *input) +{ + return network_predict(*net, input); +} + +float *network_predict_image(network *net, image im) +{ + image imr = letterbox_image(im, net->w, net->h); + set_batch_network(net, 1); + float *p = network_predict(*net, imr.data); + free_image(imr); + return p; +} + +int network_width(network *net){return net->w;} +int network_height(network *net){return net->h;} + matrix network_predict_data_multi(network net, data test, int n) { int i,j,b,m; diff --git a/src/network.h b/src/network.h index 15a644e5e17..4e956cbff64 100644 --- a/src/network.h +++ b/src/network.h @@ -10,46 +10,21 @@ #ifdef GPU -float train_networks(network *nets, int n, data d, int interval); -void sync_nets(network *nets, int n, int interval); float train_network_datum_gpu(network net); float *network_predict_gpu(network net, float *input); void pull_network_output(network net); -void forward_network_gpu(network net); -void backward_network_gpu(network net); -void update_network_gpu(network net); -void harmless_update_network_gpu(network net); #endif -float get_current_rate(network net); -int get_current_batch(network net); -void free_network(network net); void compare_networks(network n1, network n2, data d); char *get_layer_string(LAYER_TYPE a); network make_network(int n); -void forward_network(network net); -void backward_network(network net); -void update_network(network net); - -float train_network(network net, data d); -float train_network_sgd(network net, data d, int n); -float train_network_datum(network net); - -matrix network_predict_data(network net, data test); -float *network_predict(network net, float *input); -float network_accuracy(network net, data d); -float *network_accuracies(network net, data d, int n); + + float network_accuracy_multi(network net, data d, int n); -void top_predictions(network net, int n, int *index); -image get_network_image(network net); -image get_network_image_layer(network net, int i); -layer get_network_output_layer(network net); int get_predicted_class_network(network net); void print_network(network net); -void visualize_network(network net); int resize_network(network *net, int w, int h); -void set_batch_network(network *net, int b); void calc_network_cost(network net); #endif diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 2fbc2dd47f2..28aa20ec31f 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -149,51 +149,17 @@ pthread_t train_network_in_thread(network net, data d, float *err) return thread; } -void pull_updates(layer l) -{ - if(l.type == CONVOLUTIONAL){ - cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.n); - cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.n*l.size*l.size*l.c); - if(l.scale_updates) cuda_pull_array(l.scale_updates_gpu, l.scale_updates, l.n); - } else if(l.type == CONNECTED){ - cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.outputs); - cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.outputs*l.inputs); - } -} - -void push_updates(layer l) -{ - if(l.type == CONVOLUTIONAL){ - cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.n); - cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.n*l.size*l.size*l.c); - if(l.scale_updates) cuda_push_array(l.scale_updates_gpu, l.scale_updates, l.n); - } else if(l.type == CONNECTED){ - cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.outputs); - cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.outputs*l.inputs); - } -} - -void update_layer(layer l, network net) -{ - int update_batch = net.batch*net.subdivisions; - float rate = get_current_rate(net); - l.t = get_current_batch(net); - if(l.update_gpu){ - l.update_gpu(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); - } -} - void merge_weights(layer l, layer base) { if (l.type == CONVOLUTIONAL) { - axpy_cpu(l.n, 1, l.biases, 1, base.biases, 1); - axpy_cpu(l.n*l.size*l.size*l.c, 1, l.weights, 1, base.weights, 1); + axpy_cpu(l.n, 1, l.bias_updates, 1, base.biases, 1); + axpy_cpu(l.n*l.size*l.size*l.c, 1, l.weight_updates, 1, base.weights, 1); if (l.scales) { - axpy_cpu(l.n, 1, l.scales, 1, base.scales, 1); + axpy_cpu(l.n, 1, l.scale_updates, 1, base.scales, 1); } } else if(l.type == CONNECTED) { - axpy_cpu(l.outputs, 1, l.biases, 1, base.biases, 1); - axpy_cpu(l.outputs*l.inputs, 1, l.weights, 1, base.weights, 1); + axpy_cpu(l.outputs, 1, l.bias_updates, 1, base.biases, 1); + axpy_cpu(l.outputs*l.inputs, 1, l.weight_updates, 1, base.weights, 1); } } @@ -214,19 +180,19 @@ void scale_weights(layer l, float s) void pull_weights(layer l) { - if(l.type == CONVOLUTIONAL){ - cuda_pull_array(l.biases_gpu, l.biases, l.n); - cuda_pull_array(l.weights_gpu, l.weights, l.n*l.size*l.size*l.c); - if(l.scales) cuda_pull_array(l.scales_gpu, l.scales, l.n); + if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ + cuda_pull_array(l.biases_gpu, l.bias_updates, l.n); + cuda_pull_array(l.weights_gpu, l.weight_updates, l.n*l.size*l.size*l.c); + if(l.scales) cuda_pull_array(l.scales_gpu, l.scale_updates, l.n); } else if(l.type == CONNECTED){ - cuda_pull_array(l.biases_gpu, l.biases, l.outputs); - cuda_pull_array(l.weights_gpu, l.weights, l.outputs*l.inputs); + cuda_pull_array(l.biases_gpu, l.bias_updates, l.outputs); + cuda_pull_array(l.weights_gpu, l.weight_updates, l.outputs*l.inputs); } } void push_weights(layer l) { - if(l.type == CONVOLUTIONAL){ + if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ cuda_push_array(l.biases_gpu, l.biases, l.n); cuda_push_array(l.weights_gpu, l.weights, l.n*l.size*l.size*l.c); if(l.scales) cuda_push_array(l.scales_gpu, l.scales, l.n); @@ -238,17 +204,52 @@ void push_weights(layer l) void distribute_weights(layer l, layer base) { - if(l.type == CONVOLUTIONAL){ + if (l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL) { cuda_push_array(l.biases_gpu, base.biases, l.n); cuda_push_array(l.weights_gpu, base.weights, l.n*l.size*l.size*l.c); - if(base.scales) cuda_push_array(l.scales_gpu, base.scales, l.n); - } else if(l.type == CONNECTED){ + if (base.scales) cuda_push_array(l.scales_gpu, base.scales, l.n); + } else if (l.type == CONNECTED) { cuda_push_array(l.biases_gpu, base.biases, l.outputs); cuda_push_array(l.weights_gpu, base.weights, l.outputs*l.inputs); } } +/* + +void pull_updates(layer l) +{ + if(l.type == CONVOLUTIONAL){ + cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.n); + cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.n*l.size*l.size*l.c); + if(l.scale_updates) cuda_pull_array(l.scale_updates_gpu, l.scale_updates, l.n); + } else if(l.type == CONNECTED){ + cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.outputs); + cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.outputs*l.inputs); + } +} + +void push_updates(layer l) +{ + if(l.type == CONVOLUTIONAL){ + cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.n); + cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.n*l.size*l.size*l.c); + if(l.scale_updates) cuda_push_array(l.scale_updates_gpu, l.scale_updates, l.n); + } else if(l.type == CONNECTED){ + cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.outputs); + cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.outputs*l.inputs); + } +} + +void update_layer(layer l, network net) +{ + int update_batch = net.batch*net.subdivisions; + float rate = get_current_rate(net); + l.t = get_current_batch(net); + if(l.update_gpu){ + l.update_gpu(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); + } +} void merge_updates(layer l, layer base) { if (l.type == CONVOLUTIONAL) { @@ -265,7 +266,7 @@ void merge_updates(layer l, layer base) void distribute_updates(layer l, layer base) { - if(l.type == CONVOLUTIONAL){ + if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ cuda_push_array(l.bias_updates_gpu, base.bias_updates, l.n); cuda_push_array(l.weight_updates_gpu, base.weight_updates, l.n*l.size*l.size*l.c); if(base.scale_updates) cuda_push_array(l.scale_updates_gpu, base.scale_updates, l.n); @@ -274,16 +275,37 @@ void distribute_updates(layer l, layer base) cuda_push_array(l.weight_updates_gpu, base.weight_updates, l.outputs*l.inputs); } } +*/ +/* void sync_layer(network *nets, int n, int j) { - //printf("Syncing layer %d\n", j); int i; network net = nets[0]; layer base = net.layers[j]; - cuda_set_device(net.gpu_index); - pull_weights(base); - for (i = 1; i < n; ++i) { + scale_weights(base, 0); + for (i = 0; i < n; ++i) { + cuda_set_device(nets[i].gpu_index); + layer l = nets[i].layers[j]; + pull_weights(l); + merge_weights(l, base); + } + scale_weights(base, 1./n); + for (i = 0; i < n; ++i) { + cuda_set_device(nets[i].gpu_index); + layer l = nets[i].layers[j]; + distribute_weights(l, base); + } +} +*/ + +void sync_layer(network *nets, int n, int j) +{ + int i; + network net = nets[0]; + layer base = net.layers[j]; + scale_weights(base, 0); + for (i = 0; i < n; ++i) { cuda_set_device(nets[i].gpu_index); layer l = nets[i].layers[j]; pull_weights(l); @@ -295,7 +317,6 @@ void sync_layer(network *nets, int n, int j) layer l = nets[i].layers[j]; distribute_weights(l, base); } - //printf("Done syncing layer %d\n", j); } typedef struct{ diff --git a/src/option_list.c b/src/option_list.c index f935af301f8..2f52781f809 100644 --- a/src/option_list.c +++ b/src/option_list.c @@ -32,6 +32,23 @@ list *read_data_cfg(char *filename) return options; } +metadata get_metadata(char *file) +{ + metadata m = {0}; + list *options = read_data_cfg(file); + + char *name_list = option_find_str(options, "names", 0); + if(!name_list) name_list = option_find_str(options, "labels", 0); + if(!name_list) { + fprintf(stderr, "No names or labels found\n"); + } else { + m.names = get_labels(name_list); + } + m.classes = option_find_int(options, "classes", 2); + free_list(options); + return m; +} + int read_option(char *s, list *options) { size_t i; diff --git a/src/option_list.h b/src/option_list.h index d0417aa9446..3b8b7da11e2 100644 --- a/src/option_list.h +++ b/src/option_list.h @@ -12,8 +12,6 @@ typedef struct{ int read_option(char *s, list *options); void option_insert(list *l, char *key, char *val); char *option_find(list *l, char *key); -char *option_find_str(list *l, char *key, char *def); -int option_find_int(list *l, char *key, int def); int option_find_int_quiet(list *l, char *key, int def); float option_find_float(list *l, char *key, float def); float option_find_float_quiet(list *l, char *key, float def); diff --git a/src/parser.h b/src/parser.h index 473f21a9dac..81aef2c86f3 100644 --- a/src/parser.h +++ b/src/parser.h @@ -1,13 +1,9 @@ #ifndef PARSER_H #define PARSER_H +#include "darknet.h" #include "network.h" -network parse_network_cfg(char *filename); void save_network(network net, char *filename); -void save_weights(network net, char *filename); -void save_weights_upto(network net, char *filename, int cutoff); void save_weights_double(network net, char *filename); -void load_weights(network *net, char *filename); -void load_weights_upto(network *net, char *filename, int start, int cutoff); #endif diff --git a/src/region_layer.c b/src/region_layer.c index 1f88bf77d69..d2f7302906d 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -445,6 +445,15 @@ void forward_region_layer_gpu(const layer l, network net) } } if (l.softmax_tree){ + int mmin = 9000; + int mmax = 0; + int i; + for(i = 0; i < l.softmax_tree->groups; ++i){ + int group_size = l.softmax_tree->group_size[i]; + if (group_size < mmin) mmin = group_size; + if (group_size > mmax) mmax = group_size; + } + printf("%d %d %d \n", l.softmax_tree->groups, mmin, mmax); int index = entry_index(l, 0, 0, 5); softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); /* diff --git a/src/region_layer.h b/src/region_layer.h index 03b1a3d2d03..f67f9016692 100644 --- a/src/region_layer.h +++ b/src/region_layer.h @@ -1,15 +1,14 @@ #ifndef REGION_LAYER_H #define REGION_LAYER_H +#include "darknet.h" #include "layer.h" #include "network.h" layer make_region_layer(int batch, int h, int w, int n, int classes, int coords); void forward_region_layer(const layer l, network net); void backward_region_layer(const layer l, network net); -void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int relative); void resize_region_layer(layer *l, int w, int h); -void zero_objectness(layer l); #ifdef GPU void forward_region_layer_gpu(const layer l, network net); diff --git a/src/tree.h b/src/tree.h index ec74057b6d7..100858a3819 100644 --- a/src/tree.h +++ b/src/tree.h @@ -3,8 +3,6 @@ #include "darknet.h" tree *read_tree(char *filename); -void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves, int stride); -void change_leaves(tree *t, char *leaf_list); int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int stride); float get_hierarchy_probability(float *x, tree *hier, int c, int stride); diff --git a/src/utils.h b/src/utils.h index 27206533517..1593e62bbdf 100644 --- a/src/utils.h +++ b/src/utils.h @@ -2,18 +2,15 @@ #define UTILS_H #include #include +#include "darknet.h" #include "list.h" -#define SECRET_NUM -1234 #define TWO_PI 6.2831853071795864769252866 double what_time_is_it_now(); -int *read_intlist(char *s, int *n, int d); -int *read_map(char *filename); void shuffle(void *arr, size_t n, size_t size); void sorta_shuffle(void *arr, size_t n, size_t size, size_t sections); void free_ptrs(void **ptrs, int n); -char *basecfg(char *cfgfile); int alphanum_to_int(char c); char int_to_alphanum(int i); int read_int(int fd); @@ -23,43 +20,28 @@ void write_all(int fd, char *buffer, size_t bytes); int read_all_fail(int fd, char *buffer, size_t bytes); int write_all_fail(int fd, char *buffer, size_t bytes); void find_replace(char *str, char *orig, char *rep, char *output); -void error(const char *s); void malloc_error(); void file_error(char *s); void strip(char *s); void strip_char(char *s, char bad); -void top_k(float *a, int n, int k, int *index); list *split_str(char *s, char delim); char *fgetl(FILE *fp); list *parse_csv_line(char *line); char *copy_string(char *s); int count_fields(char *line); float *parse_fields(char *line, int n); -void normalize_array(float *a, int n); void scale_array(float *a, int n, float s); void translate_array(float *a, int n, float s); -int max_index(float *a, int n); float constrain(float min, float max, float a); int constrain_int(int a, int min, int max); -float mse_array(float *a, int n); -float rand_normal(); -size_t rand_size_t(); float rand_uniform(float min, float max); float rand_scale(float s); int rand_int(int min, int max); float sum_array(float *a, int n); -float mean_array(float *a, int n); void mean_arrays(float **a, int n, int els, float *avg); -float variance_array(float *a, int n); -float mag_array(float *a, int n); float dist_array(float *a, float *b, int n, int sub); float **one_hot_encode(float *a, int n, int k); float sec(clock_t clocks); -int find_int_arg(int argc, char **argv, char *arg, int def); -float find_float_arg(int argc, char **argv, char *arg, float def); -int find_arg(int argc, char* argv[], char *arg); -char *find_char_arg(int argc, char **argv, char *arg, char *def); -int sample_array(float *a, int n); void print_statistics(float *a, int n); #endif From c3e0d90e9f6b7034e0230cf80a8a27628227ddfb Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 8 Jun 2017 14:10:11 -0700 Subject: [PATCH 031/118] :skull: :space: --- src/gru_layer.c | 102 ++++++++++++++++----------------- src/lstm_layer.c | 146 +++++++++++++++++++++++------------------------ 2 files changed, 124 insertions(+), 124 deletions(-) diff --git a/src/gru_layer.c b/src/gru_layer.c index 39e8a9b6cfa..f6afa259651 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -156,33 +156,33 @@ void forward_gru_layer_gpu(layer l, network state) for (i = 0; i < l.steps; ++i) { s.input = l.h_gpu; - forward_connected_layer_gpu(uz, s); - forward_connected_layer_gpu(ur, s); + forward_connected_layer_gpu(uz, s); + forward_connected_layer_gpu(ur, s); s.input = state.input; - forward_connected_layer_gpu(wz, s); - forward_connected_layer_gpu(wr, s); - forward_connected_layer_gpu(wh, s); + forward_connected_layer_gpu(wz, s); + forward_connected_layer_gpu(wr, s); + forward_connected_layer_gpu(wh, s); - copy_ongpu(l.outputs*l.batch, wz.output_gpu, 1, l.z_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uz.output_gpu, 1, l.z_gpu, 1); + copy_ongpu(l.outputs*l.batch, wz.output_gpu, 1, l.z_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uz.output_gpu, 1, l.z_gpu, 1); - copy_ongpu(l.outputs*l.batch, wr.output_gpu, 1, l.r_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ur.output_gpu, 1, l.r_gpu, 1); + copy_ongpu(l.outputs*l.batch, wr.output_gpu, 1, l.r_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ur.output_gpu, 1, l.r_gpu, 1); - activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.hh_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.hh_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.hh_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.hh_gpu, 1); s.input = l.hh_gpu; - forward_connected_layer_gpu(uh, s); + forward_connected_layer_gpu(uh, s); - copy_ongpu(l.outputs*l.batch, wh.output_gpu, 1, l.hh_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uh.output_gpu, 1, l.hh_gpu, 1); + copy_ongpu(l.outputs*l.batch, wh.output_gpu, 1, l.hh_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uh.output_gpu, 1, l.hh_gpu, 1); - activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); + activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); weighted_sum_gpu(l.h_gpu, l.hh_gpu, l.z_gpu, l.outputs*l.batch, l.output_gpu); copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.h_gpu, 1); @@ -231,44 +231,44 @@ void backward_gru_layer_gpu(layer l, network state) if (i>0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); l.dh_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; - copy_ongpu(l.outputs*l.batch, wz.output_gpu, 1, l.z_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uz.output_gpu, 1, l.z_gpu, 1); + copy_ongpu(l.outputs*l.batch, wz.output_gpu, 1, l.z_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uz.output_gpu, 1, l.z_gpu, 1); - copy_ongpu(l.outputs*l.batch, wr.output_gpu, 1, l.r_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ur.output_gpu, 1, l.r_gpu, 1); + copy_ongpu(l.outputs*l.batch, wr.output_gpu, 1, l.r_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ur.output_gpu, 1, l.r_gpu, 1); - activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, wh.output_gpu, 1, l.hh_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uh.output_gpu, 1, l.hh_gpu, 1); + copy_ongpu(l.outputs*l.batch, wh.output_gpu, 1, l.hh_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uh.output_gpu, 1, l.hh_gpu, 1); - activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); + activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); - copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); - fill_ongpu(l.outputs*l.batch, 1, l.temp_gpu, 1); - axpy_ongpu(l.outputs*l.batch, -1, l.z_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH, l.temp_gpu); + fill_ongpu(l.outputs*l.batch, 1, l.temp_gpu, 1); + axpy_ongpu(l.outputs*l.batch, -1, l.z_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wh.delta_gpu, 1); s.input = state.input; s.delta = state.delta; backward_connected_layer_gpu(wh, s); - copy_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.temp2_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.temp2_gpu, 1); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uh.delta_gpu, 1); - fill_ongpu(l.outputs*l.batch, 0, l.temp_gpu, 1); + fill_ongpu(l.outputs*l.batch, 0, l.temp_gpu, 1); s.input = l.temp2_gpu; s.delta = l.temp_gpu; - backward_connected_layer_gpu(uh, s); + backward_connected_layer_gpu(uh, s); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp2_gpu, 1); - gradient_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC, l.temp2_gpu); + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp2_gpu, 1); + gradient_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC, l.temp2_gpu); copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, wr.delta_gpu, 1); s.input = state.input; @@ -278,21 +278,21 @@ void backward_gru_layer_gpu(layer l, network state) copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, ur.delta_gpu, 1); s.input = l.prev_state_gpu; s.delta = l.dh_gpu; - backward_connected_layer_gpu(ur, s); + backward_connected_layer_gpu(ur, s); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.temp2_gpu, 1); - if (l.dh_gpu) axpy_ongpu(l.outputs*l.batch, 1, l.temp2_gpu, 1, l.dh_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.temp2_gpu, 1); + if (l.dh_gpu) axpy_ongpu(l.outputs*l.batch, 1, l.temp2_gpu, 1, l.dh_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.z_gpu, 1, l.temp2_gpu, 1); - if (l.dh_gpu) axpy_ongpu(l.outputs*l.batch, 1, l.temp2_gpu, 1, l.dh_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.z_gpu, 1, l.temp2_gpu, 1); + if (l.dh_gpu) axpy_ongpu(l.outputs*l.batch, 1, l.temp2_gpu, 1, l.dh_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp3_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.hh_gpu, 1, l.temp2_gpu, 1); - axpy_ongpu(l.outputs*l.batch, -1, l.temp2_gpu, 1, l.temp3_gpu, 1); - gradient_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, l.temp3_gpu); + copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp3_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.hh_gpu, 1, l.temp2_gpu, 1); + axpy_ongpu(l.outputs*l.batch, -1, l.temp2_gpu, 1, l.temp3_gpu, 1); + gradient_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, l.temp3_gpu); copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, wz.delta_gpu, 1); s.input = state.input; @@ -302,7 +302,7 @@ void backward_gru_layer_gpu(layer l, network state) copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, uz.delta_gpu, 1); s.input = l.prev_state_gpu; s.delta = l.dh_gpu; - backward_connected_layer_gpu(uz, s); + backward_connected_layer_gpu(uz, s); state.input -= l.inputs*l.batch; if (state.delta) state.delta -= l.inputs*l.batch; diff --git a/src/lstm_layer.c b/src/lstm_layer.c index c9975335486..03f258e0187 100644 --- a/src/lstm_layer.c +++ b/src/lstm_layer.c @@ -80,7 +80,7 @@ layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_n l.outputs = outputs; l.output = calloc(outputs*batch*steps, sizeof(float)); - l.state = calloc(outputs*batch, sizeof(float)); + l.state = calloc(outputs*batch, sizeof(float)); l.forward = forward_lstm_layer; l.update = update_lstm_layer; @@ -95,7 +95,7 @@ layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_n l.output_gpu = cuda_make_array(0, batch*outputs*steps); l.cell_gpu = cuda_make_array(0, batch*outputs*steps); - l.delta_gpu = cuda_make_array(0, batch*l.outputs*steps); + l.delta_gpu = cuda_make_array(0, batch*l.outputs*steps); l.f_gpu = cuda_make_array(l.output, batch*outputs); l.i_gpu = cuda_make_array(l.output, batch*outputs); @@ -121,7 +121,7 @@ void forward_lstm_layer(layer l, network state) { } -#ifdef GPU +#ifdef GPU void update_lstm_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) { update_connected_layer_gpu(*(l.wf), batch, learning_rate, momentum, decay); @@ -135,7 +135,7 @@ void update_lstm_layer_gpu(layer l, int batch, float learning_rate, float moment } void forward_lstm_layer_gpu(layer l, network state) -{ +{ network s = { 0 }; s.train = state.train; int i; @@ -159,50 +159,50 @@ void forward_lstm_layer_gpu(layer l, network state) fill_ongpu(l.outputs * l.batch * l.steps, 0, ug.delta_gpu, 1); fill_ongpu(l.outputs * l.batch * l.steps, 0, uo.delta_gpu, 1); if (state.train) { - fill_ongpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); } for (i = 0; i < l.steps; ++i) { s.input = l.h_gpu; - forward_connected_layer_gpu(wf, s); - forward_connected_layer_gpu(wi, s); - forward_connected_layer_gpu(wg, s); - forward_connected_layer_gpu(wo, s); + forward_connected_layer_gpu(wf, s); + forward_connected_layer_gpu(wi, s); + forward_connected_layer_gpu(wg, s); + forward_connected_layer_gpu(wo, s); s.input = state.input; - forward_connected_layer_gpu(uf, s); - forward_connected_layer_gpu(ui, s); - forward_connected_layer_gpu(ug, s); - forward_connected_layer_gpu(uo, s); + forward_connected_layer_gpu(uf, s); + forward_connected_layer_gpu(ui, s); + forward_connected_layer_gpu(ug, s); + forward_connected_layer_gpu(uo, s); - copy_ongpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); + copy_ongpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); - copy_ongpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); + copy_ongpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); - copy_ongpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); + copy_ongpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); - copy_ongpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); + copy_ongpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); - activate_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH); - activate_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH); + activate_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.c_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, l.temp_gpu, 1, l.c_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.c_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, l.temp_gpu, 1, l.c_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.h_gpu, 1); - activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); - mul_ongpu(l.outputs*l.batch, l.o_gpu, 1, l.h_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.h_gpu, 1); + activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); + mul_ongpu(l.outputs*l.batch, l.o_gpu, 1, l.h_gpu, 1); copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.cell_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.output_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.output_gpu, 1); state.input += l.inputs*l.batch; l.output_gpu += l.outputs*l.batch; @@ -217,11 +217,11 @@ void forward_lstm_layer_gpu(layer l, network state) increment_layer(&ui, 1); increment_layer(&ug, 1); increment_layer(&uo, 1); - } + } } void backward_lstm_layer_gpu(layer l, network state) -{ +{ network s = { 0 }; s.train = state.train; int i; @@ -250,9 +250,9 @@ void backward_lstm_layer_gpu(layer l, network state) l.output_gpu += l.outputs*l.batch*(l.steps - 1); l.cell_gpu += l.outputs*l.batch*(l.steps - 1); - l.delta_gpu += l.outputs*l.batch*(l.steps - 1); + l.delta_gpu += l.outputs*l.batch*(l.steps - 1); - for (i = l.steps - 1; i >= 0; --i) { + for (i = l.steps - 1; i >= 0; --i) { if (i != 0) copy_ongpu(l.outputs*l.batch, l.cell_gpu - l.outputs*l.batch, 1, l.prev_cell_gpu, 1); copy_ongpu(l.outputs*l.batch, l.cell_gpu, 1, l.c_gpu, 1); if (i != 0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); @@ -260,38 +260,38 @@ void backward_lstm_layer_gpu(layer l, network state) l.dh_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; - copy_ongpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); + copy_ongpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); - copy_ongpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); + copy_ongpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); - copy_ongpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); + copy_ongpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); - copy_ongpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); + copy_ongpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); - activate_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH); - activate_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH); + activate_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); - activate_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH); + copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); + activate_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH); - copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.o_gpu, 1, l.temp2_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.o_gpu, 1, l.temp2_gpu, 1); - gradient_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH, l.temp2_gpu); - axpy_ongpu(l.outputs*l.batch, 1, l.dc_gpu, 1, l.temp2_gpu, 1); + gradient_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH, l.temp2_gpu); + axpy_ongpu(l.outputs*l.batch, 1, l.dc_gpu, 1, l.temp2_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); - activate_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH); - mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); + activate_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH); + mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wo.delta_gpu, 1); s.input = l.prev_state_gpu; s.delta = l.dh_gpu; @@ -302,9 +302,9 @@ void backward_lstm_layer_gpu(layer l, network state) s.delta = state.delta; backward_connected_layer_gpu(uo, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH, l.temp_gpu); + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wg.delta_gpu, 1); s.input = l.prev_state_gpu; s.delta = l.dh_gpu; @@ -315,9 +315,9 @@ void backward_lstm_layer_gpu(layer l, network state) s.delta = state.delta; backward_connected_layer_gpu(ug, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wi.delta_gpu, 1); s.input = l.prev_state_gpu; s.delta = l.dh_gpu; @@ -328,9 +328,9 @@ void backward_lstm_layer_gpu(layer l, network state) s.delta = state.delta; backward_connected_layer_gpu(ui, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.prev_cell_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.prev_cell_gpu, 1, l.temp_gpu, 1); + gradient_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wf.delta_gpu, 1); s.input = l.prev_state_gpu; s.delta = l.dh_gpu; @@ -341,9 +341,9 @@ void backward_lstm_layer_gpu(layer l, network state) s.delta = state.delta; backward_connected_layer_gpu(uf, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.temp_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.dc_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.temp_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.dc_gpu, 1); state.input -= l.inputs*l.batch; if (state.delta) state.delta -= l.inputs*l.batch; @@ -360,6 +360,6 @@ void backward_lstm_layer_gpu(layer l, network state) increment_layer(&ui, -1); increment_layer(&ug, -1); increment_layer(&uo, -1); - } + } } #endif From d8c5cfd6c6c7dca460c64521358a0d772e5e8d52 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Fri, 9 Jun 2017 16:41:00 -0700 Subject: [PATCH 032/118] :charmandra: :fire: :fire: :fire: --- Makefile | 2 +- cfg/gru.cfg | 19 ++- examples/rnn.c | 6 +- examples/rnn_vid.c | 4 +- include/darknet.h | 24 ++- src/connected_layer.c | 61 ++----- src/cost_layer.c | 2 +- src/cuda.c | 2 +- src/gru_layer.c | 369 +++++++++++++++++++++++++----------------- src/lstm_layer.c | 339 +++++++++++++++++++++++++++++++++----- src/parser.c | 89 +++++----- 11 files changed, 630 insertions(+), 287 deletions(-) diff --git a/Makefile b/Makefile index 62943d6fd76..aab1d08c51f 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ -gencode arch=compute_52,code=[sm_52,compute_52] # This is what I use, uncomment if you know your arch and want to specify -ARCH= -gencode arch=compute_52,code=compute_52 +# ARCH= -gencode arch=compute_52,code=compute_52 VPATH=./src/:./examples LIB=libdarknet.so diff --git a/cfg/gru.cfg b/cfg/gru.cfg index f9a06999e62..76eaf0c6d38 100644 --- a/cfg/gru.cfg +++ b/cfg/gru.cfg @@ -1,27 +1,38 @@ [net] -subdivisions=1 inputs=256 + +# Test batch = 1 +time_steps=1 + +# Train +# batch = 512 +# time_steps=64 + +subdivisions=1 momentum=0.9 decay=0.001 -time_steps=1 -learning_rate=0.5 +learning_rate=0.1 +burn_in=100 policy=poly power=4 -max_batches=2000 +max_batches=10000 [gru] batch_normalize=1 output = 1024 +tanh = 1 [gru] batch_normalize=1 output = 1024 +tanh = 1 [gru] batch_normalize=1 output = 1024 +tanh = 1 [connected] output=256 diff --git a/examples/rnn.c b/examples/rnn.c index 05c8f37b077..197e270d02a 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -150,7 +150,7 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, } int inputs = net.inputs; - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g, Inputs: %d\n", net.learning_rate, net.momentum, net.decay, inputs); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g, Inputs: %d %d %d\n", net.learning_rate, net.momentum, net.decay, inputs, net.batch, net.time_steps); int batch = net.batch; int steps = net.time_steps; if(clear) *net.seen = 0; @@ -174,8 +174,8 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, p = get_rnn_data(text, offsets, inputs, size, streams, steps); } - memcpy(net.input, p.x, net.inputs*net.batch); - memcpy(net.truth, p.y, net.truths*net.batch); + copy_cpu(net.inputs*net.batch, p.x, 1, net.input, 1); + copy_cpu(net.truths*net.batch, p.y, 1, net.truth, 1); float loss = train_network_datum(net) / (batch); free(p.x); free(p.y); diff --git a/examples/rnn_vid.c b/examples/rnn_vid.c index 205f24c014b..e8879235231 100644 --- a/examples/rnn_vid.c +++ b/examples/rnn_vid.c @@ -99,8 +99,8 @@ void train_vid_rnn(char *cfgfile, char *weightfile) time=clock(); float_pair p = get_rnn_vid_data(extractor, paths, N, batch, steps); - memcpy(net.input, p.x, net.inputs*net.batch); - memcpy(net.truth, p.y, net.truths*net.batch); + copy_cpu(net.inputs*net.batch, p.x, 1, net.input, 1); + copy_cpu(net.truths*net.batch, p.y, 1, net.truth, 1); float loss = train_network_datum(net) / (net.batch); diff --git a/include/darknet.h b/include/darknet.h index d5088f6cccb..269f216e99b 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -154,6 +154,7 @@ struct layer{ int noadjust; int reorg; int log; + int tanh; int adam; float B1; @@ -237,9 +238,26 @@ struct layer{ float * scale_m; float * scale_v; - float * z_cpu; - float * r_cpu; - float * h_cpu; + + float *z_cpu; + float *r_cpu; + float *h_cpu; + float * prev_state_cpu; + + float *temp_cpu; + float *temp2_cpu; + float *temp3_cpu; + + float *dh_cpu; + float *hh_cpu; + float *prev_cell_cpu; + float *cell_cpu; + float *f_cpu; + float *i_cpu; + float *g_cpu; + float *o_cpu; + float *c_cpu; + float *dc_cpu; float * binary_input; diff --git a/src/connected_layer.c b/src/connected_layer.c index f8c74235327..38c492cb784 100644 --- a/src/connected_layer.c +++ b/src/connected_layer.c @@ -1,4 +1,5 @@ #include "connected_layer.h" +#include "convolutional_layer.h" #include "batchnorm_layer.h" #include "utils.h" #include "cuda.h" @@ -83,9 +84,6 @@ connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVAT l.output_gpu = cuda_make_array(l.output, outputs*batch); l.delta_gpu = cuda_make_array(l.delta, outputs*batch); if(batch_normalize){ - l.scales_gpu = cuda_make_array(l.scales, outputs); - l.scale_updates_gpu = cuda_make_array(l.scale_updates, outputs); - l.mean_gpu = cuda_make_array(l.mean, outputs); l.variance_gpu = cuda_make_array(l.variance, outputs); @@ -95,6 +93,9 @@ connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVAT l.mean_delta_gpu = cuda_make_array(l.mean, outputs); l.variance_delta_gpu = cuda_make_array(l.variance, outputs); + l.scales_gpu = cuda_make_array(l.scales, outputs); + l.scale_updates_gpu = cuda_make_array(l.scale_updates, outputs); + l.x_gpu = cuda_make_array(l.output, l.batch*outputs); l.x_norm_gpu = cuda_make_array(l.output, l.batch*outputs); #ifdef CUDNN @@ -127,7 +128,6 @@ void update_connected_layer(connected_layer l, int batch, float learning_rate, f void forward_connected_layer(connected_layer l, network net) { - int i; fill_cpu(l.outputs*l.batch, 0, l.output, 1); int m = l.batch; int k = l.inputs; @@ -137,44 +137,21 @@ void forward_connected_layer(connected_layer l, network net) float *c = l.output; gemm(0,1,m,n,k,1,a,k,b,k,1,c,n); if(l.batch_normalize){ - if(net.train){ - mean_cpu(l.output, l.batch, l.outputs, 1, l.mean); - variance_cpu(l.output, l.mean, l.batch, l.outputs, 1, l.variance); - - scal_cpu(l.outputs, .95, l.rolling_mean, 1); - axpy_cpu(l.outputs, .05, l.mean, 1, l.rolling_mean, 1); - scal_cpu(l.outputs, .95, l.rolling_variance, 1); - axpy_cpu(l.outputs, .05, l.variance, 1, l.rolling_variance, 1); - - copy_cpu(l.outputs*l.batch, l.output, 1, l.x, 1); - normalize_cpu(l.output, l.mean, l.variance, l.batch, l.outputs, 1); - copy_cpu(l.outputs*l.batch, l.output, 1, l.x_norm, 1); - } else { - normalize_cpu(l.output, l.rolling_mean, l.rolling_variance, l.batch, l.outputs, 1); - } - scale_bias(l.output, l.scales, l.batch, l.outputs, 1); - } - for(i = 0; i < l.batch; ++i){ - axpy_cpu(l.outputs, 1, l.biases, 1, l.output + i*l.outputs, 1); + forward_batchnorm_layer(l, net); + } else { + add_bias(l.output, l.biases, l.batch, l.outputs, 1); } activate_array(l.output, l.outputs*l.batch, l.activation); } void backward_connected_layer(connected_layer l, network net) { - int i; gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta); - for(i = 0; i < l.batch; ++i){ - axpy_cpu(l.outputs, 1, l.delta + i*l.outputs, 1, l.bias_updates, 1); - } - if(l.batch_normalize){ - backward_scale_cpu(l.x_norm, l.delta, l.batch, l.outputs, 1, l.scale_updates); - - scale_bias(l.delta, l.scales, l.batch, l.outputs, 1); - mean_delta_cpu(l.delta, l.variance, l.batch, l.outputs, 1, l.mean_delta); - variance_delta_cpu(l.x, l.delta, l.mean, l.variance, l.batch, l.outputs, 1, l.variance_delta); - normalize_delta_cpu(l.x, l.mean, l.variance, l.mean_delta, l.variance_delta, l.batch, l.outputs, 1, l.delta); + if(l.batch_normalize){ + backward_batchnorm_layer(l, net); + } else { + backward_bias(l.bias_updates, l.delta, l.batch, l.outputs, 1); } int m = l.outputs; @@ -276,7 +253,6 @@ void update_connected_layer_gpu(connected_layer l, int batch, float learning_rat void forward_connected_layer_gpu(connected_layer l, network net) { - int i; fill_ongpu(l.outputs*l.batch, 0, l.output_gpu, 1); int m = l.batch; @@ -286,26 +262,23 @@ void forward_connected_layer_gpu(connected_layer l, network net) float * b = l.weights_gpu; float * c = l.output_gpu; gemm_ongpu(0,1,m,n,k,1,a,k,b,k,1,c,n); - if(l.batch_normalize){ + + if (l.batch_normalize) { forward_batchnorm_layer_gpu(l, net); - } - for(i = 0; i < l.batch; ++i){ - axpy_ongpu(l.outputs, 1, l.biases_gpu, 1, l.output_gpu + i*l.outputs, 1); + } else { + add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.outputs, 1); } activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); } void backward_connected_layer_gpu(connected_layer l, network net) { - int i; constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); - for(i = 0; i < l.batch; ++i){ - axpy_ongpu(l.outputs, 1, l.delta_gpu + i*l.outputs, 1, l.bias_updates_gpu, 1); - } - if(l.batch_normalize){ backward_batchnorm_layer_gpu(l, net); + } else { + backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.outputs, 1); } int m = l.outputs; diff --git a/src/cost_layer.c b/src/cost_layer.c index 76c001f0363..83e258b9035 100644 --- a/src/cost_layer.c +++ b/src/cost_layer.c @@ -120,7 +120,7 @@ int float_abs_compare (const void * a, const void * b) void forward_cost_layer_gpu(cost_layer l, network net) { - if (!net.truth) return; + if (!net.truth_gpu) return; if(l.smooth){ scal_ongpu(l.batch*l.inputs, (1-l.smooth), net.truth_gpu, 1); add_ongpu(l.batch*l.inputs, l.smooth * 1./l.inputs, net.truth_gpu, 1); diff --git a/src/cuda.c b/src/cuda.c index e511403776f..48199743dc3 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -26,7 +26,7 @@ int cuda_get_device() void check_error(cudaError_t status) { - //cudaDeviceSynchronize(); + cudaDeviceSynchronize(); cudaError_t status2 = cudaGetLastError(); if (status != cudaSuccess) { diff --git a/src/gru_layer.c b/src/gru_layer.c index f6afa259651..e07cb877323 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -30,47 +30,67 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_no { fprintf(stderr, "GRU Layer: %d inputs, %d outputs\n", inputs, outputs); batch = batch / steps; - layer l = { 0 }; + layer l = {0}; l.batch = batch; l.type = GRU; l.steps = steps; l.inputs = inputs; + l.uz = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.uz) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.uz->batch = batch; + l.wz = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wz) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.wz) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); l.wz->batch = batch; - l.uz = malloc(sizeof(layer)); + l.ur = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.uz) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); - l.uz->batch = batch; + *(l.ur) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.ur->batch = batch; l.wr = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wr) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.wr) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); l.wr->batch = batch; - l.ur = malloc(sizeof(layer)); + + + l.uh = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.ur) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); - l.ur->batch = batch; + *(l.uh) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + l.uh->batch = batch; l.wh = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wh) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.wh) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); l.wh->batch = batch; - l.uh = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.uh) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); - l.uh->batch = batch; +#ifdef CUDNN + cudnnSetTensor4dDescriptor(l.uz->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.uz->out_c, l.uz->out_h, l.uz->out_w); + cudnnSetTensor4dDescriptor(l.uh->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.uh->out_c, l.uh->out_h, l.uh->out_w); + cudnnSetTensor4dDescriptor(l.ur->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.ur->out_c, l.ur->out_h, l.ur->out_w); + cudnnSetTensor4dDescriptor(l.wz->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wz->out_c, l.wz->out_h, l.wz->out_w); + cudnnSetTensor4dDescriptor(l.wh->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wh->out_c, l.wh->out_h, l.wh->out_w); + cudnnSetTensor4dDescriptor(l.wr->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wr->out_c, l.wr->out_h, l.wr->out_w); +#endif l.batch_normalize = batch_normalize; - l.outputs = outputs; + + l.outputs = outputs; l.output = calloc(outputs*batch*steps, sizeof(float)); + l.delta = calloc(outputs*batch*steps, sizeof(float)); l.state = calloc(outputs*batch, sizeof(float)); + l.prev_state = calloc(outputs*batch, sizeof(float)); + l.forgot_state = calloc(outputs*batch, sizeof(float)); + l.forgot_delta = calloc(outputs*batch, sizeof(float)); + + l.r_cpu = calloc(outputs*batch, sizeof(float)); + l.z_cpu = calloc(outputs*batch, sizeof(float)); + l.h_cpu = calloc(outputs*batch, sizeof(float)); l.forward = forward_gru_layer; l.backward = backward_gru_layer; @@ -81,31 +101,104 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_no l.backward_gpu = backward_gru_layer_gpu; l.update_gpu = update_gru_layer_gpu; + l.forgot_state_gpu = cuda_make_array(0, batch*outputs); + l.forgot_delta_gpu = cuda_make_array(0, batch*outputs); l.prev_state_gpu = cuda_make_array(0, batch*outputs); + l.state_gpu = cuda_make_array(0, batch*outputs); l.output_gpu = cuda_make_array(0, batch*outputs*steps); l.delta_gpu = cuda_make_array(0, batch*outputs*steps); - - l.r_gpu = cuda_make_array(l.output, batch*outputs); - l.z_gpu = cuda_make_array(l.output, batch*outputs); - l.hh_gpu = cuda_make_array(l.output, batch*outputs); - l.h_gpu = cuda_make_array(l.output, batch*outputs); - l.temp_gpu = cuda_make_array(l.output, batch*outputs); - l.temp2_gpu = cuda_make_array(l.output, batch*outputs); - l.temp3_gpu = cuda_make_array(l.output, batch*outputs); - l.dh_gpu = cuda_make_array(l.output, batch*outputs); + l.r_gpu = cuda_make_array(0, batch*outputs); + l.z_gpu = cuda_make_array(0, batch*outputs); + l.h_gpu = cuda_make_array(0, batch*outputs); #endif + return l; } void update_gru_layer(layer l, int batch, float learning_rate, float momentum, float decay) { + update_connected_layer(*(l.input_layer), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.self_layer), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.output_layer), batch, learning_rate, momentum, decay); } -void forward_gru_layer(layer l, network state) +void forward_gru_layer(layer l, network net) { + network s = net; + s.train = net.train; + int i; + layer uz = *(l.uz); + layer ur = *(l.ur); + layer uh = *(l.uh); + + layer wz = *(l.wz); + layer wr = *(l.wr); + layer wh = *(l.wh); + + fill_cpu(l.outputs * l.batch * l.steps, 0, uz.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, ur.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, uh.delta, 1); + + fill_cpu(l.outputs * l.batch * l.steps, 0, wz.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, wr.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, wh.delta, 1); + if(net.train) { + fill_cpu(l.outputs * l.batch * l.steps, 0, l.delta, 1); + copy_cpu(l.outputs*l.batch, l.state, 1, l.prev_state, 1); + } + + for (i = 0; i < l.steps; ++i) { + s.input = l.state; + forward_connected_layer(wz, s); + forward_connected_layer(wr, s); + + s.input = net.input; + forward_connected_layer(uz, s); + forward_connected_layer(ur, s); + forward_connected_layer(uh, s); + + + copy_cpu(l.outputs*l.batch, uz.output, 1, l.z_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, wz.output, 1, l.z_cpu, 1); + + copy_cpu(l.outputs*l.batch, ur.output, 1, l.r_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, wr.output, 1, l.r_cpu, 1); + + activate_array(l.z_cpu, l.outputs*l.batch, LOGISTIC); + activate_array(l.r_cpu, l.outputs*l.batch, LOGISTIC); + + copy_cpu(l.outputs*l.batch, l.state, 1, l.forgot_state, 1); + mul_cpu(l.outputs*l.batch, l.r_cpu, 1, l.forgot_state, 1); + + s.input = l.forgot_state; + forward_connected_layer(wh, s); + + copy_cpu(l.outputs*l.batch, uh.output, 1, l.h_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, wh.output, 1, l.h_cpu, 1); + + if(l.tanh){ + activate_array(l.h_cpu, l.outputs*l.batch, TANH); + } else { + activate_array(l.h_cpu, l.outputs*l.batch, LOGISTIC); + } + + weighted_sum_cpu(l.state, l.h_cpu, l.z_cpu, l.outputs*l.batch, l.output); + + copy_cpu(l.outputs*l.batch, l.output, 1, l.state, 1); + + net.input += l.inputs*l.batch; + l.output += l.outputs*l.batch; + increment_layer(&uz, 1); + increment_layer(&ur, 1); + increment_layer(&uh, 1); + + increment_layer(&wz, 1); + increment_layer(&wr, 1); + increment_layer(&wh, 1); + } } -void backward_gru_layer(layer l, network state) +void backward_gru_layer(layer l, network net) { } @@ -121,201 +214,187 @@ void push_gru_layer(layer l) void update_gru_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) { - update_connected_layer_gpu(*(l.wr), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.wz), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.wh), batch, learning_rate, momentum, decay); update_connected_layer_gpu(*(l.ur), batch, learning_rate, momentum, decay); update_connected_layer_gpu(*(l.uz), batch, learning_rate, momentum, decay); update_connected_layer_gpu(*(l.uh), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wr), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wz), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wh), batch, learning_rate, momentum, decay); } -void forward_gru_layer_gpu(layer l, network state) +void forward_gru_layer_gpu(layer l, network net) { - network s = { 0 }; - s.train = state.train; + network s = {0}; + s.train = net.train; int i; - layer wz = *(l.wz); - layer wr = *(l.wr); - layer wh = *(l.wh); - layer uz = *(l.uz); layer ur = *(l.ur); layer uh = *(l.uh); - fill_ongpu(l.outputs * l.batch * l.steps, 0, wz.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, wr.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, wh.delta_gpu, 1); + layer wz = *(l.wz); + layer wr = *(l.wr); + layer wh = *(l.wh); fill_ongpu(l.outputs * l.batch * l.steps, 0, uz.delta_gpu, 1); fill_ongpu(l.outputs * l.batch * l.steps, 0, ur.delta_gpu, 1); fill_ongpu(l.outputs * l.batch * l.steps, 0, uh.delta_gpu, 1); - if (state.train) { + fill_ongpu(l.outputs * l.batch * l.steps, 0, wz.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, wr.delta_gpu, 1); + fill_ongpu(l.outputs * l.batch * l.steps, 0, wh.delta_gpu, 1); + if(net.train) { fill_ongpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.state_gpu, 1, l.prev_state_gpu, 1); } for (i = 0; i < l.steps; ++i) { - s.input = l.h_gpu; - forward_connected_layer_gpu(uz, s); - forward_connected_layer_gpu(ur, s); + s.input_gpu = l.state_gpu; + forward_connected_layer_gpu(wz, s); + forward_connected_layer_gpu(wr, s); - s.input = state.input; - forward_connected_layer_gpu(wz, s); - forward_connected_layer_gpu(wr, s); - forward_connected_layer_gpu(wh, s); + s.input_gpu = net.input_gpu; + forward_connected_layer_gpu(uz, s); + forward_connected_layer_gpu(ur, s); + forward_connected_layer_gpu(uh, s); - copy_ongpu(l.outputs*l.batch, wz.output_gpu, 1, l.z_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uz.output_gpu, 1, l.z_gpu, 1); + copy_ongpu(l.outputs*l.batch, uz.output_gpu, 1, l.z_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, wz.output_gpu, 1, l.z_gpu, 1); - copy_ongpu(l.outputs*l.batch, wr.output_gpu, 1, l.r_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ur.output_gpu, 1, l.r_gpu, 1); + copy_ongpu(l.outputs*l.batch, ur.output_gpu, 1, l.r_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, wr.output_gpu, 1, l.r_gpu, 1); - activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.hh_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.hh_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.state_gpu, 1, l.forgot_state_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.forgot_state_gpu, 1); - s.input = l.hh_gpu; - forward_connected_layer_gpu(uh, s); + s.input_gpu = l.forgot_state_gpu; + forward_connected_layer_gpu(wh, s); - copy_ongpu(l.outputs*l.batch, wh.output_gpu, 1, l.hh_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uh.output_gpu, 1, l.hh_gpu, 1); + copy_ongpu(l.outputs*l.batch, uh.output_gpu, 1, l.h_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, wh.output_gpu, 1, l.h_gpu, 1); - activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); + if(l.tanh){ + activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); + } else { + activate_array_ongpu(l.h_gpu, l.outputs*l.batch, LOGISTIC); + } - weighted_sum_gpu(l.h_gpu, l.hh_gpu, l.z_gpu, l.outputs*l.batch, l.output_gpu); - copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.h_gpu, 1); + weighted_sum_gpu(l.state_gpu, l.h_gpu, l.z_gpu, l.outputs*l.batch, l.output_gpu); + copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.state_gpu, 1); - state.input += l.inputs*l.batch; + net.input_gpu += l.inputs*l.batch; l.output_gpu += l.outputs*l.batch; + increment_layer(&uz, 1); + increment_layer(&ur, 1); + increment_layer(&uh, 1); increment_layer(&wz, 1); increment_layer(&wr, 1); increment_layer(&wh, 1); - - increment_layer(&uz, 1); - increment_layer(&ur, 1); - increment_layer(&uh, 1); } } -void backward_gru_layer_gpu(layer l, network state) +void backward_gru_layer_gpu(layer l, network net) { - network s = { 0 }; - s.train = state.train; + network s = {0}; + s.train = net.train; int i; + layer uz = *(l.uz); + layer ur = *(l.ur); + layer uh = *(l.uh); + layer wz = *(l.wz); layer wr = *(l.wr); layer wh = *(l.wh); - layer uz = *(l.uz); - layer ur = *(l.ur); - layer uh = *(l.uh); + increment_layer(&uz, l.steps - 1); + increment_layer(&ur, l.steps - 1); + increment_layer(&uh, l.steps - 1); increment_layer(&wz, l.steps - 1); increment_layer(&wr, l.steps - 1); increment_layer(&wh, l.steps - 1); - increment_layer(&uz, l.steps - 1); - increment_layer(&ur, l.steps - 1); - increment_layer(&uh, l.steps - 1); + net.input_gpu += l.inputs*l.batch*(l.steps-1); + if(net.delta_gpu) net.delta_gpu += l.inputs*l.batch*(l.steps-1); + l.output_gpu += l.outputs*l.batch*(l.steps-1); + l.delta_gpu += l.outputs*l.batch*(l.steps-1); + for (i = l.steps-1; i >= 0; --i) { + if(i != 0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); + float *prev_delta_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; - state.input += l.inputs*l.batch*(l.steps - 1); - if (state.delta) state.delta += l.inputs*l.batch*(l.steps - 1); + copy_ongpu(l.outputs*l.batch, uz.output_gpu, 1, l.z_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, wz.output_gpu, 1, l.z_gpu, 1); - l.output_gpu += l.outputs*l.batch*(l.steps - 1); - l.delta_gpu += l.outputs*l.batch*(l.steps - 1); + copy_ongpu(l.outputs*l.batch, ur.output_gpu, 1, l.r_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, wr.output_gpu, 1, l.r_gpu, 1); - for (i = l.steps - 1; i >= 0; --i) { - if (i>0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); - l.dh_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; + activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, wz.output_gpu, 1, l.z_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uz.output_gpu, 1, l.z_gpu, 1); + copy_ongpu(l.outputs*l.batch, uh.output_gpu, 1, l.h_gpu, 1); + axpy_ongpu(l.outputs*l.batch, 1, wh.output_gpu, 1, l.h_gpu, 1); - copy_ongpu(l.outputs*l.batch, wr.output_gpu, 1, l.r_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ur.output_gpu, 1, l.r_gpu, 1); + if(l.tanh){ + activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); + } else { + activate_array_ongpu(l.h_gpu, l.outputs*l.batch, LOGISTIC); + } - activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); + weighted_delta_gpu(l.prev_state_gpu, l.h_gpu, l.z_gpu, prev_delta_gpu, uh.delta_gpu, uz.delta_gpu, l.outputs*l.batch, l.delta_gpu); - copy_ongpu(l.outputs*l.batch, wh.output_gpu, 1, l.hh_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uh.output_gpu, 1, l.hh_gpu, 1); + if(l.tanh){ + gradient_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH, uh.delta_gpu); + } else { + gradient_array_ongpu(l.h_gpu, l.outputs*l.batch, LOGISTIC, uh.delta_gpu); + } - activate_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH); + copy_ongpu(l.outputs*l.batch, uh.delta_gpu, 1, wh.delta_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); + copy_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.forgot_state_gpu, 1); + mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.forgot_state_gpu, 1); + fill_ongpu(l.outputs*l.batch, 0, l.forgot_delta_gpu, 1); - fill_ongpu(l.outputs*l.batch, 1, l.temp_gpu, 1); - axpy_ongpu(l.outputs*l.batch, -1, l.z_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.hh_gpu, l.outputs*l.batch, TANH, l.temp_gpu); + s.input_gpu = l.forgot_state_gpu; + s.delta_gpu = l.forgot_delta_gpu; - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wh.delta_gpu, 1); - s.input = state.input; - s.delta = state.delta; backward_connected_layer_gpu(wh, s); + if(prev_delta_gpu) mult_add_into_gpu(l.outputs*l.batch, l.forgot_delta_gpu, l.r_gpu, prev_delta_gpu); + mult_add_into_gpu(l.outputs*l.batch, l.forgot_delta_gpu, l.prev_state_gpu, ur.delta_gpu); - copy_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.temp2_gpu, 1); + gradient_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC, ur.delta_gpu); + copy_ongpu(l.outputs*l.batch, ur.delta_gpu, 1, wr.delta_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uh.delta_gpu, 1); - fill_ongpu(l.outputs*l.batch, 0, l.temp_gpu, 1); - s.input = l.temp2_gpu; - s.delta = l.temp_gpu; - backward_connected_layer_gpu(uh, s); + gradient_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, uz.delta_gpu); + copy_ongpu(l.outputs*l.batch, uz.delta_gpu, 1, wz.delta_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp2_gpu, 1); - gradient_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC, l.temp2_gpu); + s.input_gpu = l.prev_state_gpu; + s.delta_gpu = prev_delta_gpu; - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, wr.delta_gpu, 1); - s.input = state.input; - s.delta = state.delta; backward_connected_layer_gpu(wr, s); + backward_connected_layer_gpu(wz, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, ur.delta_gpu, 1); - s.input = l.prev_state_gpu; - s.delta = l.dh_gpu; - backward_connected_layer_gpu(ur, s); - - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.temp2_gpu, 1); - if (l.dh_gpu) axpy_ongpu(l.outputs*l.batch, 1, l.temp2_gpu, 1, l.dh_gpu, 1); - - copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.z_gpu, 1, l.temp2_gpu, 1); - if (l.dh_gpu) axpy_ongpu(l.outputs*l.batch, 1, l.temp2_gpu, 1, l.dh_gpu, 1); - - copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.temp3_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.hh_gpu, 1, l.temp2_gpu, 1); - axpy_ongpu(l.outputs*l.batch, -1, l.temp2_gpu, 1, l.temp3_gpu, 1); - gradient_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, l.temp3_gpu); + s.input_gpu = net.input_gpu; + s.delta_gpu = net.delta_gpu; - copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, wz.delta_gpu, 1); - s.input = state.input; - s.delta = state.delta; - backward_connected_layer_gpu(wz, s); + backward_connected_layer_gpu(uh, s); + backward_connected_layer_gpu(ur, s); + backward_connected_layer_gpu(uz, s); - copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, uz.delta_gpu, 1); - s.input = l.prev_state_gpu; - s.delta = l.dh_gpu; - backward_connected_layer_gpu(uz, s); - state.input -= l.inputs*l.batch; - if (state.delta) state.delta -= l.inputs*l.batch; + net.input_gpu -= l.inputs*l.batch; + if(net.delta_gpu) net.delta_gpu -= l.inputs*l.batch; l.output_gpu -= l.outputs*l.batch; l.delta_gpu -= l.outputs*l.batch; + increment_layer(&uz, -1); + increment_layer(&ur, -1); + increment_layer(&uh, -1); increment_layer(&wz, -1); increment_layer(&wr, -1); increment_layer(&wh, -1); - - increment_layer(&uz, -1); - increment_layer(&ur, -1); - increment_layer(&uh, -1); } } #endif diff --git a/src/lstm_layer.c b/src/lstm_layer.c index 03f258e0187..74f6a136204 100644 --- a/src/lstm_layer.c +++ b/src/lstm_layer.c @@ -85,29 +85,57 @@ layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_n l.forward = forward_lstm_layer; l.update = update_lstm_layer; + l.prev_state_cpu = calloc(batch*outputs, sizeof(float)); + l.prev_cell_cpu = calloc(batch*outputs, sizeof(float)); + l.cell_cpu = calloc(batch*outputs*steps, sizeof(float)); + + l.f_cpu = calloc(batch*outputs, sizeof(float)); + l.i_cpu = calloc(batch*outputs, sizeof(float)); + l.g_cpu = calloc(batch*outputs, sizeof(float)); + l.o_cpu = calloc(batch*outputs, sizeof(float)); + l.c_cpu = calloc(batch*outputs, sizeof(float)); + l.h_cpu = calloc(batch*outputs, sizeof(float)); + l.temp_cpu = calloc(batch*outputs, sizeof(float)); + l.temp2_cpu = calloc(batch*outputs, sizeof(float)); + l.temp3_cpu = calloc(batch*outputs, sizeof(float)); + l.dc_cpu = calloc(batch*outputs, sizeof(float)); + l.dh_cpu = calloc(batch*outputs, sizeof(float)); + #ifdef GPU l.forward_gpu = forward_lstm_layer_gpu; l.backward_gpu = backward_lstm_layer_gpu; l.update_gpu = update_lstm_layer_gpu; + l.output_gpu = cuda_make_array(0, batch*outputs*steps); + l.delta_gpu = cuda_make_array(0, batch*l.outputs*steps); + l.prev_state_gpu = cuda_make_array(0, batch*outputs); l.prev_cell_gpu = cuda_make_array(0, batch*outputs); - - l.output_gpu = cuda_make_array(0, batch*outputs*steps); l.cell_gpu = cuda_make_array(0, batch*outputs*steps); - l.delta_gpu = cuda_make_array(0, batch*l.outputs*steps); - l.f_gpu = cuda_make_array(l.output, batch*outputs); - l.i_gpu = cuda_make_array(l.output, batch*outputs); - l.g_gpu = cuda_make_array(l.output, batch*outputs); - l.o_gpu = cuda_make_array(l.output, batch*outputs); - l.c_gpu = cuda_make_array(l.output, batch*outputs); - l.h_gpu = cuda_make_array(l.output, batch*outputs); - l.temp_gpu = cuda_make_array(l.output, batch*outputs); - l.temp2_gpu = cuda_make_array(l.output, batch*outputs); - l.temp3_gpu = cuda_make_array(l.output, batch*outputs); - l.dc_gpu = cuda_make_array(l.output, batch*outputs); - l.dh_gpu = cuda_make_array(l.output, batch*outputs); + l.f_gpu = cuda_make_array(0, batch*outputs); + l.i_gpu = cuda_make_array(0, batch*outputs); + l.g_gpu = cuda_make_array(0, batch*outputs); + l.o_gpu = cuda_make_array(0, batch*outputs); + l.c_gpu = cuda_make_array(0, batch*outputs); + l.h_gpu = cuda_make_array(0, batch*outputs); + l.temp_gpu = cuda_make_array(0, batch*outputs); + l.temp2_gpu = cuda_make_array(0, batch*outputs); + l.temp3_gpu = cuda_make_array(0, batch*outputs); + l.dc_gpu = cuda_make_array(0, batch*outputs); + l.dh_gpu = cuda_make_array(0, batch*outputs); +#ifdef CUDNN + cudnnSetTensor4dDescriptor(l.wf->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wf->out_c, l.wf->out_h, l.wf->out_w); + cudnnSetTensor4dDescriptor(l.wi->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wi->out_c, l.wi->out_h, l.wi->out_w); + cudnnSetTensor4dDescriptor(l.wg->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wg->out_c, l.wg->out_h, l.wg->out_w); + cudnnSetTensor4dDescriptor(l.wo->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wo->out_c, l.wo->out_h, l.wo->out_w); + + cudnnSetTensor4dDescriptor(l.uf->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.uf->out_c, l.uf->out_h, l.uf->out_w); + cudnnSetTensor4dDescriptor(l.ui->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.ui->out_c, l.ui->out_h, l.ui->out_w); + cudnnSetTensor4dDescriptor(l.ug->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.ug->out_c, l.ug->out_h, l.ug->out_w); + cudnnSetTensor4dDescriptor(l.uo->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.uo->out_c, l.uo->out_h, l.uo->out_w); +#endif + #endif return l; @@ -115,10 +143,243 @@ layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_n void update_lstm_layer(layer l, int batch, float learning_rate, float momentum, float decay) { + update_connected_layer(*(l.wf), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.wi), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.wg), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.wo), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.uf), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.ui), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.ug), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.uo), batch, learning_rate, momentum, decay); } void forward_lstm_layer(layer l, network state) { + network s = { 0 }; + s.train = state.train; + int i; + layer wf = *(l.wf); + layer wi = *(l.wi); + layer wg = *(l.wg); + layer wo = *(l.wo); + + layer uf = *(l.uf); + layer ui = *(l.ui); + layer ug = *(l.ug); + layer uo = *(l.uo); + + fill_cpu(l.outputs * l.batch * l.steps, 0, wf.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, wi.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, wg.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, wo.delta, 1); + + fill_cpu(l.outputs * l.batch * l.steps, 0, uf.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, ui.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, ug.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, uo.delta, 1); + if (state.train) { + fill_cpu(l.outputs * l.batch * l.steps, 0, l.delta, 1); + } + + for (i = 0; i < l.steps; ++i) { + s.input = l.h_cpu; + forward_connected_layer(wf, s); + forward_connected_layer(wi, s); + forward_connected_layer(wg, s); + forward_connected_layer(wo, s); + + s.input = state.input; + forward_connected_layer(uf, s); + forward_connected_layer(ui, s); + forward_connected_layer(ug, s); + forward_connected_layer(uo, s); + + copy_cpu(l.outputs*l.batch, wf.output, 1, l.f_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, uf.output, 1, l.f_cpu, 1); + + copy_cpu(l.outputs*l.batch, wi.output, 1, l.i_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, ui.output, 1, l.i_cpu, 1); + + copy_cpu(l.outputs*l.batch, wg.output, 1, l.g_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, ug.output, 1, l.g_cpu, 1); + + copy_cpu(l.outputs*l.batch, wo.output, 1, l.o_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, uo.output, 1, l.o_cpu, 1); + + activate_array(l.f_cpu, l.outputs*l.batch, LOGISTIC); + activate_array(l.i_cpu, l.outputs*l.batch, LOGISTIC); + activate_array(l.g_cpu, l.outputs*l.batch, TANH); + activate_array(l.o_cpu, l.outputs*l.batch, LOGISTIC); + + copy_cpu(l.outputs*l.batch, l.i_cpu, 1, l.temp_cpu, 1); + mul_cpu(l.outputs*l.batch, l.g_cpu, 1, l.temp_cpu, 1); + mul_cpu(l.outputs*l.batch, l.f_cpu, 1, l.c_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, l.temp_cpu, 1, l.c_cpu, 1); + + copy_cpu(l.outputs*l.batch, l.c_cpu, 1, l.h_cpu, 1); + activate_array(l.h_cpu, l.outputs*l.batch, TANH); + mul_cpu(l.outputs*l.batch, l.o_cpu, 1, l.h_cpu, 1); + + copy_cpu(l.outputs*l.batch, l.c_cpu, 1, l.cell_cpu, 1); + copy_cpu(l.outputs*l.batch, l.h_cpu, 1, l.output, 1); + + state.input += l.inputs*l.batch; + l.output += l.outputs*l.batch; + l.cell_cpu += l.outputs*l.batch; + + increment_layer(&wf, 1); + increment_layer(&wi, 1); + increment_layer(&wg, 1); + increment_layer(&wo, 1); + + increment_layer(&uf, 1); + increment_layer(&ui, 1); + increment_layer(&ug, 1); + increment_layer(&uo, 1); + } +} + +void backward_lstm_layer(layer l, network state) +{ + network s = { 0 }; + s.train = state.train; + int i; + layer wf = *(l.wf); + layer wi = *(l.wi); + layer wg = *(l.wg); + layer wo = *(l.wo); + + layer uf = *(l.uf); + layer ui = *(l.ui); + layer ug = *(l.ug); + layer uo = *(l.uo); + + increment_layer(&wf, l.steps - 1); + increment_layer(&wi, l.steps - 1); + increment_layer(&wg, l.steps - 1); + increment_layer(&wo, l.steps - 1); + + increment_layer(&uf, l.steps - 1); + increment_layer(&ui, l.steps - 1); + increment_layer(&ug, l.steps - 1); + increment_layer(&uo, l.steps - 1); + + state.input += l.inputs*l.batch*(l.steps - 1); + if (state.delta) state.delta += l.inputs*l.batch*(l.steps - 1); + + l.output += l.outputs*l.batch*(l.steps - 1); + l.cell_cpu += l.outputs*l.batch*(l.steps - 1); + l.delta += l.outputs*l.batch*(l.steps - 1); + + for (i = l.steps - 1; i >= 0; --i) { + if (i != 0) copy_cpu(l.outputs*l.batch, l.cell_cpu - l.outputs*l.batch, 1, l.prev_cell_cpu, 1); + copy_cpu(l.outputs*l.batch, l.cell_cpu, 1, l.c_cpu, 1); + if (i != 0) copy_cpu(l.outputs*l.batch, l.output - l.outputs*l.batch, 1, l.prev_state_cpu, 1); + copy_cpu(l.outputs*l.batch, l.output, 1, l.h_cpu, 1); + + l.dh_cpu = (i == 0) ? 0 : l.delta - l.outputs*l.batch; + + copy_cpu(l.outputs*l.batch, wf.output, 1, l.f_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, uf.output, 1, l.f_cpu, 1); + + copy_cpu(l.outputs*l.batch, wi.output, 1, l.i_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, ui.output, 1, l.i_cpu, 1); + + copy_cpu(l.outputs*l.batch, wg.output, 1, l.g_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, ug.output, 1, l.g_cpu, 1); + + copy_cpu(l.outputs*l.batch, wo.output, 1, l.o_cpu, 1); + axpy_cpu(l.outputs*l.batch, 1, uo.output, 1, l.o_cpu, 1); + + activate_array(l.f_cpu, l.outputs*l.batch, LOGISTIC); + activate_array(l.i_cpu, l.outputs*l.batch, LOGISTIC); + activate_array(l.g_cpu, l.outputs*l.batch, TANH); + activate_array(l.o_cpu, l.outputs*l.batch, LOGISTIC); + + copy_cpu(l.outputs*l.batch, l.delta, 1, l.temp3_cpu, 1); + + copy_cpu(l.outputs*l.batch, l.c_cpu, 1, l.temp_cpu, 1); + activate_array(l.temp_cpu, l.outputs*l.batch, TANH); + + copy_cpu(l.outputs*l.batch, l.temp3_cpu, 1, l.temp2_cpu, 1); + mul_cpu(l.outputs*l.batch, l.o_cpu, 1, l.temp2_cpu, 1); + + gradient_array(l.temp_cpu, l.outputs*l.batch, TANH, l.temp2_cpu); + axpy_cpu(l.outputs*l.batch, 1, l.dc_cpu, 1, l.temp2_cpu, 1); + + copy_cpu(l.outputs*l.batch, l.c_cpu, 1, l.temp_cpu, 1); + activate_array(l.temp_cpu, l.outputs*l.batch, TANH); + mul_cpu(l.outputs*l.batch, l.temp3_cpu, 1, l.temp_cpu, 1); + gradient_array(l.o_cpu, l.outputs*l.batch, LOGISTIC, l.temp_cpu); + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, wo.delta, 1); + s.input = l.prev_state_cpu; + s.delta = l.dh_cpu; + backward_connected_layer(wo, s); + + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, uo.delta, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer(uo, s); + + copy_cpu(l.outputs*l.batch, l.temp2_cpu, 1, l.temp_cpu, 1); + mul_cpu(l.outputs*l.batch, l.i_cpu, 1, l.temp_cpu, 1); + gradient_array(l.g_cpu, l.outputs*l.batch, TANH, l.temp_cpu); + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, wg.delta, 1); + s.input = l.prev_state_cpu; + s.delta = l.dh_cpu; + backward_connected_layer(wg, s); + + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, ug.delta, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer(ug, s); + + copy_cpu(l.outputs*l.batch, l.temp2_cpu, 1, l.temp_cpu, 1); + mul_cpu(l.outputs*l.batch, l.g_cpu, 1, l.temp_cpu, 1); + gradient_array(l.i_cpu, l.outputs*l.batch, LOGISTIC, l.temp_cpu); + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, wi.delta, 1); + s.input = l.prev_state_cpu; + s.delta = l.dh_cpu; + backward_connected_layer(wi, s); + + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, ui.delta, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer(ui, s); + + copy_cpu(l.outputs*l.batch, l.temp2_cpu, 1, l.temp_cpu, 1); + mul_cpu(l.outputs*l.batch, l.prev_cell_cpu, 1, l.temp_cpu, 1); + gradient_array(l.f_cpu, l.outputs*l.batch, LOGISTIC, l.temp_cpu); + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, wf.delta, 1); + s.input = l.prev_state_cpu; + s.delta = l.dh_cpu; + backward_connected_layer(wf, s); + + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, uf.delta, 1); + s.input = state.input; + s.delta = state.delta; + backward_connected_layer(uf, s); + + copy_cpu(l.outputs*l.batch, l.temp2_cpu, 1, l.temp_cpu, 1); + mul_cpu(l.outputs*l.batch, l.f_cpu, 1, l.temp_cpu, 1); + copy_cpu(l.outputs*l.batch, l.temp_cpu, 1, l.dc_cpu, 1); + + state.input -= l.inputs*l.batch; + if (state.delta) state.delta -= l.inputs*l.batch; + l.output -= l.outputs*l.batch; + l.cell_cpu -= l.outputs*l.batch; + l.delta -= l.outputs*l.batch; + + increment_layer(&wf, -1); + increment_layer(&wi, -1); + increment_layer(&wg, -1); + increment_layer(&wo, -1); + + increment_layer(&uf, -1); + increment_layer(&ui, -1); + increment_layer(&ug, -1); + increment_layer(&uo, -1); + } } #ifdef GPU @@ -163,13 +424,13 @@ void forward_lstm_layer_gpu(layer l, network state) } for (i = 0; i < l.steps; ++i) { - s.input = l.h_gpu; + s.input_gpu = l.h_gpu; forward_connected_layer_gpu(wf, s); forward_connected_layer_gpu(wi, s); forward_connected_layer_gpu(wg, s); forward_connected_layer_gpu(wo, s); - s.input = state.input; + s.input_gpu = state.input_gpu; forward_connected_layer_gpu(uf, s); forward_connected_layer_gpu(ui, s); forward_connected_layer_gpu(ug, s); @@ -204,9 +465,9 @@ void forward_lstm_layer_gpu(layer l, network state) copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.cell_gpu, 1); copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.output_gpu, 1); - state.input += l.inputs*l.batch; - l.output_gpu += l.outputs*l.batch; - l.cell_gpu += l.outputs*l.batch; + state.input_gpu += l.inputs*l.batch; + l.output_gpu += l.outputs*l.batch; + l.cell_gpu += l.outputs*l.batch; increment_layer(&wf, 1); increment_layer(&wi, 1); @@ -245,8 +506,8 @@ void backward_lstm_layer_gpu(layer l, network state) increment_layer(&ug, l.steps - 1); increment_layer(&uo, l.steps - 1); - state.input += l.inputs*l.batch*(l.steps - 1); - if (state.delta) state.delta += l.inputs*l.batch*(l.steps - 1); + state.input_gpu += l.inputs*l.batch*(l.steps - 1); + if (state.delta_gpu) state.delta_gpu += l.inputs*l.batch*(l.steps - 1); l.output_gpu += l.outputs*l.batch*(l.steps - 1); l.cell_gpu += l.outputs*l.batch*(l.steps - 1); @@ -293,60 +554,60 @@ void backward_lstm_layer_gpu(layer l, network state) mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); gradient_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wo.delta_gpu, 1); - s.input = l.prev_state_gpu; - s.delta = l.dh_gpu; + s.input_gpu = l.prev_state_gpu; + s.delta_gpu = l.dh_gpu; backward_connected_layer_gpu(wo, s); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uo.delta_gpu, 1); - s.input = state.input; - s.delta = state.delta; + s.input_gpu = state.input_gpu; + s.delta_gpu = state.delta_gpu; backward_connected_layer_gpu(uo, s); copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); mul_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); gradient_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wg.delta_gpu, 1); - s.input = l.prev_state_gpu; - s.delta = l.dh_gpu; + s.input_gpu = l.prev_state_gpu; + s.delta_gpu = l.dh_gpu; backward_connected_layer_gpu(wg, s); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, ug.delta_gpu, 1); - s.input = state.input; - s.delta = state.delta; + s.input_gpu = state.input_gpu; + s.delta_gpu = state.delta_gpu; backward_connected_layer_gpu(ug, s); copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); gradient_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wi.delta_gpu, 1); - s.input = l.prev_state_gpu; - s.delta = l.dh_gpu; + s.input_gpu = l.prev_state_gpu; + s.delta_gpu = l.dh_gpu; backward_connected_layer_gpu(wi, s); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, ui.delta_gpu, 1); - s.input = state.input; - s.delta = state.delta; + s.input_gpu = state.input_gpu; + s.delta_gpu = state.delta_gpu; backward_connected_layer_gpu(ui, s); copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); mul_ongpu(l.outputs*l.batch, l.prev_cell_gpu, 1, l.temp_gpu, 1); gradient_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wf.delta_gpu, 1); - s.input = l.prev_state_gpu; - s.delta = l.dh_gpu; + s.input_gpu = l.prev_state_gpu; + s.delta_gpu = l.dh_gpu; backward_connected_layer_gpu(wf, s); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uf.delta_gpu, 1); - s.input = state.input; - s.delta = state.delta; + s.input_gpu = state.input_gpu; + s.delta_gpu = state.delta_gpu; backward_connected_layer_gpu(uf, s); copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.temp_gpu, 1); copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.dc_gpu, 1); - state.input -= l.inputs*l.batch; - if (state.delta) state.delta -= l.inputs*l.batch; + state.input_gpu -= l.inputs*l.batch; + if (state.delta_gpu) state.delta_gpu -= l.inputs*l.batch; l.output_gpu -= l.outputs*l.batch; l.cell_gpu -= l.outputs*l.batch; l.delta_gpu -= l.outputs*l.batch; diff --git a/src/parser.c b/src/parser.c index 16012212822..d5acc2e0b1f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -237,18 +237,19 @@ layer parse_gru(list *options, size_params params) int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); layer l = make_gru_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize); + l.tanh = option_find_int_quiet(options, "tanh", 0); return l; } layer parse_lstm(list *options, size_params params) { - int output = option_find_int(options, "output", 1); - int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); + int output = option_find_int(options, "output", 1); + int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - layer l = make_lstm_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize); + layer l = make_lstm_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize); - return l; + return l; } connected_layer parse_connected(list *options, size_params params) @@ -462,7 +463,7 @@ layer parse_batchnorm(list *options, size_params params) layer parse_shortcut(list *options, size_params params, network net) { - char *l = option_find(options, "from"); + char *l = option_find(options, "from"); int index = atoi(l); if(index < 0) index = params.index + index; @@ -497,7 +498,7 @@ layer parse_activation(list *options, size_params params) route_layer parse_route(list *options, size_params params, network net) { - char *l = option_find(options, "layers"); + char *l = option_find(options, "layers"); int len = strlen(l); if(!l) error("Route Layer must specify input layers"); int n = 1; @@ -593,8 +594,8 @@ void parse_net_options(list *options, network *net) net->step = option_find_int(options, "step", 1); net->scale = option_find_float(options, "scale", 1); } else if (net->policy == STEPS){ - char *l = option_find(options, "steps"); - char *p = option_find(options, "scales"); + char *l = option_find(options, "steps"); + char *p = option_find(options, "scales"); if(!l || !p) error("STEPS policy must have steps and scales in cfg file"); int len = strlen(l); @@ -678,7 +679,7 @@ network parse_network_cfg(char *filename) l = parse_rnn(options, params); }else if(lt == GRU){ l = parse_gru(options, params); - }else if (lt == LSTM) { + }else if (lt == LSTM) { l = parse_lstm(options, params); }else if(lt == CRNN){ l = parse_crnn(options, params); @@ -739,7 +740,7 @@ network parse_network_cfg(char *filename) params.c = l.out_c; params.inputs = l.outputs; } - } + } free_list(sections); layer out = get_network_output_layer(net); net.outputs = out.outputs; @@ -921,22 +922,22 @@ void save_weights_upto(network net, char *filename, int cutoff) save_connected_weights(*(l.self_layer), fp); save_connected_weights(*(l.output_layer), fp); } if (l.type == LSTM) { - save_connected_weights(*(l.wi), fp); - save_connected_weights(*(l.wf), fp); - save_connected_weights(*(l.wo), fp); - save_connected_weights(*(l.wg), fp); - save_connected_weights(*(l.ui), fp); - save_connected_weights(*(l.uf), fp); - save_connected_weights(*(l.uo), fp); - save_connected_weights(*(l.ug), fp); - } if (l.type == GRU) { - save_connected_weights(*(l.wz), fp); - save_connected_weights(*(l.wr), fp); - save_connected_weights(*(l.wh), fp); - save_connected_weights(*(l.uz), fp); - save_connected_weights(*(l.ur), fp); - save_connected_weights(*(l.uh), fp); - } if(l.type == CRNN){ + save_connected_weights(*(l.wi), fp); + save_connected_weights(*(l.wf), fp); + save_connected_weights(*(l.wo), fp); + save_connected_weights(*(l.wg), fp); + save_connected_weights(*(l.ui), fp); + save_connected_weights(*(l.uf), fp); + save_connected_weights(*(l.uo), fp); + save_connected_weights(*(l.ug), fp); + } if (l.type == GRU) { + save_connected_weights(*(l.wz), fp); + save_connected_weights(*(l.wr), fp); + save_connected_weights(*(l.wh), fp); + save_connected_weights(*(l.uz), fp); + save_connected_weights(*(l.ur), fp); + save_connected_weights(*(l.uh), fp); + } if(l.type == CRNN){ save_convolutional_weights(*(l.input_layer), fp); save_convolutional_weights(*(l.self_layer), fp); save_convolutional_weights(*(l.output_layer), fp); @@ -1128,24 +1129,24 @@ void load_weights_upto(network *net, char *filename, int start, int cutoff) load_connected_weights(*(l.self_layer), fp, transpose); load_connected_weights(*(l.output_layer), fp, transpose); } - if (l.type == LSTM) { - load_connected_weights(*(l.wi), fp, transpose); - load_connected_weights(*(l.wf), fp, transpose); - load_connected_weights(*(l.wo), fp, transpose); - load_connected_weights(*(l.wg), fp, transpose); - load_connected_weights(*(l.ui), fp, transpose); - load_connected_weights(*(l.uf), fp, transpose); - load_connected_weights(*(l.uo), fp, transpose); - load_connected_weights(*(l.ug), fp, transpose); - } - if (l.type == GRU) { - load_connected_weights(*(l.wz), fp, transpose); - load_connected_weights(*(l.wr), fp, transpose); - load_connected_weights(*(l.wh), fp, transpose); - load_connected_weights(*(l.uz), fp, transpose); - load_connected_weights(*(l.ur), fp, transpose); - load_connected_weights(*(l.uh), fp, transpose); - } + if (l.type == LSTM) { + load_connected_weights(*(l.wi), fp, transpose); + load_connected_weights(*(l.wf), fp, transpose); + load_connected_weights(*(l.wo), fp, transpose); + load_connected_weights(*(l.wg), fp, transpose); + load_connected_weights(*(l.ui), fp, transpose); + load_connected_weights(*(l.uf), fp, transpose); + load_connected_weights(*(l.uo), fp, transpose); + load_connected_weights(*(l.ug), fp, transpose); + } + if (l.type == GRU) { + load_connected_weights(*(l.wz), fp, transpose); + load_connected_weights(*(l.wr), fp, transpose); + load_connected_weights(*(l.wh), fp, transpose); + load_connected_weights(*(l.uz), fp, transpose); + load_connected_weights(*(l.ur), fp, transpose); + load_connected_weights(*(l.uh), fp, transpose); + } if(l.type == LOCAL){ int locations = l.out_w*l.out_h; int size = l.size*l.size*l.c*l.n*locations; From f9446acb689230b027ab1a63189338000d463507 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sat, 10 Jun 2017 23:27:15 -0700 Subject: [PATCH 033/118] :snake: :snake: :snake: :snake: :snake: --- Makefile | 18 +++++++++++------- src/blas_kernels.cu | 19 +++++++++++-------- src/cuda.c | 2 +- src/gru_layer.c | 18 +++++++++--------- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/Makefile b/Makefile index aab1d08c51f..a0393b535e4 100644 --- a/Makefile +++ b/Makefile @@ -13,14 +13,15 @@ ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ # ARCH= -gencode arch=compute_52,code=compute_52 VPATH=./src/:./examples -LIB=libdarknet.so +SLIB=libdarknet.so +ALIB=libdarknet.a EXEC=darknet OBJDIR=./obj/ CC=gcc NVCC=nvcc --compiler-options '-fPIC' AR=ar -ARFLAGS=-rv +ARFLAGS=rcs OPTS=-Ofast LDFLAGS= -lm -pthread COMMON= -Iinclude/ -Isrc/ @@ -62,13 +63,16 @@ EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA)) OBJS = $(addprefix $(OBJDIR), $(OBJ)) DEPS = $(wildcard src/*.h) Makefile include/darknet.h -all: obj backup results $(LIB) $(EXEC) +all: obj backup results $(SLIB) $(ALIB) $(EXEC) -$(EXEC): $(EXECOBJ) $(LIB) - $(CC) $(COMMON) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LIB) +$(EXEC): $(EXECOBJ) $(ALIB) + $(CC) $(COMMON) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(ALIB) -$(LIB): $(OBJS) +$(ALIB): $(OBJS) + $(AR) $(ARFLAGS) $@ $^ + +$(SLIB): $(OBJS) $(CC) $(CFLAGS) -shared $^ -o $@ $(LDFLAGS) $(OBJDIR)%.o: %.c $(DEPS) @@ -87,5 +91,5 @@ results: .PHONY: clean clean: - rm -rf $(OBJS) $(LIB) $(EXEC) $(EXECOBJ) + rm -rf $(OBJS) $(SLIB) $(ALIB) $(EXEC) $(EXECOBJ) diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index 9f1337ca6bc..2ce601536ee 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -53,21 +53,24 @@ void backward_scale_gpu(float *x_norm, float *delta, int batch, int n, int size, check_error(cudaPeekAtLastError()); } -__global__ void add_bias_kernel(float *output, float *biases, int n, int size) +__global__ void add_bias_kernel(float *output, float *biases, int batch, int n, int size) { - int offset = blockIdx.x * blockDim.x + threadIdx.x; - int filter = blockIdx.y; - int batch = blockIdx.z; + int index = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if (index >= n*size*batch) return; + int i = index % size; + index /= size; + int j = index % n; + index /= n; + int k = index; - if(offset < size) output[(batch*n+filter)*size + offset] += biases[filter]; + output[(k*n+j)*size + i] += biases[j]; } void add_bias_gpu(float *output, float *biases, int batch, int n, int size) { - dim3 dimGrid((size-1)/BLOCK + 1, n, batch); - dim3 dimBlock(BLOCK, 1, 1); + int num = n*size*batch; - add_bias_kernel<<>>(output, biases, n, size); + add_bias_kernel<<>>(output, biases, batch, n, size); check_error(cudaPeekAtLastError()); } diff --git a/src/cuda.c b/src/cuda.c index 48199743dc3..e511403776f 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -26,7 +26,7 @@ int cuda_get_device() void check_error(cudaError_t status) { - cudaDeviceSynchronize(); + //cudaDeviceSynchronize(); cudaError_t status2 = cudaGetLastError(); if (status != cudaSuccess) { diff --git a/src/gru_layer.c b/src/gru_layer.c index e07cb877323..75497ae4f59 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -68,15 +68,6 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_no *(l.wh) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); l.wh->batch = batch; -#ifdef CUDNN - cudnnSetTensor4dDescriptor(l.uz->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.uz->out_c, l.uz->out_h, l.uz->out_w); - cudnnSetTensor4dDescriptor(l.uh->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.uh->out_c, l.uh->out_h, l.uh->out_w); - cudnnSetTensor4dDescriptor(l.ur->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.ur->out_c, l.ur->out_h, l.ur->out_w); - cudnnSetTensor4dDescriptor(l.wz->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wz->out_c, l.wz->out_h, l.wz->out_w); - cudnnSetTensor4dDescriptor(l.wh->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wh->out_c, l.wh->out_h, l.wh->out_w); - cudnnSetTensor4dDescriptor(l.wr->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wr->out_c, l.wr->out_h, l.wr->out_w); -#endif - l.batch_normalize = batch_normalize; @@ -110,6 +101,15 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_no l.r_gpu = cuda_make_array(0, batch*outputs); l.z_gpu = cuda_make_array(0, batch*outputs); l.h_gpu = cuda_make_array(0, batch*outputs); + +#ifdef CUDNN + cudnnSetTensor4dDescriptor(l.uz->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.uz->out_c, l.uz->out_h, l.uz->out_w); + cudnnSetTensor4dDescriptor(l.uh->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.uh->out_c, l.uh->out_h, l.uh->out_w); + cudnnSetTensor4dDescriptor(l.ur->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.ur->out_c, l.ur->out_h, l.ur->out_w); + cudnnSetTensor4dDescriptor(l.wz->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wz->out_c, l.wz->out_h, l.wz->out_w); + cudnnSetTensor4dDescriptor(l.wh->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wh->out_c, l.wh->out_h, l.wh->out_w); + cudnnSetTensor4dDescriptor(l.wr->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.wr->out_c, l.wr->out_h, l.wr->out_w); +#endif #endif return l; From 1467621453e1c6932841a4992e6dffe0d0d8de24 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 12 Jun 2017 16:19:08 -0700 Subject: [PATCH 034/118] i hate adam. i hate adam --- Makefile | 6 +-- cfg/gru.cfg | 11 ----- examples/captcha.c | 2 +- examples/cifar.c | 4 +- examples/classifier.c | 2 +- examples/detector.c | 2 +- examples/dice.c | 2 +- examples/go.c | 4 +- examples/regressor.c | 2 +- examples/rnn.c | 8 ++-- examples/segmenter.c | 2 +- examples/tag.c | 2 +- examples/writing.c | 4 +- include/darknet.h | 31 ++++++++------ src/blas.h | 1 + src/blas_kernels.cu | 44 ++++++++++++++++---- src/compare.c | 2 +- src/connected_layer.c | 74 +++++++++++++++++++++++++--------- src/connected_layer.h | 20 +++++---- src/convolutional_kernels.cu | 35 +++++----------- src/convolutional_layer.c | 8 +++- src/convolutional_layer.h | 4 +- src/crnn_layer.c | 16 ++++---- src/crnn_layer.h | 4 +- src/deconvolutional_kernels.cu | 15 ++++--- src/deconvolutional_layer.c | 8 +++- src/deconvolutional_layer.h | 4 +- src/gru_layer.c | 39 +++++++++--------- src/gru_layer.h | 6 +-- src/local_layer.c | 14 ++++++- src/local_layer.h | 4 +- src/lstm_layer.c | 54 ++++++++++++------------- src/lstm_layer.h | 6 +-- src/network.c | 23 ++++++++--- src/network_kernels.cu | 17 ++++++-- src/parser.c | 40 ++++++++---------- src/rnn_layer.c | 24 +++++------ src/rnn_layer.h | 6 +-- 38 files changed, 315 insertions(+), 235 deletions(-) diff --git a/Makefile b/Makefile index a0393b535e4..2f724f551af 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -GPU=0 -CUDNN=0 -OPENCV=0 +GPU=1 +CUDNN=1 +OPENCV=1 DEBUG=0 ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ diff --git a/cfg/gru.cfg b/cfg/gru.cfg index 76eaf0c6d38..ea0e22d9356 100644 --- a/cfg/gru.cfg +++ b/cfg/gru.cfg @@ -22,17 +22,6 @@ max_batches=10000 [gru] batch_normalize=1 output = 1024 -tanh = 1 - -[gru] -batch_normalize=1 -output = 1024 -tanh = 1 - -[gru] -batch_normalize=1 -output = 1024 -tanh = 1 [connected] output=256 diff --git a/examples/captcha.c b/examples/captcha.c index 1de21fa33a6..fd4cb5a5e9d 100644 --- a/examples/captcha.c +++ b/examples/captcha.c @@ -83,7 +83,7 @@ void train_captcha(char *cfgfile, char *weightfile) float loss = train_network(net, train); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), *net.seen); + printf("%d: %f, %f avg, %lf seconds, %ld images\n", i, loss, avg_loss, sec(clock()-time), *net.seen); free_data(train); if(i%100==0){ char buff[256]; diff --git a/examples/cifar.c b/examples/cifar.c index a05d099757f..fd01e601bce 100644 --- a/examples/cifar.c +++ b/examples/cifar.c @@ -25,7 +25,7 @@ void train_cifar(char *cfgfile, char *weightfile) float loss = train_network_sgd(net, train, 1); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.95 + loss*.05; - printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); if(*net.seen/N > epoch){ epoch = *net.seen/N; char buff[256]; @@ -81,7 +81,7 @@ void train_cifar_distill(char *cfgfile, char *weightfile) float loss = train_network_sgd(net, train, 1); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.95 + loss*.05; - printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); if(*net.seen/N > epoch){ epoch = *net.seen/N; char buff[256]; diff --git a/examples/classifier.c b/examples/classifier.c index 645c80d4478..0d28a58b125 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -105,7 +105,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #endif if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); free_data(train); if(*net.seen/N > epoch){ epoch = *net.seen/N; diff --git a/examples/detector.c b/examples/detector.c index e6b57b8c903..4bec0507a7b 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -128,7 +128,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i avg_loss = avg_loss*.9 + loss*.1; i = get_current_batch(net); - printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs); + printf("%ld: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs); if(i%1000==0){ #ifdef GPU if(ngpus != 1) sync_nets(nets, ngpus, 0); diff --git a/examples/dice.c b/examples/dice.c index 6a810492cc1..f56d76c0bb6 100644 --- a/examples/dice.c +++ b/examples/dice.c @@ -31,7 +31,7 @@ void train_dice(char *cfgfile, char *weightfile) float loss = train_network(net, train); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), *net.seen); + printf("%d: %f, %f avg, %lf seconds, %ld images\n", i, loss, avg_loss, sec(clock()-time), *net.seen); free_data(train); if((i % 100) == 0) net.learning_rate *= .1; if(i%100==0){ diff --git a/examples/go.c b/examples/go.c index f4513574f96..7f4a250d0ac 100644 --- a/examples/go.c +++ b/examples/go.c @@ -169,7 +169,7 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.95 + loss*.05; - printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); if(*net.seen/N > epoch){ epoch = *net.seen/N; char buff[256]; @@ -184,7 +184,7 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng } if(get_current_batch(net)%10000 == 0){ char buff[256]; - sprintf(buff, "%s/%s_%d.backup",backup_directory,base,get_current_batch(net)); + sprintf(buff, "%s/%s_%ld.backup",backup_directory,base,get_current_batch(net)); save_weights(net, buff); } } diff --git a/examples/regressor.c b/examples/regressor.c index 6dd2b4a2e0a..b246d48bec8 100644 --- a/examples/regressor.c +++ b/examples/regressor.c @@ -91,7 +91,7 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #endif if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); free_data(train); if(*net.seen/N > epoch){ epoch = *net.seen/N; diff --git a/examples/rnn.c b/examples/rnn.c index 197e270d02a..1c45711dcc6 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -182,7 +182,7 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, if (avg_loss < 0) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - int chars = get_current_batch(net)*batch; + size_t chars = get_current_batch(net)*batch; fprintf(stderr, "%d: %f, %f avg, %f rate, %lf seconds, %f epochs\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), (float) chars/size); for(j = 0; j < streams; ++j){ @@ -194,12 +194,12 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, } } - if(i%1000==0){ + if(i%10000==0){ char buff[256]; sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); save_weights(net, buff); } - if(i%10==0){ + if(i%100==0){ char buff[256]; sprintf(buff, "%s/%s.backup", backup_directory, base); save_weights(net, buff); @@ -409,7 +409,7 @@ void valid_char_rnn(char *cfgfile, char *weightfile, char *seed) input[c] = 0; sum += log(out[next])/log2; c = next; - printf("%d Perplexity: %4.4f Word Perplexity: %4.4f\n", count, pow(2, -sum/count), pow(2, -sum/words)); + printf("%d BPC: %4.4f Perplexity: %4.4f Word Perplexity: %4.4f\n", count, -sum/count, pow(2, -sum/count), pow(2, -sum/words)); } } diff --git a/examples/segmenter.c b/examples/segmenter.c index fe3d498ef77..325593eda45 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -100,7 +100,7 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #endif if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); free_data(train); if(*net.seen/N > epoch){ epoch = *net.seen/N; diff --git a/examples/tag.c b/examples/tag.c index f10cea5f079..51bbb95ea0a 100644 --- a/examples/tag.c +++ b/examples/tag.c @@ -58,7 +58,7 @@ void train_tag(char *cfgfile, char *weightfile, int clear) float loss = train_network(net, train); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); free_data(train); if(*net.seen/N > epoch){ epoch = *net.seen/N; diff --git a/examples/writing.c b/examples/writing.c index 5d30ea90bf6..1b6ff83b583 100644 --- a/examples/writing.c +++ b/examples/writing.c @@ -63,11 +63,11 @@ void train_writing(char *cfgfile, char *weightfile) if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); free_data(train); if(get_current_batch(net)%100 == 0){ char buff[256]; - sprintf(buff, "%s/%s_batch_%d.weights", backup_directory, base, get_current_batch(net)); + sprintf(buff, "%s/%s_batch_%ld.weights", backup_directory, base, get_current_batch(net)); save_weights(net, buff); } if(*net.seen/N > epoch){ diff --git a/include/darknet.h b/include/darknet.h index 269f216e99b..8d4366b68cf 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -87,6 +87,18 @@ typedef enum{ SSE, MASKED, L1, SMOOTH } COST_TYPE; +typedef struct{ + int batch; + float learning_rate; + float momentum; + float decay; + int adam; + float B1; + float B2; + float eps; + int t; +} update_args; + struct network; typedef struct network network; @@ -99,10 +111,10 @@ struct layer{ COST_TYPE cost_type; void (*forward) (struct layer, struct network); void (*backward) (struct layer, struct network); - void (*update) (struct layer, int, float, float, float); + void (*update) (struct layer, update_args); void (*forward_gpu) (struct layer, struct network); void (*backward_gpu) (struct layer, struct network); - void (*update_gpu) (struct layer, int, float, float, float); + void (*update_gpu) (struct layer, update_args); int batch_normalize; int shortcut; int batch; @@ -156,12 +168,6 @@ struct layer{ int log; int tanh; - int adam; - float B1; - float B2; - float eps; - int t; - float alpha; float beta; float kappa; @@ -395,16 +401,17 @@ typedef enum { typedef struct network{ int n; int batch; - int *seen; + size_t *seen; + int *t; float epoch; int subdivisions; - float momentum; - float decay; layer *layers; float *output; learning_rate_policy policy; float learning_rate; + float momentum; + float decay; float gamma; float scale; float power; @@ -648,7 +655,7 @@ void draw_box_width(image a, int x1, int y1, int x2, int y2, int w, float r, flo float get_current_rate(network net); void composite_3d(char *f1, char *f2, char *out, int delta); data load_data_old(char **paths, int n, int m, char **labels, int k, int w, int h); -int get_current_batch(network net); +size_t get_current_batch(network net); void constrain_image(image im); image get_network_image_layer(network net, int i); layer get_network_output_layer(network net); diff --git a/src/blas.h b/src/blas.h index 7b0218f6e8a..6291746fc48 100644 --- a/src/blas.h +++ b/src/blas.h @@ -80,6 +80,7 @@ void mult_add_into_gpu(int num, float *a, float *b, float *c); void reorg_ongpu(float *x, int w, int h, int c, int batch, int stride, int forward, float *out); void softmax_gpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output); +void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch, int t); void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rate, float eps, int t); void flatten_ongpu(float *x, int spatial, int layers, int batch, int forward, float *out); diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index 2ce601536ee..6fdfd3fa764 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -74,6 +74,19 @@ void add_bias_gpu(float *output, float *biases, int batch, int n, int size) check_error(cudaPeekAtLastError()); } +__global__ void backward_bias_conn_kernel(float *bias_updates, float *delta, int batch, int n) +{ + int index = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if (index >= n) return; + int b; + float sum = 0; + for(b = 0; b < batch; ++b){ + int i = b*n + index; + sum += delta[i]; + } + bias_updates[index] += sum; +} + __global__ void backward_bias_kernel(float *bias_updates, float *delta, int batch, int n, int size) { __shared__ float part[BLOCK]; @@ -94,6 +107,16 @@ __global__ void backward_bias_kernel(float *bias_updates, float *delta, int batc } } +void backward_bias_gpu(float *bias_updates, float *delta, int batch, int n, int size) +{ + if(size == 1){ + backward_bias_conn_kernel<<>>(bias_updates, delta, batch, n); + }else{ + backward_bias_kernel<<>>(bias_updates, delta, batch, n, size); + } + check_error(cudaPeekAtLastError()); +} + /* __global__ void dot_kernel(float *output, float scale, int batch, int n, int size, float *delta) { @@ -136,12 +159,6 @@ void dot_error_gpu(layer l) } */ -void backward_bias_gpu(float *bias_updates, float *delta, int batch, int n, int size) -{ - backward_bias_kernel<<>>(bias_updates, delta, batch, n, size); - check_error(cudaPeekAtLastError()); -} - __global__ void adam_kernel(int N, float *x, float *m, float *v, float B1, float B2, float rate, float eps, int t) { @@ -149,7 +166,6 @@ __global__ void adam_kernel(int N, float *x, float *m, float *v, float B1, float if (index >= N) return; x[index] = x[index] + (rate * sqrt(1.-pow(B2, t)) / (1.-pow(B1, t)) * m[index] / (sqrt(v[index]) + eps)); - //if(index == 0) printf("%f %f %f %f\n", m[index], v[index], (rate * sqrt(1.-pow(B2, t)) / (1.-pow(B1, t)) * m[index] / (sqrt(v[index]) + eps))); } extern "C" void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rate, float eps, int t) @@ -158,6 +174,20 @@ extern "C" void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2 check_error(cudaPeekAtLastError()); } +extern "C" void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch, int t) +{ + scal_ongpu(n, B1, m, 1); + scal_ongpu(n, B2, v, 1); + axpy_ongpu(n, -decay*batch, w, 1, d, 1); + + axpy_ongpu(n, (1-B1), d, 1, m, 1); + mul_ongpu(n, d, 1, d, 1); + axpy_ongpu(n, (1-B2), d, 1, v, 1); + + adam_gpu(n, w, m, v, B1, B2, rate/batch, eps, t); + fill_ongpu(n, 0, d, 1); +} + __global__ void normalize_kernel(int N, float *x, float *mean, float *variance, int batch, int filters, int spatial) { int index = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; diff --git a/src/compare.c b/src/compare.c index 4fd266c7dc3..d2d2b3bdc67 100644 --- a/src/compare.c +++ b/src/compare.c @@ -54,7 +54,7 @@ void train_compare(char *cfgfile, char *weightfile) float loss = train_network(net, train); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%.3f: %f, %f avg, %lf seconds, %d images\n", (float)*net.seen/N, loss, avg_loss, sec(clock()-time), *net.seen); + printf("%.3f: %f, %f avg, %lf seconds, %ld images\n", (float)*net.seen/N, loss, avg_loss, sec(clock()-time), *net.seen); free_data(train); if(i%100 == 0){ char buff[256]; diff --git a/src/connected_layer.c b/src/connected_layer.c index 38c492cb784..5037e74889c 100644 --- a/src/connected_layer.c +++ b/src/connected_layer.c @@ -11,10 +11,11 @@ #include #include -connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVATION activation, int batch_normalize) +layer make_connected_layer(int batch, int inputs, int outputs, ACTIVATION activation, int batch_normalize, int adam) { int i; - connected_layer l = {0}; + layer l = {0}; + l.learning_rate_scale = 1; l.type = CONNECTED; l.inputs = inputs; @@ -51,6 +52,14 @@ connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVAT l.biases[i] = 0; } + if(adam){ + l.m = calloc(l.inputs*l.outputs, sizeof(float)); + l.v = calloc(l.inputs*l.outputs, sizeof(float)); + l.bias_m = calloc(l.outputs, sizeof(float)); + l.scale_m = calloc(l.outputs, sizeof(float)); + l.bias_v = calloc(l.outputs, sizeof(float)); + l.scale_v = calloc(l.outputs, sizeof(float)); + } if(batch_normalize){ l.scales = calloc(outputs, sizeof(float)); l.scale_updates = calloc(outputs, sizeof(float)); @@ -83,6 +92,15 @@ connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVAT l.output_gpu = cuda_make_array(l.output, outputs*batch); l.delta_gpu = cuda_make_array(l.delta, outputs*batch); + if (adam) { + l.m_gpu = cuda_make_array(0, inputs*outputs); + l.v_gpu = cuda_make_array(0, inputs*outputs); + l.bias_m_gpu = cuda_make_array(0, outputs); + l.bias_v_gpu = cuda_make_array(0, outputs); + l.scale_m_gpu = cuda_make_array(0, outputs); + l.scale_v_gpu = cuda_make_array(0, outputs); + } + if(batch_normalize){ l.mean_gpu = cuda_make_array(l.mean, outputs); l.variance_gpu = cuda_make_array(l.variance, outputs); @@ -111,8 +129,12 @@ connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVAT return l; } -void update_connected_layer(connected_layer l, int batch, float learning_rate, float momentum, float decay) +void update_connected_layer(layer l, update_args a) { + float learning_rate = a.learning_rate*l.learning_rate_scale; + float momentum = a.momentum; + float decay = a.decay; + int batch = a.batch; axpy_cpu(l.outputs, learning_rate/batch, l.bias_updates, 1, l.biases, 1); scal_cpu(l.outputs, momentum, l.bias_updates, 1); @@ -126,7 +148,7 @@ void update_connected_layer(connected_layer l, int batch, float learning_rate, f scal_cpu(l.inputs*l.outputs, momentum, l.weight_updates, 1); } -void forward_connected_layer(connected_layer l, network net) +void forward_connected_layer(layer l, network net) { fill_cpu(l.outputs*l.batch, 0, l.output, 1); int m = l.batch; @@ -144,7 +166,7 @@ void forward_connected_layer(connected_layer l, network net) activate_array(l.output, l.outputs*l.batch, l.activation); } -void backward_connected_layer(connected_layer l, network net) +void backward_connected_layer(layer l, network net) { gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta); @@ -210,7 +232,7 @@ void statistics_connected_layer(layer l) #ifdef GPU -void pull_connected_layer(connected_layer l) +void pull_connected_layer(layer l) { cuda_pull_array(l.weights_gpu, l.weights, l.inputs*l.outputs); cuda_pull_array(l.biases_gpu, l.biases, l.outputs); @@ -223,7 +245,7 @@ void pull_connected_layer(connected_layer l) } } -void push_connected_layer(connected_layer l) +void push_connected_layer(layer l) { cuda_push_array(l.weights_gpu, l.weights, l.inputs*l.outputs); cuda_push_array(l.biases_gpu, l.biases, l.outputs); @@ -236,22 +258,34 @@ void push_connected_layer(connected_layer l) } } -void update_connected_layer_gpu(connected_layer l, int batch, float learning_rate, float momentum, float decay) +void update_connected_layer_gpu(layer l, update_args a) { - axpy_ongpu(l.outputs, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); - scal_ongpu(l.outputs, momentum, l.bias_updates_gpu, 1); + float learning_rate = a.learning_rate*l.learning_rate_scale; + float momentum = a.momentum; + float decay = a.decay; + int batch = a.batch; + if(a.adam){ + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.inputs*l.outputs, batch, a.t); + adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.outputs, batch, a.t); + if(l.scales_gpu){ + adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.outputs, batch, a.t); + } + }else{ + axpy_ongpu(l.outputs, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); + scal_ongpu(l.outputs, momentum, l.bias_updates_gpu, 1); - if(l.batch_normalize){ - axpy_ongpu(l.outputs, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); - scal_ongpu(l.outputs, momentum, l.scale_updates_gpu, 1); - } + if(l.batch_normalize){ + axpy_ongpu(l.outputs, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); + scal_ongpu(l.outputs, momentum, l.scale_updates_gpu, 1); + } - axpy_ongpu(l.inputs*l.outputs, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); - axpy_ongpu(l.inputs*l.outputs, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); - scal_ongpu(l.inputs*l.outputs, momentum, l.weight_updates_gpu, 1); + axpy_ongpu(l.inputs*l.outputs, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_ongpu(l.inputs*l.outputs, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_ongpu(l.inputs*l.outputs, momentum, l.weight_updates_gpu, 1); + } } -void forward_connected_layer_gpu(connected_layer l, network net) +void forward_connected_layer_gpu(layer l, network net) { fill_ongpu(l.outputs*l.batch, 0, l.output_gpu, 1); @@ -271,9 +305,9 @@ void forward_connected_layer_gpu(connected_layer l, network net) activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); } -void backward_connected_layer_gpu(connected_layer l, network net) +void backward_connected_layer_gpu(layer l, network net) { - constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); + constrain_ongpu(l.outputs*l.batch, 5, l.delta_gpu, 1); gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); if(l.batch_normalize){ backward_batchnorm_layer_gpu(l, net); diff --git a/src/connected_layer.h b/src/connected_layer.h index 067b256657b..6727a964eaa 100644 --- a/src/connected_layer.h +++ b/src/connected_layer.h @@ -5,20 +5,18 @@ #include "layer.h" #include "network.h" -typedef layer connected_layer; +layer make_connected_layer(int batch, int inputs, int outputs, ACTIVATION activation, int batch_normalize, int adam); -connected_layer make_connected_layer(int batch, int inputs, int outputs, ACTIVATION activation, int batch_normalize); - -void forward_connected_layer(connected_layer layer, network net); -void backward_connected_layer(connected_layer layer, network net); -void update_connected_layer(connected_layer layer, int batch, float learning_rate, float momentum, float decay); +void forward_connected_layer(layer l, network net); +void backward_connected_layer(layer l, network net); +void update_connected_layer(layer l, update_args a); #ifdef GPU -void forward_connected_layer_gpu(connected_layer layer, network net); -void backward_connected_layer_gpu(connected_layer layer, network net); -void update_connected_layer_gpu(connected_layer layer, int batch, float learning_rate, float momentum, float decay); -void push_connected_layer(connected_layer layer); -void pull_connected_layer(connected_layer layer); +void forward_connected_layer_gpu(layer l, network net); +void backward_connected_layer_gpu(layer l, network net); +void update_connected_layer_gpu(layer l, update_args a); +void push_connected_layer(layer l); +void pull_connected_layer(layer l); #endif #endif diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index b53dd16a27b..cc0021822ff 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -263,10 +263,6 @@ void pull_convolutional_layer(convolutional_layer layer) cuda_pull_array(layer.rolling_mean_gpu, layer.rolling_mean, layer.n); cuda_pull_array(layer.rolling_variance_gpu, layer.rolling_variance, layer.n); } - if (layer.adam){ - cuda_pull_array(layer.m_gpu, layer.m, layer.c*layer.n*layer.size*layer.size); - cuda_pull_array(layer.v_gpu, layer.v, layer.c*layer.n*layer.size*layer.size); - } } void push_convolutional_layer(convolutional_layer layer) @@ -280,35 +276,22 @@ void push_convolutional_layer(convolutional_layer layer) cuda_push_array(layer.rolling_mean_gpu, layer.rolling_mean, layer.n); cuda_push_array(layer.rolling_variance_gpu, layer.rolling_variance, layer.n); } - if (layer.adam){ - cuda_push_array(layer.m_gpu, layer.m, layer.c*layer.n*layer.size*layer.size); - cuda_push_array(layer.v_gpu, layer.v, layer.c*layer.n*layer.size*layer.size); - } } -void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch, int t) +void update_convolutional_layer_gpu(layer l, update_args a) { - scal_ongpu(n, B1, m, 1); - scal_ongpu(n, B2, v, 1); - axpy_ongpu(n, -decay*batch, w, 1, d, 1); - - axpy_ongpu(n, (1-B1), d, 1, m, 1); - mul_ongpu(n, d, 1, d, 1); - axpy_ongpu(n, (1-B2), d, 1, v, 1); + float learning_rate = a.learning_rate*l.learning_rate_scale; + float momentum = a.momentum; + float decay = a.decay; + int batch = a.batch; - adam_gpu(n, w, m, v, B1, B2, rate/batch, eps, t); - fill_ongpu(n, 0, d, 1); -} - -void update_convolutional_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) -{ int size = l.size*l.size*l.c*l.n; - if(l.adam){ - adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, size, batch, l.t); - adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch, l.t); + if(a.adam){ + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, size, batch, a.t); + adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); if(l.scales_gpu){ - adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch, l.t); + adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); } }else{ axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index e5b5bb6f2be..a12b7c23fe0 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -234,7 +234,6 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.x_norm = calloc(l.batch*l.outputs, sizeof(float)); } if(adam){ - l.adam = 1; l.m = calloc(c*n*size*size, sizeof(float)); l.v = calloc(c*n*size*size, sizeof(float)); l.bias_m = calloc(n, sizeof(float)); @@ -507,8 +506,13 @@ void backward_convolutional_layer(convolutional_layer l, network net) } } -void update_convolutional_layer(convolutional_layer l, int batch, float learning_rate, float momentum, float decay) +void update_convolutional_layer(convolutional_layer l, update_args a) { + float learning_rate = a.learning_rate*l.learning_rate_scale; + float momentum = a.momentum; + float decay = a.decay; + int batch = a.batch; + int size = l.size*l.size*l.c*l.n; axpy_cpu(l.n, learning_rate/batch, l.bias_updates, 1, l.biases, 1); scal_cpu(l.n, momentum, l.bias_updates, 1); diff --git a/src/convolutional_layer.h b/src/convolutional_layer.h index 91394c38d6d..d42b7423d29 100644 --- a/src/convolutional_layer.h +++ b/src/convolutional_layer.h @@ -12,7 +12,7 @@ typedef layer convolutional_layer; #ifdef GPU void forward_convolutional_layer_gpu(convolutional_layer layer, network net); void backward_convolutional_layer_gpu(convolutional_layer layer, network net); -void update_convolutional_layer_gpu(convolutional_layer layer, int batch, float learning_rate, float momentum, float decay); +void update_convolutional_layer_gpu(convolutional_layer layer, update_args a); void push_convolutional_layer(convolutional_layer layer); void pull_convolutional_layer(convolutional_layer layer); @@ -28,7 +28,7 @@ void cudnn_convolutional_setup(layer *l); convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int binary, int xnor, int adam); void resize_convolutional_layer(convolutional_layer *layer, int w, int h); void forward_convolutional_layer(const convolutional_layer layer, network net); -void update_convolutional_layer(convolutional_layer layer, int batch, float learning_rate, float momentum, float decay); +void update_convolutional_layer(convolutional_layer layer, update_args a); image *visualize_convolutional_layer(convolutional_layer layer, char *window, image *prev_weights); void binarize_weights(float *weights, int n, int size, float *binary); void swap_binary(convolutional_layer *l); diff --git a/src/crnn_layer.c b/src/crnn_layer.c index 2478fef5e71..2554cf9c3ed 100644 --- a/src/crnn_layer.c +++ b/src/crnn_layer.c @@ -81,11 +81,11 @@ layer make_crnn_layer(int batch, int h, int w, int c, int hidden_filters, int ou return l; } -void update_crnn_layer(layer l, int batch, float learning_rate, float momentum, float decay) +void update_crnn_layer(layer l, update_args a) { - update_convolutional_layer(*(l.input_layer), batch, learning_rate, momentum, decay); - update_convolutional_layer(*(l.self_layer), batch, learning_rate, momentum, decay); - update_convolutional_layer(*(l.output_layer), batch, learning_rate, momentum, decay); + update_convolutional_layer(*(l.input_layer), a); + update_convolutional_layer(*(l.self_layer), a); + update_convolutional_layer(*(l.output_layer), a); } void forward_crnn_layer(layer l, network net) @@ -194,11 +194,11 @@ void push_crnn_layer(layer l) push_convolutional_layer(*(l.output_layer)); } -void update_crnn_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) +void update_crnn_layer_gpu(layer l, update_args a) { - update_convolutional_layer_gpu(*(l.input_layer), batch, learning_rate, momentum, decay); - update_convolutional_layer_gpu(*(l.self_layer), batch, learning_rate, momentum, decay); - update_convolutional_layer_gpu(*(l.output_layer), batch, learning_rate, momentum, decay); + update_convolutional_layer_gpu(*(l.input_layer), a); + update_convolutional_layer_gpu(*(l.self_layer), a); + update_convolutional_layer_gpu(*(l.output_layer), a); } void forward_crnn_layer_gpu(layer l, network net) diff --git a/src/crnn_layer.h b/src/crnn_layer.h index ce89211ba3a..515f378354e 100644 --- a/src/crnn_layer.h +++ b/src/crnn_layer.h @@ -10,12 +10,12 @@ layer make_crnn_layer(int batch, int h, int w, int c, int hidden_filters, int ou void forward_crnn_layer(layer l, network net); void backward_crnn_layer(layer l, network net); -void update_crnn_layer(layer l, int batch, float learning_rate, float momentum, float decay); +void update_crnn_layer(layer l, update_args a); #ifdef GPU void forward_crnn_layer_gpu(layer l, network net); void backward_crnn_layer_gpu(layer l, network net); -void update_crnn_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); +void update_crnn_layer_gpu(layer l, update_args a); void push_crnn_layer(layer l); void pull_crnn_layer(layer l); #endif diff --git a/src/deconvolutional_kernels.cu b/src/deconvolutional_kernels.cu index 166946349ab..250263753bc 100644 --- a/src/deconvolutional_kernels.cu +++ b/src/deconvolutional_kernels.cu @@ -109,15 +109,20 @@ extern "C" void push_deconvolutional_layer(layer l) } } -void update_deconvolutional_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) +void update_deconvolutional_layer_gpu(layer l, update_args a) { + float learning_rate = a.learning_rate*l.learning_rate_scale; + float momentum = a.momentum; + float decay = a.decay; + int batch = a.batch; + int size = l.size*l.size*l.c*l.n; - if(l.adam){ - adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, size, batch, l.t); - adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch, l.t); + if(a.adam){ + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, size, batch, a.t); + adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); if(l.scales_gpu){ - adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, l.B1, l.B2, l.eps, decay, learning_rate, l.n, batch, l.t); + adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); } }else{ axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); diff --git a/src/deconvolutional_layer.c b/src/deconvolutional_layer.c index 3778b418aa4..0959d7388c0 100644 --- a/src/deconvolutional_layer.c +++ b/src/deconvolutional_layer.c @@ -79,7 +79,6 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size l.x_norm = calloc(l.batch*l.outputs, sizeof(float)); } if(adam){ - l.adam = 1; l.m = calloc(c*n*size*size, sizeof(float)); l.v = calloc(c*n*size*size, sizeof(float)); l.bias_m = calloc(n, sizeof(float)); @@ -252,8 +251,13 @@ void backward_deconvolutional_layer(layer l, network net) } } -void update_deconvolutional_layer(layer l, int batch, float learning_rate, float momentum, float decay) +void update_deconvolutional_layer(layer l, update_args a) { + float learning_rate = a.learning_rate*l.learning_rate_scale; + float momentum = a.momentum; + float decay = a.decay; + int batch = a.batch; + int size = l.size*l.size*l.c*l.n; axpy_cpu(l.n, learning_rate/batch, l.bias_updates, 1, l.biases, 1); scal_cpu(l.n, momentum, l.bias_updates, 1); diff --git a/src/deconvolutional_layer.h b/src/deconvolutional_layer.h index 42ccbc14213..b254fb91e69 100644 --- a/src/deconvolutional_layer.h +++ b/src/deconvolutional_layer.h @@ -10,7 +10,7 @@ #ifdef GPU void forward_deconvolutional_layer_gpu(layer l, network net); void backward_deconvolutional_layer_gpu(layer l, network net); -void update_deconvolutional_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); +void update_deconvolutional_layer_gpu(layer l, update_args a); void push_deconvolutional_layer(layer l); void pull_deconvolutional_layer(layer l); #endif @@ -18,7 +18,7 @@ void pull_deconvolutional_layer(layer l); layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int adam); void resize_deconvolutional_layer(layer *l, int h, int w); void forward_deconvolutional_layer(const layer l, network net); -void update_deconvolutional_layer(layer l, int batch, float learning_rate, float momentum, float decay); +void update_deconvolutional_layer(layer l, update_args a); void backward_deconvolutional_layer(layer l, network net); #endif diff --git a/src/gru_layer.c b/src/gru_layer.c index 75497ae4f59..30ec641eae8 100644 --- a/src/gru_layer.c +++ b/src/gru_layer.c @@ -26,7 +26,7 @@ static void increment_layer(layer *l, int steps) #endif } -layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_normalize) +layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_normalize, int adam) { fprintf(stderr, "GRU Layer: %d inputs, %d outputs\n", inputs, outputs); batch = batch / steps; @@ -38,34 +38,34 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_no l.uz = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.uz) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.uz) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.uz->batch = batch; l.wz = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wz) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + *(l.wz) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); l.wz->batch = batch; l.ur = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.ur) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.ur) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.ur->batch = batch; l.wr = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wr) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + *(l.wr) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); l.wr->batch = batch; l.uh = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.uh) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.uh) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.uh->batch = batch; l.wh = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wh) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + *(l.wh) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); l.wh->batch = batch; l.batch_normalize = batch_normalize; @@ -115,11 +115,14 @@ layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_no return l; } -void update_gru_layer(layer l, int batch, float learning_rate, float momentum, float decay) +void update_gru_layer(layer l, update_args a) { - update_connected_layer(*(l.input_layer), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.self_layer), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.output_layer), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.ur), a); + update_connected_layer(*(l.uz), a); + update_connected_layer(*(l.uh), a); + update_connected_layer(*(l.wr), a); + update_connected_layer(*(l.wz), a); + update_connected_layer(*(l.wh), a); } void forward_gru_layer(layer l, network net) @@ -212,14 +215,14 @@ void push_gru_layer(layer l) { } -void update_gru_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) +void update_gru_layer_gpu(layer l, update_args a) { - update_connected_layer_gpu(*(l.ur), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.uz), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.uh), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.wr), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.wz), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.wh), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.ur), a); + update_connected_layer_gpu(*(l.uz), a); + update_connected_layer_gpu(*(l.uh), a); + update_connected_layer_gpu(*(l.wr), a); + update_connected_layer_gpu(*(l.wz), a); + update_connected_layer_gpu(*(l.wh), a); } void forward_gru_layer_gpu(layer l, network net) diff --git a/src/gru_layer.h b/src/gru_layer.h index a0e57171587..9067942e949 100644 --- a/src/gru_layer.h +++ b/src/gru_layer.h @@ -6,16 +6,16 @@ #include "layer.h" #include "network.h" -layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_normalize); +layer make_gru_layer(int batch, int inputs, int outputs, int steps, int batch_normalize, int adam); void forward_gru_layer(layer l, network state); void backward_gru_layer(layer l, network state); -void update_gru_layer(layer l, int batch, float learning_rate, float momentum, float decay); +void update_gru_layer(layer l, update_args a); #ifdef GPU void forward_gru_layer_gpu(layer l, network state); void backward_gru_layer_gpu(layer l, network state); -void update_gru_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); +void update_gru_layer_gpu(layer l, update_args a); void push_gru_layer(layer l); void pull_gru_layer(layer l); #endif diff --git a/src/local_layer.c b/src/local_layer.c index aad036e050c..170ba9b6689 100644 --- a/src/local_layer.c +++ b/src/local_layer.c @@ -164,8 +164,13 @@ void backward_local_layer(local_layer l, network net) } } -void update_local_layer(local_layer l, int batch, float learning_rate, float momentum, float decay) +void update_local_layer(local_layer l, update_args a) { + float learning_rate = a.learning_rate*l.learning_rate_scale; + float momentum = a.momentum; + float decay = a.decay; + int batch = a.batch; + int locations = l.out_w*l.out_h; int size = l.size*l.size*l.c*l.n*locations; axpy_cpu(l.outputs, learning_rate/batch, l.bias_updates, 1, l.biases, 1); @@ -253,8 +258,13 @@ void backward_local_layer_gpu(local_layer l, network net) } } -void update_local_layer_gpu(local_layer l, int batch, float learning_rate, float momentum, float decay) +void update_local_layer_gpu(local_layer l, update_args a) { + float learning_rate = a.learning_rate*l.learning_rate_scale; + float momentum = a.momentum; + float decay = a.decay; + int batch = a.batch; + int locations = l.out_w*l.out_h; int size = l.size*l.size*l.c*l.n*locations; axpy_ongpu(l.outputs, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); diff --git a/src/local_layer.h b/src/local_layer.h index 5e292f9106a..776e572f420 100644 --- a/src/local_layer.h +++ b/src/local_layer.h @@ -12,7 +12,7 @@ typedef layer local_layer; #ifdef GPU void forward_local_layer_gpu(local_layer layer, network net); void backward_local_layer_gpu(local_layer layer, network net); -void update_local_layer_gpu(local_layer layer, int batch, float learning_rate, float momentum, float decay); +void update_local_layer_gpu(local_layer layer, update_args a); void push_local_layer(local_layer layer); void pull_local_layer(local_layer layer); @@ -22,7 +22,7 @@ local_layer make_local_layer(int batch, int h, int w, int c, int n, int size, in void forward_local_layer(const local_layer layer, network net); void backward_local_layer(local_layer layer, network net); -void update_local_layer(local_layer layer, int batch, float learning_rate, float momentum, float decay); +void update_local_layer(local_layer layer, update_args a); void bias_output(float *output, float *biases, int batch, int n, int size); void backward_bias(float *bias_updates, float *delta, int batch, int n, int size); diff --git a/src/lstm_layer.c b/src/lstm_layer.c index 74f6a136204..a0cd99b6be6 100644 --- a/src/lstm_layer.c +++ b/src/lstm_layer.c @@ -26,7 +26,7 @@ static void increment_layer(layer *l, int steps) #endif } -layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_normalize) +layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_normalize, int adam) { fprintf(stderr, "LSTM Layer: %d inputs, %d outputs\n", inputs, outputs); batch = batch / steps; @@ -38,42 +38,42 @@ layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_n l.uf = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.uf) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.uf) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.uf->batch = batch; l.wf = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wf) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + *(l.wf) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); l.wf->batch = batch; l.ui = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.ui) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.ui) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.ui->batch = batch; l.wi = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wi) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + *(l.wi) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); l.wi->batch = batch; l.ug = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.ug) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.ug) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.ug->batch = batch; l.wg = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wg) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + *(l.wg) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); l.wg->batch = batch; l.uo = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.uo) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize); + *(l.uo) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.uo->batch = batch; l.wo = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.wo) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize); + *(l.wo) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); l.wo->batch = batch; l.batch_normalize = batch_normalize; @@ -141,16 +141,16 @@ layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_n return l; } -void update_lstm_layer(layer l, int batch, float learning_rate, float momentum, float decay) +void update_lstm_layer(layer l, update_args a) { - update_connected_layer(*(l.wf), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.wi), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.wg), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.wo), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.uf), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.ui), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.ug), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.uo), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.wf), a); + update_connected_layer(*(l.wi), a); + update_connected_layer(*(l.wg), a); + update_connected_layer(*(l.wo), a); + update_connected_layer(*(l.uf), a); + update_connected_layer(*(l.ui), a); + update_connected_layer(*(l.ug), a); + update_connected_layer(*(l.uo), a); } void forward_lstm_layer(layer l, network state) @@ -383,16 +383,16 @@ void backward_lstm_layer(layer l, network state) } #ifdef GPU -void update_lstm_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) +void update_lstm_layer_gpu(layer l, update_args a) { - update_connected_layer_gpu(*(l.wf), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.wi), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.wg), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.wo), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.uf), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.ui), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.ug), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.uo), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.wf), a); + update_connected_layer_gpu(*(l.wi), a); + update_connected_layer_gpu(*(l.wg), a); + update_connected_layer_gpu(*(l.wo), a); + update_connected_layer_gpu(*(l.uf), a); + update_connected_layer_gpu(*(l.ui), a); + update_connected_layer_gpu(*(l.ug), a); + update_connected_layer_gpu(*(l.uo), a); } void forward_lstm_layer_gpu(layer l, network state) diff --git a/src/lstm_layer.h b/src/lstm_layer.h index 8ed387af7ec..b9f07e6424b 100644 --- a/src/lstm_layer.h +++ b/src/lstm_layer.h @@ -6,15 +6,15 @@ #include "network.h" #define USET -layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_normalize); +layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_normalize, int adam); void forward_lstm_layer(layer l, network net); -void update_lstm_layer(layer l, int batch, float learning, float momentum, float decay); +void update_lstm_layer(layer l, update_args a); #ifdef GPU void forward_lstm_layer_gpu(layer l, network net); void backward_lstm_layer_gpu(layer l, network net); -void update_lstm_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); +void update_lstm_layer_gpu(layer l, update_args a); #endif #endif diff --git a/src/network.c b/src/network.c index c1e9579e79c..0d2773e8629 100644 --- a/src/network.c +++ b/src/network.c @@ -65,9 +65,9 @@ network *load_network_p(char *cfg, char *weights, int clear) return net; } -int get_current_batch(network net) +size_t get_current_batch(network net) { - int batch_num = (*net.seen)/(net.batch*net.subdivisions); + size_t batch_num = (*net.seen)/(net.batch*net.subdivisions); return batch_num; } @@ -84,7 +84,7 @@ void reset_momentum(network net) float get_current_rate(network net) { - int batch_num = get_current_batch(net); + size_t batch_num = get_current_batch(net); int i; float rate; if (batch_num < net.burn_in) return net.learning_rate * pow((float)batch_num / net.burn_in, net.power); @@ -174,6 +174,7 @@ network make_network(int n) net.n = n; net.layers = calloc(net.n, sizeof(layer)); net.seen = calloc(1, sizeof(int)); + net.t = calloc(1, sizeof(int)); net.cost = calloc(1, sizeof(float)); return net; } @@ -199,12 +200,22 @@ void forward_network(network net) void update_network(network net) { int i; - int update_batch = net.batch*net.subdivisions; - float rate = get_current_rate(net); + update_args a = {0}; + a.batch = net.batch*net.subdivisions; + a.learning_rate = get_current_rate(net); + a.momentum = net.momentum; + a.decay = net.decay; + a.adam = net.adam; + a.B1 = net.B1; + a.B2 = net.B2; + a.eps = net.eps; + ++*net.t; + a.t = *net.t; + for(i = 0; i < net.n; ++i){ layer l = net.layers[i]; if(l.update){ - l.update(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); + l.update(l, a); } } } diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 28aa20ec31f..7c955309f7f 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -81,13 +81,22 @@ void update_network_gpu(network net) { cuda_set_device(net.gpu_index); int i; - int update_batch = net.batch*net.subdivisions; - float rate = get_current_rate(net); + update_args a = {0}; + a.batch = net.batch*net.subdivisions; + a.learning_rate = get_current_rate(net); + a.momentum = net.momentum; + a.decay = net.decay; + a.adam = net.adam; + a.B1 = net.B1; + a.B2 = net.B2; + a.eps = net.eps; + ++*net.t; + a.t = (*net.t); + for(i = 0; i < net.n; ++i){ layer l = net.layers[i]; - l.t = get_current_batch(net); if(l.update_gpu){ - l.update_gpu(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); + l.update_gpu(l, a); } } } diff --git a/src/parser.c b/src/parser.c index d5acc2e0b1f..703904166c6 100644 --- a/src/parser.c +++ b/src/parser.c @@ -191,11 +191,6 @@ convolutional_layer parse_convolutional(list *options, size_params params) convolutional_layer layer = make_convolutional_layer(batch,h,w,c,n,size,stride,padding,activation, batch_normalize, binary, xnor, params.net.adam); layer.flipped = option_find_int_quiet(options, "flipped", 0); layer.dot = option_find_float_quiet(options, "dot", 0); - if(params.net.adam){ - layer.B1 = params.net.B1; - layer.B2 = params.net.B2; - layer.eps = params.net.eps; - } return layer; } @@ -224,7 +219,7 @@ layer parse_rnn(list *options, size_params params) int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); int logistic = option_find_int_quiet(options, "logistic", 0); - layer l = make_rnn_layer(params.batch, params.inputs, hidden, output, params.time_steps, activation, batch_normalize, logistic); + layer l = make_rnn_layer(params.batch, params.inputs, hidden, output, params.time_steps, activation, batch_normalize, logistic, params.net.adam); l.shortcut = option_find_int_quiet(options, "shortcut", 0); @@ -236,7 +231,7 @@ layer parse_gru(list *options, size_params params) int output = option_find_int(options, "output",1); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - layer l = make_gru_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize); + layer l = make_gru_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize, params.net.adam); l.tanh = option_find_int_quiet(options, "tanh", 0); return l; @@ -247,21 +242,20 @@ layer parse_lstm(list *options, size_params params) int output = option_find_int(options, "output", 1); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - layer l = make_lstm_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize); + layer l = make_lstm_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize, params.net.adam); return l; } -connected_layer parse_connected(list *options, size_params params) +layer parse_connected(list *options, size_params params) { int output = option_find_int(options, "output",1); char *activation_s = option_find_str(options, "activation", "logistic"); ACTIVATION activation = get_activation(activation_s); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - connected_layer layer = make_connected_layer(params.batch, params.inputs, output, activation, batch_normalize); - - return layer; + layer l = make_connected_layer(params.batch, params.inputs, output, activation, batch_normalize, params.net.adam); + return l; } softmax_layer parse_softmax(list *options, size_params params) @@ -567,7 +561,7 @@ void parse_net_options(list *options, network *net) if(net->adam){ net->B1 = option_find_float(options, "B1", .9); net->B2 = option_find_float(options, "B2", .999); - net->eps = option_find_float(options, "eps", .00000001); + net->eps = option_find_float(options, "eps", .0000001); } net->h = option_find_int_quiet(options, "height",0); @@ -855,10 +849,6 @@ void save_convolutional_weights(layer l, FILE *fp) fwrite(l.rolling_variance, sizeof(float), l.n, fp); } fwrite(l.weights, sizeof(float), num, fp); - if(l.adam){ - //fwrite(l.m, sizeof(float), num, fp); - //fwrite(l.v, sizeof(float), num, fp); - } } void save_batchnorm_weights(layer l, FILE *fp) @@ -901,12 +891,12 @@ void save_weights_upto(network net, char *filename, int cutoff) if(!fp) file_error(filename); int major = 0; - int minor = 1; + int minor = 2; int revision = 0; fwrite(&major, sizeof(int), 1, fp); fwrite(&minor, sizeof(int), 1, fp); fwrite(&revision, sizeof(int), 1, fp); - fwrite(net.seen, sizeof(int), 1, fp); + fwrite(net.seen, sizeof(size_t), 1, fp); int i; for(i = 0; i < net.n && i < cutoff; ++i){ @@ -1068,10 +1058,6 @@ void load_convolutional_weights(layer l, FILE *fp) } } fread(l.weights, sizeof(float), num, fp); - if(l.adam){ - //fread(l.m, sizeof(float), num, fp); - //fread(l.v, sizeof(float), num, fp); - } //if(l.c == 3) scal_cpu(num, 1./256, l.weights, 1); if (l.flipped) { transpose_matrix(l.weights, l.c*l.size*l.size, l.n); @@ -1103,7 +1089,13 @@ void load_weights_upto(network *net, char *filename, int start, int cutoff) fread(&major, sizeof(int), 1, fp); fread(&minor, sizeof(int), 1, fp); fread(&revision, sizeof(int), 1, fp); - fread(net->seen, sizeof(int), 1, fp); + if ((major*10 + minor) >= 2){ + fread(net->seen, sizeof(size_t), 1, fp); + } else { + int iseen = 0; + fread(&iseen, sizeof(int), 1, fp); + *net->seen = iseen; + } int transpose = (major > 1000) || (minor > 1000); int i; diff --git a/src/rnn_layer.c b/src/rnn_layer.c index fb4f108434e..6ff9a0f88ed 100644 --- a/src/rnn_layer.c +++ b/src/rnn_layer.c @@ -26,7 +26,7 @@ static void increment_layer(layer *l, int steps) #endif } -layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, ACTIVATION activation, int batch_normalize, int log) +layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, ACTIVATION activation, int batch_normalize, int log, int adam) { fprintf(stderr, "RNN Layer: %d inputs, %d outputs\n", inputs, outputs); batch = batch / steps; @@ -41,17 +41,17 @@ layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, l.input_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.input_layer) = make_connected_layer(batch*steps, inputs, hidden, activation, batch_normalize); + *(l.input_layer) = make_connected_layer(batch*steps, inputs, hidden, activation, batch_normalize, adam); l.input_layer->batch = batch; l.self_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.self_layer) = make_connected_layer(batch*steps, hidden, hidden, (log==2)?LOGGY:(log==1?LOGISTIC:activation), batch_normalize); + *(l.self_layer) = make_connected_layer(batch*steps, hidden, hidden, (log==2)?LOGGY:(log==1?LOGISTIC:activation), batch_normalize, adam); l.self_layer->batch = batch; l.output_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.output_layer) = make_connected_layer(batch*steps, hidden, outputs, activation, batch_normalize); + *(l.output_layer) = make_connected_layer(batch*steps, hidden, outputs, activation, batch_normalize, adam); l.output_layer->batch = batch; l.outputs = outputs; @@ -73,11 +73,11 @@ layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, return l; } -void update_rnn_layer(layer l, int batch, float learning_rate, float momentum, float decay) +void update_rnn_layer(layer l, update_args a) { - update_connected_layer(*(l.input_layer), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.self_layer), batch, learning_rate, momentum, decay); - update_connected_layer(*(l.output_layer), batch, learning_rate, momentum, decay); + update_connected_layer(*(l.input_layer), a); + update_connected_layer(*(l.self_layer), a); + update_connected_layer(*(l.output_layer), a); } void forward_rnn_layer(layer l, network net) @@ -187,11 +187,11 @@ void push_rnn_layer(layer l) push_connected_layer(*(l.output_layer)); } -void update_rnn_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay) +void update_rnn_layer_gpu(layer l, update_args a) { - update_connected_layer_gpu(*(l.input_layer), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.self_layer), batch, learning_rate, momentum, decay); - update_connected_layer_gpu(*(l.output_layer), batch, learning_rate, momentum, decay); + update_connected_layer_gpu(*(l.input_layer), a); + update_connected_layer_gpu(*(l.self_layer), a); + update_connected_layer_gpu(*(l.output_layer), a); } void forward_rnn_layer_gpu(layer l, network net) diff --git a/src/rnn_layer.h b/src/rnn_layer.h index 782a90ef5c0..37e1f1ca801 100644 --- a/src/rnn_layer.h +++ b/src/rnn_layer.h @@ -7,16 +7,16 @@ #include "network.h" #define USET -layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, ACTIVATION activation, int batch_normalize, int log); +layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, ACTIVATION activation, int batch_normalize, int log, int adam); void forward_rnn_layer(layer l, network net); void backward_rnn_layer(layer l, network net); -void update_rnn_layer(layer l, int batch, float learning_rate, float momentum, float decay); +void update_rnn_layer(layer l, update_args a); #ifdef GPU void forward_rnn_layer_gpu(layer l, network net); void backward_rnn_layer_gpu(layer l, network net); -void update_rnn_layer_gpu(layer l, int batch, float learning_rate, float momentum, float decay); +void update_rnn_layer_gpu(layer l, update_args a); void push_rnn_layer(layer l); void pull_rnn_layer(layer l); #endif From 8215a8864d4ad07e058acafd75b2c6ff6600b9e8 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 18 Jun 2017 13:05:37 -0700 Subject: [PATCH 035/118] :fire: :bug: :fire: --- Makefile | 6 +- cfg/gru.cfg | 31 +++--- examples/darknet.c | 20 ++++ examples/lsd.c | 68 ++++++------ examples/nightmare.c | 4 +- examples/rnn.c | 5 +- examples/segmenter.c | 29 ++++-- include/darknet.h | 19 +++- src/activation_kernels.cu | 4 +- src/activation_layer.c | 8 +- src/activations.h | 4 +- src/batchnorm_layer.c | 20 ++-- src/blas.c | 46 +++++++++ src/blas.h | 34 +++--- src/blas_kernels.cu | 109 ++++++++++++++----- src/col2im.h | 2 +- src/col2im_kernels.cu | 2 +- src/connected_layer.c | 28 ++--- src/convolutional_kernels.cu | 38 +++---- src/cost_layer.c | 20 ++-- src/crnn_layer.c | 24 ++--- src/cuda.c | 2 +- src/data.c | 37 ++++++- src/deconvolutional_kernels.cu | 32 +++--- src/detection_layer.c | 6 +- src/gemm.c | 58 ++++------- src/gemm.h | 2 +- src/gru_layer.c | 93 +++++++++-------- src/im2col.h | 2 +- src/im2col_kernels.cu | 2 +- src/local_layer.c | 30 +++--- src/lstm_layer.c | 184 ++++++++++++++++----------------- src/network_kernels.cu | 9 +- src/normalization_layer.c | 22 ++-- src/parser.c | 41 +++++--- src/region_layer.c | 12 +-- src/reorg_layer.c | 20 ++-- src/rnn_layer.c | 107 ++++++++++--------- src/rnn_layer.h | 2 +- src/route_layer.c | 4 +- src/shortcut_layer.c | 8 +- src/softmax_layer.c | 2 +- 42 files changed, 699 insertions(+), 497 deletions(-) diff --git a/Makefile b/Makefile index 2f724f551af..a0393b535e4 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -GPU=1 -CUDNN=1 -OPENCV=1 +GPU=0 +CUDNN=0 +OPENCV=0 DEBUG=0 ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ diff --git a/cfg/gru.cfg b/cfg/gru.cfg index ea0e22d9356..1b5363ca346 100644 --- a/cfg/gru.cfg +++ b/cfg/gru.cfg @@ -1,23 +1,24 @@ [net] -inputs=256 - -# Test -batch = 1 -time_steps=1 - -# Train -# batch = 512 -# time_steps=64 - subdivisions=1 +batch = 256 +inputs=256 momentum=0.9 -decay=0.001 -learning_rate=0.1 +decay=0.0 +time_steps=128 +learning_rate=.002 +adam=1 -burn_in=100 -policy=poly +policy=constant power=4 -max_batches=10000 +max_batches=400000 + +[gru] +batch_normalize=1 +output = 1024 + +[gru] +batch_normalize=1 +output = 1024 [gru] batch_normalize=1 diff --git a/examples/darknet.c b/examples/darknet.c index 31652b12f37..92f42bca81a 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -112,6 +112,26 @@ void operations(char *cfgfile) ops += 2l * l.n * l.size*l.size*l.c * l.out_h*l.out_w; } else if(l.type == CONNECTED){ ops += 2l * l.inputs * l.outputs; + } else if (l.type == RNN){ + ops += 2l * l.input_layer->inputs * l.input_layer->outputs; + ops += 2l * l.self_layer->inputs * l.self_layer->outputs; + ops += 2l * l.output_layer->inputs * l.output_layer->outputs; + } else if (l.type == GRU){ + ops += 2l * l.uz->inputs * l.uz->outputs; + ops += 2l * l.uh->inputs * l.uh->outputs; + ops += 2l * l.ur->inputs * l.ur->outputs; + ops += 2l * l.wz->inputs * l.wz->outputs; + ops += 2l * l.wh->inputs * l.wh->outputs; + ops += 2l * l.wr->inputs * l.wr->outputs; + } else if (l.type == LSTM){ + ops += 2l * l.uf->inputs * l.uf->outputs; + ops += 2l * l.ui->inputs * l.ui->outputs; + ops += 2l * l.ug->inputs * l.ug->outputs; + ops += 2l * l.uo->inputs * l.uo->outputs; + ops += 2l * l.wf->inputs * l.wf->outputs; + ops += 2l * l.wi->inputs * l.wi->outputs; + ops += 2l * l.wg->inputs * l.wg->outputs; + ops += 2l * l.wo->inputs * l.wo->outputs; } } printf("Floating Point Operations: %ld\n", ops); diff --git a/examples/lsd.c b/examples/lsd.c index 1b2b0b5f3b0..8f5a1a1c13b 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -64,7 +64,7 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg int ax_size = anet.inputs*anet.batch; int ay_size = anet.truths*anet.batch; - fill_ongpu(ay_size, .9, anet.truth_gpu, 1); + fill_gpu(ay_size, .9, anet.truth_gpu, 1); anet.delta_gpu = cuda_make_array(0, ax_size); anet.train = 1; @@ -102,36 +102,36 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg forward_network_gpu(fnet, fstate); float *feats = fnet.layers[fnet.n - 2].output_gpu; - copy_ongpu(y_size, feats, 1, fstate.truth, 1); + copy_gpu(y_size, feats, 1, fstate.truth, 1); forward_network_gpu(gnet, gstate); float *gen = gnet.layers[gnet.n-1].output_gpu; - copy_ongpu(x_size, gen, 1, fstate.input, 1); + copy_gpu(x_size, gen, 1, fstate.input, 1); - fill_ongpu(x_size, 0, fstate.delta, 1); + fill_gpu(x_size, 0, fstate.delta, 1); forward_network_gpu(fnet, fstate); backward_network_gpu(fnet, fstate); //HERE astate.input = gen; - fill_ongpu(ax_size, 0, astate.delta, 1); + fill_gpu(ax_size, 0, astate.delta, 1); forward_network_gpu(anet, astate); backward_network_gpu(anet, astate); float *delta = imlayer.delta_gpu; - fill_ongpu(x_size, 0, delta, 1); - scal_ongpu(x_size, 100, astate.delta, 1); - scal_ongpu(x_size, .001, fstate.delta, 1); - axpy_ongpu(x_size, 1, fstate.delta, 1, delta, 1); - axpy_ongpu(x_size, 1, astate.delta, 1, delta, 1); + fill_gpu(x_size, 0, delta, 1); + scal_gpu(x_size, 100, astate.delta, 1); + scal_gpu(x_size, .001, fstate.delta, 1); + axpy_gpu(x_size, 1, fstate.delta, 1, delta, 1); + axpy_gpu(x_size, 1, astate.delta, 1, delta, 1); - //fill_ongpu(x_size, 0, delta, 1); + //fill_gpu(x_size, 0, delta, 1); //cuda_push_array(delta, X, x_size); - //axpy_ongpu(x_size, -1, imlayer.output_gpu, 1, delta, 1); + //axpy_gpu(x_size, -1, imlayer.output_gpu, 1, delta, 1); //printf("pix error: %f\n", cuda_mag_array(delta, x_size)); printf("fea error: %f\n", cuda_mag_array(fstate.delta, x_size)); printf("adv error: %f\n", cuda_mag_array(astate.delta, x_size)); - //axpy_ongpu(x_size, 1, astate.delta, 1, delta, 1); + //axpy_gpu(x_size, 1, astate.delta, 1, delta, 1); backward_network_gpu(gnet, gstate); @@ -273,7 +273,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear float *imerror = cuda_make_array(0, imlayer.outputs); float *ones_gpu = cuda_make_array(0, ay_size); - fill_ongpu(ay_size, .9, ones_gpu, 1); + fill_gpu(ay_size, .9, ones_gpu, 1); float aloss_avg = -1; float gloss_avg = -1; @@ -318,23 +318,23 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear *net.seen += net.batch; forward_network_gpu(net, gstate); - fill_ongpu(imlayer.outputs, 0, imerror, 1); + fill_gpu(imlayer.outputs, 0, imerror, 1); astate.input = imlayer.output_gpu; astate.delta = imerror; astate.truth = ones_gpu; forward_network_gpu(anet, astate); backward_network_gpu(anet, astate); - scal_ongpu(imlayer.outputs, .1, net.layers[net.n-1].delta_gpu, 1); + scal_gpu(imlayer.outputs, .1, net.layers[net.n-1].delta_gpu, 1); backward_network_gpu(net, gstate); - scal_ongpu(imlayer.outputs, 1000, imerror, 1); + scal_gpu(imlayer.outputs, 1000, imerror, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs)); - axpy_ongpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); + axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); gloss += get_network_cost(net) /(net.subdivisions*net.batch); @@ -533,9 +533,9 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, *gnet.seen += gnet.batch; forward_network_gpu(gnet); - fill_ongpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); - fill_ongpu(anet.truths*anet.batch, .95, anet.truth_gpu, 1); - copy_ongpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1); + fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); + fill_gpu(anet.truths*anet.batch, .95, anet.truth_gpu, 1); + copy_gpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1); anet.delta_gpu = imerror; forward_network_gpu(anet); backward_network_gpu(anet); @@ -543,13 +543,13 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, float genaloss = *anet.cost / anet.batch; printf("%f\n", genaloss); - scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); - scal_ongpu(imlayer.outputs*imlayer.batch, .00, gnet.layers[gnet.n-1].delta_gpu, 1); + scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); + scal_gpu(imlayer.outputs*imlayer.batch, .00, gnet.layers[gnet.n-1].delta_gpu, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); printf("features %f\n", cuda_mag_array(gnet.layers[gnet.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); - axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet.layers[gnet.n-1].delta_gpu, 1); + axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet.layers[gnet.n-1].delta_gpu, 1); backward_network_gpu(gnet); @@ -716,21 +716,21 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle *net.seen += net.batch; forward_network_gpu(net); - fill_ongpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); - copy_ongpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1); - fill_ongpu(anet.inputs*anet.batch, .95, anet.truth_gpu, 1); + fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); + copy_gpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1); + fill_gpu(anet.inputs*anet.batch, .95, anet.truth_gpu, 1); anet.delta_gpu = imerror; forward_network_gpu(anet); backward_network_gpu(anet); - scal_ongpu(imlayer.outputs*imlayer.batch, 1./100., net.layers[net.n-1].delta_gpu, 1); + scal_gpu(imlayer.outputs*imlayer.batch, 1./100., net.layers[net.n-1].delta_gpu, 1); - scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); + scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); - axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1); + axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1); backward_network_gpu(net); @@ -876,7 +876,7 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi float *imerror = cuda_make_array(0, imlayer.outputs); float *ones_gpu = cuda_make_array(0, ay_size); - fill_ongpu(ay_size, 1, ones_gpu, 1); + fill_gpu(ay_size, 1, ones_gpu, 1); float aloss_avg = -1; float gloss_avg = -1; @@ -902,15 +902,15 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi *net.seen += net.batch; forward_network_gpu(net, gstate); - fill_ongpu(imlayer.outputs, 0, imerror, 1); + fill_gpu(imlayer.outputs, 0, imerror, 1); astate.input = imlayer.output_gpu; astate.delta = imerror; astate.truth = ones_gpu; forward_network_gpu(anet, astate); backward_network_gpu(anet, astate); - scal_ongpu(imlayer.outputs, 1, imerror, 1); - axpy_ongpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); + scal_gpu(imlayer.outputs, 1, imerror, 1); + axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); backward_network_gpu(net, gstate); diff --git a/examples/nightmare.c b/examples/nightmare.c index fe7c5f7fa1b..6763f116759 100644 --- a/examples/nightmare.c +++ b/examples/nightmare.c @@ -50,7 +50,7 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa cuda_push_array(net->input_gpu, im.data, net->inputs); forward_network_gpu(*net); - copy_ongpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1); + copy_gpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1); cuda_pull_array(last.delta_gpu, last.delta, last.outputs); calculate_loss(last.delta, last.delta, last.outputs, thresh); @@ -141,7 +141,7 @@ void reconstruct_picture(network net, float *features, image recon, image update forward_network_gpu(net); cuda_push_array(l.delta_gpu, features, l.outputs); - axpy_ongpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1); + axpy_gpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1); backward_network_gpu(net); cuda_pull_array(net.delta_gpu, delta.data, delta.w*delta.h*delta.c); diff --git a/examples/rnn.c b/examples/rnn.c index 1c45711dcc6..8d1fa2424d6 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -114,7 +114,10 @@ void reset_rnn_state(network net, int b) #ifdef GPU layer l = net.layers[i]; if(l.state_gpu){ - fill_ongpu(l.outputs, 0, l.state_gpu + l.outputs*b, 1); + fill_gpu(l.outputs, 0, l.state_gpu + l.outputs*b, 1); + } + if(l.h_gpu){ + fill_gpu(l.outputs, 0, l.h_gpu + l.outputs*b, 1); } #endif } diff --git a/examples/segmenter.c b/examples/segmenter.c index 325593eda45..e3804d3704c 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -27,6 +27,11 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, } srand(time(0)); network net = nets[0]; + image pred = get_network_image(net); + + int div = net.w/pred.w; + assert(pred.w * div == net.w); + assert(pred.h * div == net.h); int imgs = net.batch * net.subdivisions * ngpus; @@ -46,6 +51,7 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, args.w = net.w; args.h = net.h; args.threads = 32; + args.scale = div; args.min = net.min_crop; args.max = net.max_crop; @@ -75,15 +81,6 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, pthread_join(load_thread, 0); train = buffer; load_thread = load_data(args); - image tr = float_to_image(net.w, net.h, 81, train.y.vals[0]); - image im = float_to_image(net.w, net.h, net.c, train.X.vals[0]); - image mask = mask_to_rgb(tr); - show_image(im, "input"); - show_image(mask, "truth"); -#ifdef OPENCV - cvWaitKey(100); -#endif - free_image(mask); printf("Loaded: %lf seconds\n", sec(clock()-time)); time=clock(); @@ -98,6 +95,20 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #else loss = train_network(net, train); #endif + if(1){ + image tr = float_to_image(net.w/div, net.h/div, 80, train.y.vals[net.batch]); + image im = float_to_image(net.w, net.h, net.c, train.X.vals[net.batch]); + image mask = mask_to_rgb(tr); + image prmask = mask_to_rgb(pred); + show_image(im, "input"); + show_image(prmask, "pred"); + show_image(mask, "truth"); +#ifdef OPENCV + cvWaitKey(100); +#endif + free_image(mask); + free_image(prmask); + } if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); diff --git a/include/darknet.h b/include/darknet.h index 8d4366b68cf..8ae68eb42a5 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -84,7 +84,7 @@ typedef enum { } LAYER_TYPE; typedef enum{ - SSE, MASKED, L1, SMOOTH + SSE, MASKED, L1, SEG, SMOOTH } COST_TYPE; typedef struct{ @@ -203,6 +203,8 @@ struct layer{ float * forgot_state; float * forgot_delta; float * state_delta; + float * combine_cpu; + float * combine_delta_cpu; float * concat; float * concat_delta; @@ -271,6 +273,10 @@ struct layer{ struct layer *self_layer; struct layer *output_layer; + struct layer *reset_layer; + struct layer *update_layer; + struct layer *state_layer; + struct layer *input_gate_layer; struct layer *state_gate_layer; struct layer *input_save_layer; @@ -335,6 +341,9 @@ struct layer{ float *bias_v_gpu; float *scale_v_gpu; + float * combine_gpu; + float * combine_delta_gpu; + float * prev_state_gpu; float * forgot_state_gpu; float * forgot_delta_gpu; @@ -575,10 +584,10 @@ void normalize_cpu(float *x, float *mean, float *variance, int batch, int filter int best_3d_shift_r(image a, image b, int min, int max); #ifdef GPU -void axpy_ongpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY); -void fill_ongpu(int N, float ALPHA, float * X, int INCX); -void scal_ongpu(int N, float ALPHA, float * X, int INCX); -void copy_ongpu(int N, float * X, int INCX, float * Y, int INCY); +void axpy_gpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY); +void fill_gpu(int N, float ALPHA, float * X, int INCX); +void scal_gpu(int N, float ALPHA, float * X, int INCX); +void copy_gpu(int N, float * X, int INCX, float * Y, int INCY); void cuda_set_device(int n); void cuda_free(float *x_gpu); diff --git a/src/activation_kernels.cu b/src/activation_kernels.cu index 994e2068146..73530056246 100644 --- a/src/activation_kernels.cu +++ b/src/activation_kernels.cu @@ -152,13 +152,13 @@ __global__ void gradient_array_kernel(float *x, int n, ACTIVATION a, float *delt if(i < n) delta[i] *= gradient_kernel(x[i], a); } -extern "C" void activate_array_ongpu(float *x, int n, ACTIVATION a) +extern "C" void activate_array_gpu(float *x, int n, ACTIVATION a) { activate_array_kernel<<>>(x, n, a); check_error(cudaPeekAtLastError()); } -extern "C" void gradient_array_ongpu(float *x, int n, ACTIVATION a, float *delta) +extern "C" void gradient_array_gpu(float *x, int n, ACTIVATION a, float *delta) { gradient_array_kernel<<>>(x, n, a, delta); check_error(cudaPeekAtLastError()); diff --git a/src/activation_layer.c b/src/activation_layer.c index de4e4b7d09b..b4ba953967b 100644 --- a/src/activation_layer.c +++ b/src/activation_layer.c @@ -51,13 +51,13 @@ void backward_activation_layer(layer l, network net) void forward_activation_layer_gpu(layer l, network net) { - copy_ongpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); - activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); + copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); + activate_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation); } void backward_activation_layer_gpu(layer l, network net) { - gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); - copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, net.delta_gpu, 1); + gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); + copy_gpu(l.outputs*l.batch, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/activations.h b/src/activations.h index 54ab3c22778..d456dbe3c2b 100644 --- a/src/activations.h +++ b/src/activations.h @@ -12,8 +12,8 @@ float gradient(float x, ACTIVATION a); void gradient_array(const float *x, const int n, const ACTIVATION a, float *delta); void activate_array(float *x, const int n, const ACTIVATION a); #ifdef GPU -void activate_array_ongpu(float *x, int n, ACTIVATION a); -void gradient_array_ongpu(float *x, int n, ACTIVATION a, float *delta); +void activate_array_gpu(float *x, int n, ACTIVATION a); +void gradient_array_gpu(float *x, int n, ACTIVATION a, float *delta); #endif static inline float stair_activate(float x) diff --git a/src/batchnorm_layer.c b/src/batchnorm_layer.c index 4862531d8eb..ebff387cc4b 100644 --- a/src/batchnorm_layer.c +++ b/src/batchnorm_layer.c @@ -188,8 +188,8 @@ void push_batchnorm_layer(layer l) void forward_batchnorm_layer_gpu(layer l, network net) { - if(l.type == BATCHNORM) copy_ongpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); + if(l.type == BATCHNORM) copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); + copy_gpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); if (net.train) { #ifdef CUDNN float one = 1; @@ -215,14 +215,14 @@ void forward_batchnorm_layer_gpu(layer l, network net) fast_mean_gpu(l.output_gpu, l.batch, l.out_c, l.out_h*l.out_w, l.mean_gpu); fast_variance_gpu(l.output_gpu, l.mean_gpu, l.batch, l.out_c, l.out_h*l.out_w, l.variance_gpu); - scal_ongpu(l.out_c, .99, l.rolling_mean_gpu, 1); - axpy_ongpu(l.out_c, .01, l.mean_gpu, 1, l.rolling_mean_gpu, 1); - scal_ongpu(l.out_c, .99, l.rolling_variance_gpu, 1); - axpy_ongpu(l.out_c, .01, l.variance_gpu, 1, l.rolling_variance_gpu, 1); + scal_gpu(l.out_c, .99, l.rolling_mean_gpu, 1); + axpy_gpu(l.out_c, .01, l.mean_gpu, 1, l.rolling_mean_gpu, 1); + scal_gpu(l.out_c, .99, l.rolling_variance_gpu, 1); + axpy_gpu(l.out_c, .01, l.variance_gpu, 1, l.rolling_variance_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); + copy_gpu(l.outputs*l.batch, l.output_gpu, 1, l.x_gpu, 1); normalize_gpu(l.output_gpu, l.mean_gpu, l.variance_gpu, l.batch, l.out_c, l.out_h*l.out_w); - copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.x_norm_gpu, 1); + copy_gpu(l.outputs*l.batch, l.output_gpu, 1, l.x_norm_gpu, 1); scale_bias_gpu(l.output_gpu, l.scales_gpu, l.batch, l.out_c, l.out_h*l.out_w); add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.out_c, l.out_w*l.out_h); @@ -263,7 +263,7 @@ void backward_batchnorm_layer_gpu(layer l, network net) .00001, l.mean_gpu, l.variance_gpu); - copy_ongpu(l.outputs*l.batch, l.x_norm_gpu, 1, l.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.x_norm_gpu, 1, l.delta_gpu, 1); #else backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.out_c, l.out_w*l.out_h); backward_scale_gpu(l.x_norm_gpu, l.delta_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.scale_updates_gpu); @@ -274,6 +274,6 @@ void backward_batchnorm_layer_gpu(layer l, network net) fast_variance_delta_gpu(l.x_gpu, l.delta_gpu, l.mean_gpu, l.variance_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.variance_delta_gpu); normalize_delta_gpu(l.x_gpu, l.mean_gpu, l.variance_gpu, l.mean_delta_gpu, l.variance_delta_gpu, l.batch, l.out_c, l.out_w*l.out_h, l.delta_gpu); #endif - if(l.type == BATCHNORM) copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, net.delta_gpu, 1); + if(l.type == BATCHNORM) copy_gpu(l.outputs*l.batch, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/blas.c b/src/blas.c index 668b12c3703..d25c1969e0f 100644 --- a/src/blas.c +++ b/src/blas.c @@ -55,6 +55,16 @@ void weighted_sum_cpu(float *a, float *b, float *s, int n, float *c) } } +void weighted_delta_cpu(float *a, float *b, float *s, float *da, float *db, float *ds, int n, float *dc) +{ + int i; + for(i = 0; i < n; ++i){ + if(da) da[i] += dc[i] * s[i]; + if(db) db[i] += dc[i] * (1-s[i]); + ds[i] += dc[i] * (a[i] - b[i]); + } +} + void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out) { int stride = w1/w2; @@ -162,12 +172,48 @@ void fill_cpu(int N, float ALPHA, float *X, int INCX) for(i = 0; i < N; ++i) X[i*INCX] = ALPHA; } +void deinter_cpu(int NX, float *X, int NY, float *Y, int B, float *OUT) +{ + int i, j; + int index = 0; + for(j = 0; j < B; ++j) { + for(i = 0; i < NX; ++i){ + if(X) X[j*NX + i] += OUT[index]; + ++index; + } + for(i = 0; i < NY; ++i){ + if(Y) Y[j*NY + i] += OUT[index]; + ++index; + } + } +} + +void inter_cpu(int NX, float *X, int NY, float *Y, int B, float *OUT) +{ + int i, j; + int index = 0; + for(j = 0; j < B; ++j) { + for(i = 0; i < NX; ++i){ + OUT[index++] = X[j*NX + i]; + } + for(i = 0; i < NY; ++i){ + OUT[index++] = Y[j*NY + i]; + } + } +} + void copy_cpu(int N, float *X, int INCX, float *Y, int INCY) { int i; for(i = 0; i < N; ++i) Y[i*INCY] = X[i*INCX]; } +void mult_add_into_cpu(int N, float *X, float *Y, float *Z) +{ + int i; + for(i = 0; i < N; ++i) Z[i] += X[i]*Y[i]; +} + void smooth_l1_cpu(int n, float *pred, float *truth, float *delta, float *error) { int i; diff --git a/src/blas.h b/src/blas.h index 6291746fc48..a8408f32c62 100644 --- a/src/blas.h +++ b/src/blas.h @@ -10,8 +10,12 @@ void reorg_cpu(float *x, int w, int h, int c, int batch, int stride, int forward void test_blas(); +void inter_cpu(int NX, float *X, int NY, float *Y, int B, float *OUT); +void deinter_cpu(int NX, float *X, int NY, float *Y, int B, float *OUT); +void mult_add_into_cpu(int N, float *X, float *Y, float *Z); + void const_cpu(int N, float ALPHA, float *X, int INCX); -void constrain_ongpu(int N, float ALPHA, float * X, int INCX); +void constrain_gpu(int N, float ALPHA, float * X, int INCX); void pow_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void mul_cpu(int N, float *X, int INCX, float *Y, int INCY); @@ -33,6 +37,7 @@ void smooth_l1_cpu(int n, float *pred, float *truth, float *delta, float *error) void l2_cpu(int n, float *pred, float *truth, float *delta, float *error); void l1_cpu(int n, float *pred, float *truth, float *delta, float *error); void weighted_sum_cpu(float *a, float *b, float *s, int num, float *c); +void weighted_delta_cpu(float *a, float *b, float *s, float *da, float *db, float *ds, int n, float *dc); void softmax(float *input, int n, float temp, int stride, float *output); void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output); @@ -41,16 +46,17 @@ void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, i #include "cuda.h" #include "tree.h" -void axpy_ongpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY); -void axpy_ongpu_offset(int N, float ALPHA, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); -void copy_ongpu(int N, float * X, int INCX, float * Y, int INCY); -void copy_ongpu_offset(int N, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); -void add_ongpu(int N, float ALPHA, float * X, int INCX); -void supp_ongpu(int N, float ALPHA, float * X, int INCX); -void mask_ongpu(int N, float * X, float mask_num, float * mask); -void const_ongpu(int N, float ALPHA, float *X, int INCX); -void pow_ongpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); -void mul_ongpu(int N, float *X, int INCX, float *Y, int INCY); +void axpy_gpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY); +void axpy_gpu_offset(int N, float ALPHA, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); +void copy_gpu(int N, float * X, int INCX, float * Y, int INCY); +void copy_gpu_offset(int N, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); +void add_gpu(int N, float ALPHA, float * X, int INCX); +void supp_gpu(int N, float ALPHA, float * X, int INCX); +void mask_gpu(int N, float * X, float mask_num, float * mask); +void scale_mask_gpu(int N, float * X, float mask_num, float * mask, float scale); +void const_gpu(int N, float ALPHA, float *X, int INCX); +void pow_gpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); +void mul_gpu(int N, float *X, int INCX, float *Y, int INCY); void mean_gpu(float *x, int batch, int filters, int spatial, float *mean); void variance_gpu(float *x, float *mean, int batch, int filters, int spatial, float *variance); @@ -76,14 +82,16 @@ void l1_gpu(int n, float *pred, float *truth, float *delta, float *error); void weighted_delta_gpu(float *a, float *b, float *s, float *da, float *db, float *ds, int num, float *dc); void weighted_sum_gpu(float *a, float *b, float *s, int num, float *c); void mult_add_into_gpu(int num, float *a, float *b, float *c); +void inter_gpu(int NX, float *X, int NY, float *Y, int B, float *OUT); +void deinter_gpu(int NX, float *X, int NY, float *Y, int B, float *OUT); -void reorg_ongpu(float *x, int w, int h, int c, int batch, int stride, int forward, float *out); +void reorg_gpu(float *x, int w, int h, int c, int batch, int stride, int forward, float *out); void softmax_gpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output); void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch, int t); void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rate, float eps, int t); -void flatten_ongpu(float *x, int spatial, int layers, int batch, int forward, float *out); +void flatten_gpu(float *x, int spatial, int layers, int batch, int forward, float *out); void softmax_tree(float *input, int spatial, int batch, int stride, float temp, float *output, tree hier); #endif diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index 6fdfd3fa764..484d469e155 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -176,16 +176,16 @@ extern "C" void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2 extern "C" void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch, int t) { - scal_ongpu(n, B1, m, 1); - scal_ongpu(n, B2, v, 1); - axpy_ongpu(n, -decay*batch, w, 1, d, 1); + scal_gpu(n, B1, m, 1); + scal_gpu(n, B2, v, 1); + axpy_gpu(n, -decay*batch, w, 1, d, 1); - axpy_ongpu(n, (1-B1), d, 1, m, 1); - mul_ongpu(n, d, 1, d, 1); - axpy_ongpu(n, (1-B2), d, 1, v, 1); + axpy_gpu(n, (1-B1), d, 1, m, 1); + mul_gpu(n, d, 1, d, 1); + axpy_gpu(n, (1-B2), d, 1, v, 1); - adam_gpu(n, w, m, v, B1, B2, rate/batch, eps, t); - fill_ongpu(n, 0, d, 1); + adam_gpu(n, w, m, v, B1, B2, rate, eps, t); + fill_gpu(n, 0, d, 1); } __global__ void normalize_kernel(int N, float *x, float *mean, float *variance, int batch, int filters, int spatial) @@ -556,35 +556,35 @@ extern "C" void variance_gpu(float *x, float *mean, int batch, int filters, int check_error(cudaPeekAtLastError()); } -extern "C" void axpy_ongpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY) +extern "C" void axpy_gpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY) { - axpy_ongpu_offset(N, ALPHA, X, 0, INCX, Y, 0, INCY); + axpy_gpu_offset(N, ALPHA, X, 0, INCX, Y, 0, INCY); } -extern "C" void pow_ongpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY) +extern "C" void pow_gpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY) { pow_kernel<<>>(N, ALPHA, X, INCX, Y, INCY); check_error(cudaPeekAtLastError()); } -extern "C" void axpy_ongpu_offset(int N, float ALPHA, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY) +extern "C" void axpy_gpu_offset(int N, float ALPHA, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY) { axpy_kernel<<>>(N, ALPHA, X, OFFX, INCX, Y, OFFY, INCY); check_error(cudaPeekAtLastError()); } -extern "C" void copy_ongpu(int N, float * X, int INCX, float * Y, int INCY) +extern "C" void copy_gpu(int N, float * X, int INCX, float * Y, int INCY) { - copy_ongpu_offset(N, X, 0, INCX, Y, 0, INCY); + copy_gpu_offset(N, X, 0, INCX, Y, 0, INCY); } -extern "C" void mul_ongpu(int N, float * X, int INCX, float * Y, int INCY) +extern "C" void mul_gpu(int N, float * X, int INCX, float * Y, int INCY) { mul_kernel<<>>(N, X, INCX, Y, INCY); check_error(cudaPeekAtLastError()); } -extern "C" void copy_ongpu_offset(int N, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY) +extern "C" void copy_gpu_offset(int N, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY) { copy_kernel<<>>(N, X, OFFX, INCX, Y, OFFY, INCY); check_error(cudaPeekAtLastError()); @@ -607,58 +607,70 @@ __global__ void flatten_kernel(int N, float *x, int spatial, int layers, int bat else out[i1] = x[i2]; } -extern "C" void flatten_ongpu(float *x, int spatial, int layers, int batch, int forward, float *out) +extern "C" void flatten_gpu(float *x, int spatial, int layers, int batch, int forward, float *out) { int size = spatial*batch*layers; flatten_kernel<<>>(size, x, spatial, layers, batch, forward, out); check_error(cudaPeekAtLastError()); } -extern "C" void reorg_ongpu(float *x, int w, int h, int c, int batch, int stride, int forward, float *out) +extern "C" void reorg_gpu(float *x, int w, int h, int c, int batch, int stride, int forward, float *out) { int size = w*h*c*batch; reorg_kernel<<>>(size, x, w, h, c, batch, stride, forward, out); check_error(cudaPeekAtLastError()); } -extern "C" void mask_ongpu(int N, float * X, float mask_num, float * mask) +__global__ void scale_mask_kernel(int n, float *x, float mask_num, float *mask, float scale) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < n && mask[i] == mask_num) x[i] *= scale; +} + +extern "C" void scale_mask_gpu(int N, float * X, float mask_num, float * mask, float scale) +{ + scale_mask_kernel<<>>(N, X, mask_num, mask, scale); + check_error(cudaPeekAtLastError()); +} + +extern "C" void mask_gpu(int N, float * X, float mask_num, float * mask) { mask_kernel<<>>(N, X, mask_num, mask); check_error(cudaPeekAtLastError()); } -extern "C" void const_ongpu(int N, float ALPHA, float * X, int INCX) +extern "C" void const_gpu(int N, float ALPHA, float * X, int INCX) { const_kernel<<>>(N, ALPHA, X, INCX); check_error(cudaPeekAtLastError()); } -extern "C" void constrain_ongpu(int N, float ALPHA, float * X, int INCX) +extern "C" void constrain_gpu(int N, float ALPHA, float * X, int INCX) { constrain_kernel<<>>(N, ALPHA, X, INCX); check_error(cudaPeekAtLastError()); } -extern "C" void add_ongpu(int N, float ALPHA, float * X, int INCX) +extern "C" void add_gpu(int N, float ALPHA, float * X, int INCX) { add_kernel<<>>(N, ALPHA, X, INCX); check_error(cudaPeekAtLastError()); } -extern "C" void scal_ongpu(int N, float ALPHA, float * X, int INCX) +extern "C" void scal_gpu(int N, float ALPHA, float * X, int INCX) { scal_kernel<<>>(N, ALPHA, X, INCX); check_error(cudaPeekAtLastError()); } -extern "C" void supp_ongpu(int N, float ALPHA, float * X, int INCX) +extern "C" void supp_gpu(int N, float ALPHA, float * X, int INCX) { supp_kernel<<>>(N, ALPHA, X, INCX); check_error(cudaPeekAtLastError()); } -extern "C" void fill_ongpu(int N, float ALPHA, float * X, int INCX) +extern "C" void fill_gpu(int N, float ALPHA, float * X, int INCX) { fill_kernel<<>>(N, ALPHA, X, INCX); check_error(cudaPeekAtLastError()); @@ -686,6 +698,9 @@ extern "C" void shortcut_gpu(int batch, int w1, int h1, int c1, float *add, int int minw = (w1 < w2) ? w1 : w2; int minh = (h1 < h2) ? h1 : h2; int minc = (c1 < c2) ? c1 : c2; + assert(w1 == w2); + assert(h1 == h2); + assert(c1 == c2); int stride = w1/w2; int sample = w2/w1; @@ -765,6 +780,46 @@ __global__ void weighted_sum_kernel(int n, float *a, float *b, float *s, float * } } +__global__ void deinter_kernel(int NX, float *X, int NY, float *Y, int B, float *OUT) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < (NX+NY)*B){ + int b = i / (NX+NY); + int j = i % (NX+NY); + if (j < NX){ + if(X) X[b*NX + j] += OUT[i]; + } else { + if(Y) Y[b*NY + j - NX] += OUT[i]; + } + } +} + +extern "C" void deinter_gpu(int NX, float *X, int NY, float *Y, int B, float *OUT) +{ + deinter_kernel<<>>(NX, X, NY, Y, B, OUT); + check_error(cudaPeekAtLastError()); +} + +__global__ void inter_kernel(int NX, float *X, int NY, float *Y, int B, float *OUT) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < (NX+NY)*B){ + int b = i / (NX+NY); + int j = i % (NX+NY); + if (j < NX){ + OUT[i] = X[b*NX + j]; + } else { + OUT[i] = Y[b*NY + j - NX]; + } + } +} + +extern "C" void inter_gpu(int NX, float *X, int NY, float *Y, int B, float *OUT) +{ + inter_kernel<<>>(NX, X, NY, Y, B, OUT); + check_error(cudaPeekAtLastError()); +} + extern "C" void weighted_sum_gpu(float *a, float *b, float *s, int num, float *c) { weighted_sum_kernel<<>>(num, a, b, s, c); @@ -776,8 +831,8 @@ __global__ void weighted_delta_kernel(int n, float *a, float *b, float *s, float int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if(i < n){ if(da) da[i] += dc[i] * s[i]; - db[i] += dc[i] * (1-s[i]); - ds[i] += dc[i] * a[i] + dc[i] * -b[i]; + if(db) db[i] += dc[i] * (1-s[i]); + ds[i] += dc[i] * (a[i] - b[i]); } } diff --git a/src/col2im.h b/src/col2im.h index 02374972095..3fbe05307db 100644 --- a/src/col2im.h +++ b/src/col2im.h @@ -6,7 +6,7 @@ void col2im_cpu(float* data_col, int ksize, int stride, int pad, float* data_im); #ifdef GPU -void col2im_ongpu(float *data_col, +void col2im_gpu(float *data_col, int channels, int height, int width, int ksize, int stride, int pad, float *data_im); #endif diff --git a/src/col2im_kernels.cu b/src/col2im_kernels.cu index aed2df9bb62..ba45e0fdec9 100644 --- a/src/col2im_kernels.cu +++ b/src/col2im_kernels.cu @@ -41,7 +41,7 @@ __global__ void col2im_gpu_kernel(const int n, const float* data_col, } } -void col2im_ongpu(float *data_col, +void col2im_gpu(float *data_col, int channels, int height, int width, int ksize, int stride, int pad, float *data_im){ // We are going to launch channels * height_col * width_col kernels, each diff --git a/src/connected_layer.c b/src/connected_layer.c index 5037e74889c..353f4e5677b 100644 --- a/src/connected_layer.c +++ b/src/connected_layer.c @@ -271,23 +271,23 @@ void update_connected_layer_gpu(layer l, update_args a) adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.outputs, batch, a.t); } }else{ - axpy_ongpu(l.outputs, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); - scal_ongpu(l.outputs, momentum, l.bias_updates_gpu, 1); + axpy_gpu(l.outputs, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); + scal_gpu(l.outputs, momentum, l.bias_updates_gpu, 1); if(l.batch_normalize){ - axpy_ongpu(l.outputs, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); - scal_ongpu(l.outputs, momentum, l.scale_updates_gpu, 1); + axpy_gpu(l.outputs, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); + scal_gpu(l.outputs, momentum, l.scale_updates_gpu, 1); } - axpy_ongpu(l.inputs*l.outputs, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); - axpy_ongpu(l.inputs*l.outputs, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); - scal_ongpu(l.inputs*l.outputs, momentum, l.weight_updates_gpu, 1); + axpy_gpu(l.inputs*l.outputs, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_gpu(l.inputs*l.outputs, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_gpu(l.inputs*l.outputs, momentum, l.weight_updates_gpu, 1); } } void forward_connected_layer_gpu(layer l, network net) { - fill_ongpu(l.outputs*l.batch, 0, l.output_gpu, 1); + fill_gpu(l.outputs*l.batch, 0, l.output_gpu, 1); int m = l.batch; int k = l.inputs; @@ -295,20 +295,20 @@ void forward_connected_layer_gpu(layer l, network net) float * a = net.input_gpu; float * b = l.weights_gpu; float * c = l.output_gpu; - gemm_ongpu(0,1,m,n,k,1,a,k,b,k,1,c,n); + gemm_gpu(0,1,m,n,k,1,a,k,b,k,1,c,n); if (l.batch_normalize) { forward_batchnorm_layer_gpu(l, net); } else { add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.outputs, 1); } - activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); + activate_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation); } void backward_connected_layer_gpu(layer l, network net) { - constrain_ongpu(l.outputs*l.batch, 5, l.delta_gpu, 1); - gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); + constrain_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1); + gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); if(l.batch_normalize){ backward_batchnorm_layer_gpu(l, net); } else { @@ -321,7 +321,7 @@ void backward_connected_layer_gpu(layer l, network net) float * a = l.delta_gpu; float * b = net.input_gpu; float * c = l.weight_updates_gpu; - gemm_ongpu(1,0,m,n,k,1,a,m,b,n,1,c,n); + gemm_gpu(1,0,m,n,k,1,a,m,b,n,1,c,n); m = l.batch; k = l.outputs; @@ -331,6 +331,6 @@ void backward_connected_layer_gpu(layer l, network net) b = l.weights_gpu; c = net.delta_gpu; - if(c) gemm_ongpu(0,0,m,n,k,1,a,k,b,n,1,c,n); + if(c) gemm_gpu(0,0,m,n,k,1,a,k,b,n,1,c,n); } #endif diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index cc0021822ff..b9b6f45592f 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -72,7 +72,7 @@ void binarize_weights_gpu(float *weights, int n, int size, float *binary) void forward_convolutional_layer_gpu(convolutional_layer l, network net) { - fill_ongpu(l.outputs*l.batch, 0, l.output_gpu, 1); + fill_gpu(l.outputs*l.batch, 0, l.output_gpu, 1); if(l.binary){ binarize_weights_gpu(l.weights_gpu, l.n, l.c*l.size*l.size, l.binary_weights_gpu); swap_binary(&l); @@ -107,11 +107,11 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network net) int k = l.size*l.size*l.c; int n = l.out_w*l.out_h; for(i = 0; i < l.batch; ++i){ - im2col_ongpu(net.input_gpu + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); + im2col_gpu(net.input_gpu + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); float * a = l.weights_gpu; float * b = net.workspace; float * c = l.output_gpu; - gemm_ongpu(0,0,m,n,k,1.,a,k,b,n,1.,c+i*m*n,n); + gemm_gpu(0,0,m,n,k,1.,a,k,b,n,1.,c+i*m*n,n); } #endif @@ -121,7 +121,7 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network net) add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.n, l.out_w*l.out_h); } - activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); + activate_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation); //if(l.dot > 0) dot_error_gpu(l); if(l.binary || l.xnor) swap_binary(&l); } @@ -173,8 +173,8 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) if(l.smooth){ smooth_layer(l, 5, l.smooth); } - constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); - gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); + constrain_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1); + gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); if(l.batch_normalize){ @@ -217,7 +217,7 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) l.dsrcTensorDesc, net.delta_gpu); if(l.binary || l.xnor) swap_binary(&l); - if(l.xnor) gradient_array_ongpu(original_input, l.batch*l.c*l.h*l.w, HARDTAN, net.delta_gpu); + if(l.xnor) gradient_array_gpu(original_input, l.batch*l.c*l.h*l.w, HARDTAN, net.delta_gpu); } #else @@ -231,8 +231,8 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) float * b = net.workspace; float * c = l.weight_updates_gpu; - im2col_ongpu(net.input_gpu + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); - gemm_ongpu(0,1,m,n,k,1,a + i*m*k,k,b,k,1,c,n); + im2col_gpu(net.input_gpu + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); + gemm_gpu(0,1,m,n,k,1,a + i*m*k,k,b,k,1,c,n); if(net.delta_gpu){ if(l.binary || l.xnor) swap_binary(&l); @@ -240,13 +240,13 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) float * b = l.delta_gpu; float * c = net.workspace; - gemm_ongpu(1,0,n,k,m,1,a,n,b + i*k*m,k,0,c,k); + gemm_gpu(1,0,n,k,m,1,a,n,b + i*k*m,k,0,c,k); - col2im_ongpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta_gpu + i*l.c*l.h*l.w); + col2im_gpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta_gpu + i*l.c*l.h*l.w); if(l.binary || l.xnor) { swap_binary(&l); } - if(l.xnor) gradient_array_ongpu(original_input + i*l.c*l.h*l.w, l.c*l.h*l.w, HARDTAN, net.delta_gpu + i*l.c*l.h*l.w); + if(l.xnor) gradient_array_gpu(original_input + i*l.c*l.h*l.w, l.c*l.h*l.w, HARDTAN, net.delta_gpu + i*l.c*l.h*l.w); } } #endif @@ -294,16 +294,16 @@ void update_convolutional_layer_gpu(layer l, update_args a) adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); } }else{ - axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); - axpy_ongpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); - scal_ongpu(size, momentum, l.weight_updates_gpu, 1); + axpy_gpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_gpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_gpu(size, momentum, l.weight_updates_gpu, 1); - axpy_ongpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); - scal_ongpu(l.n, momentum, l.bias_updates_gpu, 1); + axpy_gpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); + scal_gpu(l.n, momentum, l.bias_updates_gpu, 1); if(l.scales_gpu){ - axpy_ongpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); - scal_ongpu(l.n, momentum, l.scale_updates_gpu, 1); + axpy_gpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); + scal_gpu(l.n, momentum, l.scale_updates_gpu, 1); } } } diff --git a/src/cost_layer.c b/src/cost_layer.c index 83e258b9035..7ef1094b69b 100644 --- a/src/cost_layer.c +++ b/src/cost_layer.c @@ -9,6 +9,7 @@ COST_TYPE get_cost_type(char *s) { + if (strcmp(s, "seg")==0) return SEG; if (strcmp(s, "sse")==0) return SSE; if (strcmp(s, "masked")==0) return MASKED; if (strcmp(s, "smooth")==0) return SMOOTH; @@ -20,6 +21,8 @@ COST_TYPE get_cost_type(char *s) char *get_cost_string(COST_TYPE a) { switch(a){ + case SEG: + return "seg"; case SSE: return "sse"; case MASKED: @@ -122,11 +125,11 @@ void forward_cost_layer_gpu(cost_layer l, network net) { if (!net.truth_gpu) return; if(l.smooth){ - scal_ongpu(l.batch*l.inputs, (1-l.smooth), net.truth_gpu, 1); - add_ongpu(l.batch*l.inputs, l.smooth * 1./l.inputs, net.truth_gpu, 1); + scal_gpu(l.batch*l.inputs, (1-l.smooth), net.truth_gpu, 1); + add_gpu(l.batch*l.inputs, l.smooth * 1./l.inputs, net.truth_gpu, 1); } if (l.cost_type == MASKED) { - mask_ongpu(l.batch*l.inputs, net.input_gpu, SECRET_NUM, net.truth_gpu); + mask_gpu(l.batch*l.inputs, net.input_gpu, SECRET_NUM, net.truth_gpu); } if(l.cost_type == SMOOTH){ @@ -137,6 +140,11 @@ void forward_cost_layer_gpu(cost_layer l, network net) l2_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); } + if (l.cost_type == SEG && l.noobject_scale != 1) { + scale_mask_gpu(l.batch*l.inputs, l.delta_gpu, 0, net.truth_gpu, l.noobject_scale); + scale_mask_gpu(l.batch*l.inputs, l.output_gpu, 0, net.truth_gpu, l.noobject_scale); + } + if(l.ratio){ cuda_pull_array(l.delta_gpu, l.delta, l.batch*l.inputs); qsort(l.delta, l.batch*l.inputs, sizeof(float), float_abs_compare); @@ -144,11 +152,11 @@ void forward_cost_layer_gpu(cost_layer l, network net) float thresh = l.delta[n]; thresh = 0; printf("%f\n", thresh); - supp_ongpu(l.batch*l.inputs, thresh, l.delta_gpu, 1); + supp_gpu(l.batch*l.inputs, thresh, l.delta_gpu, 1); } if(l.thresh){ - supp_ongpu(l.batch*l.inputs, l.thresh*1./l.inputs, l.delta_gpu, 1); + supp_gpu(l.batch*l.inputs, l.thresh*1./l.inputs, l.delta_gpu, 1); } cuda_pull_array(l.output_gpu, l.output, l.batch*l.inputs); @@ -157,7 +165,7 @@ void forward_cost_layer_gpu(cost_layer l, network net) void backward_cost_layer_gpu(const cost_layer l, network net) { - axpy_ongpu(l.batch*l.inputs, l.scale, l.delta_gpu, 1, net.delta_gpu, 1); + axpy_gpu(l.batch*l.inputs, l.scale, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/crnn_layer.c b/src/crnn_layer.c index 2554cf9c3ed..e0ff78a2288 100644 --- a/src/crnn_layer.c +++ b/src/crnn_layer.c @@ -209,10 +209,10 @@ void forward_crnn_layer_gpu(layer l, network net) layer self_layer = *(l.self_layer); layer output_layer = *(l.output_layer); - fill_ongpu(l.outputs * l.batch * l.steps, 0, output_layer.delta_gpu, 1); - fill_ongpu(l.hidden * l.batch * l.steps, 0, self_layer.delta_gpu, 1); - fill_ongpu(l.hidden * l.batch * l.steps, 0, input_layer.delta_gpu, 1); - if(net.train) fill_ongpu(l.hidden * l.batch, 0, l.state_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, output_layer.delta_gpu, 1); + fill_gpu(l.hidden * l.batch * l.steps, 0, self_layer.delta_gpu, 1); + fill_gpu(l.hidden * l.batch * l.steps, 0, input_layer.delta_gpu, 1); + if(net.train) fill_gpu(l.hidden * l.batch, 0, l.state_gpu, 1); for (i = 0; i < l.steps; ++i) { s.input_gpu = net.input_gpu; @@ -224,12 +224,12 @@ void forward_crnn_layer_gpu(layer l, network net) float *old_state = l.state_gpu; if(net.train) l.state_gpu += l.hidden*l.batch; if(l.shortcut){ - copy_ongpu(l.hidden * l.batch, old_state, 1, l.state_gpu, 1); + copy_gpu(l.hidden * l.batch, old_state, 1, l.state_gpu, 1); }else{ - fill_ongpu(l.hidden * l.batch, 0, l.state_gpu, 1); + fill_gpu(l.hidden * l.batch, 0, l.state_gpu, 1); } - axpy_ongpu(l.hidden * l.batch, 1, input_layer.output_gpu, 1, l.state_gpu, 1); - axpy_ongpu(l.hidden * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); + axpy_gpu(l.hidden * l.batch, 1, input_layer.output_gpu, 1, l.state_gpu, 1); + axpy_gpu(l.hidden * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); s.input_gpu = l.state_gpu; forward_convolutional_layer_gpu(output_layer, s); @@ -254,8 +254,8 @@ void backward_crnn_layer_gpu(layer l, network net) increment_layer(&output_layer, l.steps - 1); l.state_gpu += l.hidden*l.batch*l.steps; for (i = l.steps-1; i >= 0; --i) { - copy_ongpu(l.hidden * l.batch, input_layer.output_gpu, 1, l.state_gpu, 1); - axpy_ongpu(l.hidden * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); + copy_gpu(l.hidden * l.batch, input_layer.output_gpu, 1, l.state_gpu, 1); + axpy_gpu(l.hidden * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); s.input_gpu = l.state_gpu; s.delta_gpu = self_layer.delta_gpu; @@ -268,8 +268,8 @@ void backward_crnn_layer_gpu(layer l, network net) if (i == 0) s.delta_gpu = 0; backward_convolutional_layer_gpu(self_layer, s); - copy_ongpu(l.hidden*l.batch, self_layer.delta_gpu, 1, input_layer.delta_gpu, 1); - if (i > 0 && l.shortcut) axpy_ongpu(l.hidden*l.batch, 1, self_layer.delta_gpu, 1, self_layer.delta_gpu - l.hidden*l.batch, 1); + copy_gpu(l.hidden*l.batch, self_layer.delta_gpu, 1, input_layer.delta_gpu, 1); + if (i > 0 && l.shortcut) axpy_gpu(l.hidden*l.batch, 1, self_layer.delta_gpu, 1, self_layer.delta_gpu - l.hidden*l.batch, 1); s.input_gpu = net.input_gpu + i*l.inputs*l.batch; if(net.delta_gpu) s.delta_gpu = net.delta_gpu + i*l.inputs*l.batch; else s.delta_gpu = 0; diff --git a/src/cuda.c b/src/cuda.c index e511403776f..b5c0c3298f7 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -97,7 +97,7 @@ float *cuda_make_array(float *x, size_t n) status = cudaMemcpy(x_gpu, x, size, cudaMemcpyHostToDevice); check_error(status); } else { - fill_ongpu(n, 0, x_gpu, 1); + fill_gpu(n, 0, x_gpu, 1); } if(!x_gpu) error("Cuda malloc failed\n"); return x_gpu; diff --git a/src/data.c b/src/data.c index c227b6f8a1e..80ca13133d4 100644 --- a/src/data.c +++ b/src/data.c @@ -551,6 +551,33 @@ void exclusive_image(image src) } image get_segmentation_image(char *path, int w, int h, int classes) +{ + char labelpath[4096]; + find_replace(path, "images", "mask", labelpath); + find_replace(labelpath, "JPEGImages", "mask", labelpath); + find_replace(labelpath, ".jpg", ".txt", labelpath); + find_replace(labelpath, ".JPG", ".txt", labelpath); + find_replace(labelpath, ".JPEG", ".txt", labelpath); + image mask = make_image(w, h, classes); + FILE *file = fopen(labelpath, "r"); + if(!file) file_error(labelpath); + char buff[32788]; + int id; + image part = make_image(w, h, 1); + while(fscanf(file, "%d %s", &id, buff) == 2){ + int n = 0; + int *rle = read_intlist(buff, &n, 0); + load_rle(part, rle, n); + or_image(part, mask, id); + free(rle); + } + //exclusive_image(mask); + fclose(file); + free_image(part); + return mask; +} + +image get_segmentation_image2(char *path, int w, int h, int classes) { char labelpath[4096]; find_replace(path, "images", "mask", labelpath); @@ -584,7 +611,7 @@ image get_segmentation_image(char *path, int w, int h, int classes) return mask; } -data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int min, int max, float angle, float aspect, float hue, float saturation, float exposure) +data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int min, int max, float angle, float aspect, float hue, float saturation, float exposure, int div) { char **random_paths = get_random_paths(paths, n, m); int i; @@ -597,12 +624,14 @@ data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int mi d.y.rows = n; - d.y.cols = h*w*(classes+1); + d.y.cols = h*w*classes/div/div; d.y.vals = calloc(d.X.rows, sizeof(float*)); for(i = 0; i < n; ++i){ image orig = load_image_color(random_paths[i], 0, 0); augment_args a = random_augment_args(orig, angle, aspect, min, max, w, h); + a.dx = 0; + a.dy = 0; image sized = rotate_crop_image(orig, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect); int flip = rand()%2; @@ -612,7 +641,7 @@ data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int mi image mask = get_segmentation_image(random_paths[i], orig.w, orig.h, classes); //image mask = make_image(orig.w, orig.h, classes+1); - image sized_m = rotate_crop_image(mask, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect); + image sized_m = rotate_crop_image(mask, a.rad, a.scale/div, a.w/div, a.h/div, a.dx, a.dy, a.aspect); if(flip) flip_image(sized_m); d.y.vals[i] = sized_m.data; @@ -874,7 +903,7 @@ void *load_thread(void *ptr) } else if (a.type == WRITING_DATA){ *a.d = load_data_writing(a.paths, a.n, a.m, a.w, a.h, a.out_w, a.out_h); } else if (a.type == SEGMENTATION_DATA){ - *a.d = load_data_seg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure); + *a.d = load_data_seg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure, a.scale); } else if (a.type == REGION_DATA){ *a.d = load_data_region(a.n, a.paths, a.m, a.w, a.h, a.num_boxes, a.classes, a.jitter, a.hue, a.saturation, a.exposure); } else if (a.type == DETECTION_DATA){ diff --git a/src/deconvolutional_kernels.cu b/src/deconvolutional_kernels.cu index 250263753bc..d7e29462662 100644 --- a/src/deconvolutional_kernels.cu +++ b/src/deconvolutional_kernels.cu @@ -22,31 +22,31 @@ extern "C" void forward_deconvolutional_layer_gpu(layer l, network net) int n = l.h*l.w; int k = l.c; - fill_ongpu(l.outputs*l.batch, 0, l.output_gpu, 1); + fill_gpu(l.outputs*l.batch, 0, l.output_gpu, 1); for(i = 0; i < l.batch; ++i){ float *a = l.weights_gpu; float *b = net.input_gpu + i*l.c*l.h*l.w; float *c = net.workspace; - gemm_ongpu(1,0,m,n,k,1,a,m,b,n,0,c,n); + gemm_gpu(1,0,m,n,k,1,a,m,b,n,0,c,n); - col2im_ongpu(net.workspace, l.out_c, l.out_h, l.out_w, l.size, l.stride, l.pad, l.output_gpu+i*l.outputs); + col2im_gpu(net.workspace, l.out_c, l.out_h, l.out_w, l.size, l.stride, l.pad, l.output_gpu+i*l.outputs); } if (l.batch_normalize) { forward_batchnorm_layer_gpu(l, net); } else { add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.n, l.out_w*l.out_h); } - activate_array_ongpu(l.output_gpu, l.batch*l.n*l.out_w*l.out_h, l.activation); + activate_array_gpu(l.output_gpu, l.batch*l.n*l.out_w*l.out_h, l.activation); } extern "C" void backward_deconvolutional_layer_gpu(layer l, network net) { int i; - constrain_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1); - gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); + constrain_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1); + gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); if(l.batch_normalize){ backward_batchnorm_layer_gpu(l, net); @@ -65,9 +65,9 @@ extern "C" void backward_deconvolutional_layer_gpu(layer l, network net) float *b = net.workspace; float *c = l.weight_updates_gpu; - im2col_ongpu(l.delta_gpu + i*l.outputs, l.out_c, l.out_h, l.out_w, + im2col_gpu(l.delta_gpu + i*l.outputs, l.out_c, l.out_h, l.out_w, l.size, l.stride, l.pad, b); - gemm_ongpu(0,1,m,n,k,1,a,k,b,k,1,c,n); + gemm_gpu(0,1,m,n,k,1,a,k,b,k,1,c,n); if(net.delta_gpu){ int m = l.c; @@ -78,7 +78,7 @@ extern "C" void backward_deconvolutional_layer_gpu(layer l, network net) float *b = net.workspace; float *c = net.delta_gpu + i*n*m; - gemm_ongpu(0,0,m,n,k,1,a,k,b,n,1,c,n); + gemm_gpu(0,0,m,n,k,1,a,k,b,n,1,c,n); } } } @@ -125,16 +125,16 @@ void update_deconvolutional_layer_gpu(layer l, update_args a) adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); } }else{ - axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); - axpy_ongpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); - scal_ongpu(size, momentum, l.weight_updates_gpu, 1); + axpy_gpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_gpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_gpu(size, momentum, l.weight_updates_gpu, 1); - axpy_ongpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); - scal_ongpu(l.n, momentum, l.bias_updates_gpu, 1); + axpy_gpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); + scal_gpu(l.n, momentum, l.bias_updates_gpu, 1); if(l.scales_gpu){ - axpy_ongpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); - scal_ongpu(l.n, momentum, l.scale_updates_gpu, 1); + axpy_gpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1); + scal_gpu(l.n, momentum, l.scale_updates_gpu, 1); } } } diff --git a/src/detection_layer.c b/src/detection_layer.c index 100694babde..5c8a1cea3d3 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -256,7 +256,7 @@ void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box void forward_detection_layer_gpu(const detection_layer l, network net) { if(!net.train){ - copy_ongpu(l.batch*l.inputs, net.input_gpu, 1, l.output_gpu, 1); + copy_gpu(l.batch*l.inputs, net.input_gpu, 1, l.output_gpu, 1); return; } @@ -270,8 +270,8 @@ void forward_detection_layer_gpu(const detection_layer l, network net) void backward_detection_layer_gpu(detection_layer l, network net) { - axpy_ongpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); - //copy_ongpu(l.batch*l.inputs, l.delta_gpu, 1, net.delta_gpu, 1); + axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); + //copy_gpu(l.batch*l.inputs, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/gemm.c b/src/gemm.c index 3003be0ed5a..53ab1404f98 100644 --- a/src/gemm.c +++ b/src/gemm.c @@ -165,7 +165,7 @@ void gemm_cpu(int TA, int TB, int M, int N, int K, float ALPHA, #include -void gemm_ongpu(int TA, int TB, int M, int N, int K, float ALPHA, +void gemm_gpu(int TA, int TB, int M, int N, int K, float ALPHA, float *A_gpu, int lda, float *B_gpu, int ldb, float BETA, @@ -177,24 +177,6 @@ void gemm_ongpu(int TA, int TB, int M, int N, int K, float ALPHA, check_error(status); } -void gemm_gpu(int TA, int TB, int M, int N, int K, float ALPHA, - float *A, int lda, - float *B, int ldb, - float BETA, - float *C, int ldc) -{ - float *A_gpu = cuda_make_array(A, (TA ? lda*K:lda*M)); - float *B_gpu = cuda_make_array(B, (TB ? ldb*N : ldb*K)); - float *C_gpu = cuda_make_array(C, ldc*M); - - gemm_ongpu(TA, TB, M, N, K, ALPHA, A_gpu, lda, B_gpu, ldb, BETA, C_gpu, ldc); - - cuda_pull_array(C_gpu, C, ldc*M); - cuda_free(A_gpu); - cuda_free(B_gpu); - cuda_free(C_gpu); -} - #include #include #include @@ -224,7 +206,7 @@ void time_gpu_random_matrix(int TA, int TB, int m, int k, int n) free(c); } -void time_ongpu(int TA, int TB, int m, int k, int n) +void time_gpu(int TA, int TB, int m, int k, int n) { int iter = 10; float *a = random_matrix(m,k); @@ -242,7 +224,7 @@ void time_ongpu(int TA, int TB, int m, int k, int n) int i; clock_t start = clock(), end; for(i = 0; i= 0; --i) { - if(i != 0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); + if(i != 0) copy_gpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.state_gpu, 1); + else copy_gpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.state_gpu, 1); float *prev_delta_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; - copy_ongpu(l.outputs*l.batch, uz.output_gpu, 1, l.z_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, wz.output_gpu, 1, l.z_gpu, 1); + copy_gpu(l.outputs*l.batch, uz.output_gpu, 1, l.z_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, wz.output_gpu, 1, l.z_gpu, 1); - copy_ongpu(l.outputs*l.batch, ur.output_gpu, 1, l.r_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, wr.output_gpu, 1, l.r_gpu, 1); + copy_gpu(l.outputs*l.batch, ur.output_gpu, 1, l.r_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, wr.output_gpu, 1, l.r_gpu, 1); - activate_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.z_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.r_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, uh.output_gpu, 1, l.h_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, wh.output_gpu, 1, l.h_gpu, 1); + copy_gpu(l.outputs*l.batch, uh.output_gpu, 1, l.h_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, wh.output_gpu, 1, l.h_gpu, 1); if(l.tanh){ - activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); + activate_array_gpu(l.h_gpu, l.outputs*l.batch, TANH); } else { - activate_array_ongpu(l.h_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.h_gpu, l.outputs*l.batch, LOGISTIC); } - weighted_delta_gpu(l.prev_state_gpu, l.h_gpu, l.z_gpu, prev_delta_gpu, uh.delta_gpu, uz.delta_gpu, l.outputs*l.batch, l.delta_gpu); + weighted_delta_gpu(l.state_gpu, l.h_gpu, l.z_gpu, prev_delta_gpu, uh.delta_gpu, uz.delta_gpu, l.outputs*l.batch, l.delta_gpu); if(l.tanh){ - gradient_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH, uh.delta_gpu); + gradient_array_gpu(l.h_gpu, l.outputs*l.batch, TANH, uh.delta_gpu); } else { - gradient_array_ongpu(l.h_gpu, l.outputs*l.batch, LOGISTIC, uh.delta_gpu); + gradient_array_gpu(l.h_gpu, l.outputs*l.batch, LOGISTIC, uh.delta_gpu); } - copy_ongpu(l.outputs*l.batch, uh.delta_gpu, 1, wh.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, uh.delta_gpu, 1, wh.delta_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.forgot_state_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.r_gpu, 1, l.forgot_state_gpu, 1); - fill_ongpu(l.outputs*l.batch, 0, l.forgot_delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.state_gpu, 1, l.forgot_state_gpu, 1); + mul_gpu(l.outputs*l.batch, l.r_gpu, 1, l.forgot_state_gpu, 1); + fill_gpu(l.outputs*l.batch, 0, l.forgot_delta_gpu, 1); s.input_gpu = l.forgot_state_gpu; s.delta_gpu = l.forgot_delta_gpu; backward_connected_layer_gpu(wh, s); if(prev_delta_gpu) mult_add_into_gpu(l.outputs*l.batch, l.forgot_delta_gpu, l.r_gpu, prev_delta_gpu); - mult_add_into_gpu(l.outputs*l.batch, l.forgot_delta_gpu, l.prev_state_gpu, ur.delta_gpu); + mult_add_into_gpu(l.outputs*l.batch, l.forgot_delta_gpu, l.state_gpu, ur.delta_gpu); - gradient_array_ongpu(l.r_gpu, l.outputs*l.batch, LOGISTIC, ur.delta_gpu); - copy_ongpu(l.outputs*l.batch, ur.delta_gpu, 1, wr.delta_gpu, 1); + gradient_array_gpu(l.r_gpu, l.outputs*l.batch, LOGISTIC, ur.delta_gpu); + copy_gpu(l.outputs*l.batch, ur.delta_gpu, 1, wr.delta_gpu, 1); - gradient_array_ongpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, uz.delta_gpu); - copy_ongpu(l.outputs*l.batch, uz.delta_gpu, 1, wz.delta_gpu, 1); + gradient_array_gpu(l.z_gpu, l.outputs*l.batch, LOGISTIC, uz.delta_gpu); + copy_gpu(l.outputs*l.batch, uz.delta_gpu, 1, wz.delta_gpu, 1); - s.input_gpu = l.prev_state_gpu; + s.input_gpu = l.state_gpu; s.delta_gpu = prev_delta_gpu; backward_connected_layer_gpu(wr, s); @@ -399,5 +401,6 @@ void backward_gru_layer_gpu(layer l, network net) increment_layer(&wr, -1); increment_layer(&wh, -1); } + copy_gpu(l.outputs*l.batch, end_state, 1, l.state_gpu, 1); } #endif diff --git a/src/im2col.h b/src/im2col.h index f0ddeeeb2d4..02c4247fad9 100644 --- a/src/im2col.h +++ b/src/im2col.h @@ -7,7 +7,7 @@ void im2col_cpu(float* data_im, #ifdef GPU -void im2col_ongpu(float *im, +void im2col_gpu(float *im, int channels, int height, int width, int ksize, int stride, int pad,float *data_col); diff --git a/src/im2col_kernels.cu b/src/im2col_kernels.cu index d42d600be18..07b5e67989a 100644 --- a/src/im2col_kernels.cu +++ b/src/im2col_kernels.cu @@ -45,7 +45,7 @@ __global__ void im2col_gpu_kernel(const int n, const float* data_im, } } -void im2col_ongpu(float *im, +void im2col_gpu(float *im, int channels, int height, int width, int ksize, int stride, int pad, float *data_col){ // We are going to launch channels * height_col * width_col kernels, each diff --git a/src/local_layer.c b/src/local_layer.c index 170ba9b6689..74f6910a8fd 100644 --- a/src/local_layer.c +++ b/src/local_layer.c @@ -191,12 +191,12 @@ void forward_local_layer_gpu(const local_layer l, network net) int locations = out_h * out_w; for(i = 0; i < l.batch; ++i){ - copy_ongpu(l.outputs, l.biases_gpu, 1, l.output_gpu + i*l.outputs, 1); + copy_gpu(l.outputs, l.biases_gpu, 1, l.output_gpu + i*l.outputs, 1); } for(i = 0; i < l.batch; ++i){ float *input = net.input_gpu + i*l.w*l.h*l.c; - im2col_ongpu(input, l.c, l.h, l.w, + im2col_gpu(input, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); float *output = l.output_gpu + i*l.outputs; for(j = 0; j < locations; ++j){ @@ -208,10 +208,10 @@ void forward_local_layer_gpu(const local_layer l, network net) int n = 1; int k = l.size*l.size*l.c; - gemm_ongpu(0,0,m,n,k,1,a,k,b,locations,1,c,locations); + gemm_gpu(0,0,m,n,k,1,a,k,b,locations,1,c,locations); } } - activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); + activate_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation); } void backward_local_layer_gpu(local_layer l, network net) @@ -219,14 +219,14 @@ void backward_local_layer_gpu(local_layer l, network net) int i, j; int locations = l.out_w*l.out_h; - gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); + gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); for(i = 0; i < l.batch; ++i){ - axpy_ongpu(l.outputs, 1, l.delta_gpu + i*l.outputs, 1, l.bias_updates_gpu, 1); + axpy_gpu(l.outputs, 1, l.delta_gpu + i*l.outputs, 1, l.bias_updates_gpu, 1); } for(i = 0; i < l.batch; ++i){ float *input = net.input_gpu + i*l.w*l.h*l.c; - im2col_ongpu(input, l.c, l.h, l.w, + im2col_gpu(input, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); for(j = 0; j < locations; ++j){ @@ -237,7 +237,7 @@ void backward_local_layer_gpu(local_layer l, network net) int n = l.size*l.size*l.c; int k = 1; - gemm_ongpu(0,1,m,n,k,1,a,locations,b,locations,1,c,n); + gemm_gpu(0,1,m,n,k,1,a,locations,b,locations,1,c,n); } if(net.delta_gpu){ @@ -250,10 +250,10 @@ void backward_local_layer_gpu(local_layer l, network net) int n = 1; int k = l.n; - gemm_ongpu(1,0,m,n,k,1,a,m,b,locations,0,c,locations); + gemm_gpu(1,0,m,n,k,1,a,m,b,locations,0,c,locations); } - col2im_ongpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta_gpu+i*l.c*l.h*l.w); + col2im_gpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta_gpu+i*l.c*l.h*l.w); } } } @@ -267,12 +267,12 @@ void update_local_layer_gpu(local_layer l, update_args a) int locations = l.out_w*l.out_h; int size = l.size*l.size*l.c*l.n*locations; - axpy_ongpu(l.outputs, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); - scal_ongpu(l.outputs, momentum, l.bias_updates_gpu, 1); + axpy_gpu(l.outputs, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); + scal_gpu(l.outputs, momentum, l.bias_updates_gpu, 1); - axpy_ongpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); - axpy_ongpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); - scal_ongpu(size, momentum, l.weight_updates_gpu, 1); + axpy_gpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_gpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_gpu(size, momentum, l.weight_updates_gpu, 1); } void pull_local_layer(local_layer l) diff --git a/src/lstm_layer.c b/src/lstm_layer.c index a0cd99b6be6..fb07de20228 100644 --- a/src/lstm_layer.c +++ b/src/lstm_layer.c @@ -41,36 +41,36 @@ layer make_lstm_layer(int batch, int inputs, int outputs, int steps, int batch_n *(l.uf) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.uf->batch = batch; - l.wf = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.wf) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); - l.wf->batch = batch; - l.ui = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); *(l.ui) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.ui->batch = batch; - l.wi = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.wi) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); - l.wi->batch = batch; - l.ug = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); *(l.ug) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.ug->batch = batch; - l.wg = malloc(sizeof(layer)); - fprintf(stderr, "\t\t"); - *(l.wg) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); - l.wg->batch = batch; - l.uo = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); *(l.uo) = make_connected_layer(batch*steps, inputs, outputs, LINEAR, batch_normalize, adam); l.uo->batch = batch; + l.wf = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wf) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); + l.wf->batch = batch; + + l.wi = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wi) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); + l.wi->batch = batch; + + l.wg = malloc(sizeof(layer)); + fprintf(stderr, "\t\t"); + *(l.wg) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); + l.wg->batch = batch; + l.wo = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); *(l.wo) = make_connected_layer(batch*steps, outputs, outputs, LINEAR, batch_normalize, adam); @@ -410,17 +410,17 @@ void forward_lstm_layer_gpu(layer l, network state) layer ug = *(l.ug); layer uo = *(l.uo); - fill_ongpu(l.outputs * l.batch * l.steps, 0, wf.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, wi.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, wg.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, wo.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, wf.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, wi.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, wg.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, wo.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, uf.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, ui.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, ug.delta_gpu, 1); - fill_ongpu(l.outputs * l.batch * l.steps, 0, uo.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, uf.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, ui.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, ug.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, uo.delta_gpu, 1); if (state.train) { - fill_ongpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); } for (i = 0; i < l.steps; ++i) { @@ -436,34 +436,34 @@ void forward_lstm_layer_gpu(layer l, network state) forward_connected_layer_gpu(ug, s); forward_connected_layer_gpu(uo, s); - copy_ongpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); + copy_gpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); - copy_ongpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); + copy_gpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); - copy_ongpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); + copy_gpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); - copy_ongpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); + copy_gpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); - activate_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH); - activate_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.g_gpu, l.outputs*l.batch, TANH); + activate_array_gpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.c_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, l.temp_gpu, 1, l.c_gpu, 1); + copy_gpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); + mul_gpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); + mul_gpu(l.outputs*l.batch, l.f_gpu, 1, l.c_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, l.temp_gpu, 1, l.c_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.h_gpu, 1); - activate_array_ongpu(l.h_gpu, l.outputs*l.batch, TANH); - mul_ongpu(l.outputs*l.batch, l.o_gpu, 1, l.h_gpu, 1); + copy_gpu(l.outputs*l.batch, l.c_gpu, 1, l.h_gpu, 1); + activate_array_gpu(l.h_gpu, l.outputs*l.batch, TANH); + mul_gpu(l.outputs*l.batch, l.o_gpu, 1, l.h_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.cell_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.h_gpu, 1, l.output_gpu, 1); + copy_gpu(l.outputs*l.batch, l.c_gpu, 1, l.cell_gpu, 1); + copy_gpu(l.outputs*l.batch, l.h_gpu, 1, l.output_gpu, 1); state.input_gpu += l.inputs*l.batch; l.output_gpu += l.outputs*l.batch; @@ -514,97 +514,97 @@ void backward_lstm_layer_gpu(layer l, network state) l.delta_gpu += l.outputs*l.batch*(l.steps - 1); for (i = l.steps - 1; i >= 0; --i) { - if (i != 0) copy_ongpu(l.outputs*l.batch, l.cell_gpu - l.outputs*l.batch, 1, l.prev_cell_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.cell_gpu, 1, l.c_gpu, 1); - if (i != 0) copy_ongpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.output_gpu, 1, l.h_gpu, 1); + if (i != 0) copy_gpu(l.outputs*l.batch, l.cell_gpu - l.outputs*l.batch, 1, l.prev_cell_gpu, 1); + copy_gpu(l.outputs*l.batch, l.cell_gpu, 1, l.c_gpu, 1); + if (i != 0) copy_gpu(l.outputs*l.batch, l.output_gpu - l.outputs*l.batch, 1, l.prev_state_gpu, 1); + copy_gpu(l.outputs*l.batch, l.output_gpu, 1, l.h_gpu, 1); l.dh_gpu = (i == 0) ? 0 : l.delta_gpu - l.outputs*l.batch; - copy_ongpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); + copy_gpu(l.outputs*l.batch, wf.output_gpu, 1, l.f_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, uf.output_gpu, 1, l.f_gpu, 1); - copy_ongpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); + copy_gpu(l.outputs*l.batch, wi.output_gpu, 1, l.i_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, ui.output_gpu, 1, l.i_gpu, 1); - copy_ongpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); + copy_gpu(l.outputs*l.batch, wg.output_gpu, 1, l.g_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, ug.output_gpu, 1, l.g_gpu, 1); - copy_ongpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); - axpy_ongpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); + copy_gpu(l.outputs*l.batch, wo.output_gpu, 1, l.o_gpu, 1); + axpy_gpu(l.outputs*l.batch, 1, uo.output_gpu, 1, l.o_gpu, 1); - activate_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); - activate_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH); - activate_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.f_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.i_gpu, l.outputs*l.batch, LOGISTIC); + activate_array_gpu(l.g_gpu, l.outputs*l.batch, TANH); + activate_array_gpu(l.o_gpu, l.outputs*l.batch, LOGISTIC); - copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); + copy_gpu(l.outputs*l.batch, l.delta_gpu, 1, l.temp3_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); - activate_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH); + copy_gpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); + activate_array_gpu(l.temp_gpu, l.outputs*l.batch, TANH); - copy_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.o_gpu, 1, l.temp2_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp2_gpu, 1); + mul_gpu(l.outputs*l.batch, l.o_gpu, 1, l.temp2_gpu, 1); - gradient_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH, l.temp2_gpu); - axpy_ongpu(l.outputs*l.batch, 1, l.dc_gpu, 1, l.temp2_gpu, 1); + gradient_array_gpu(l.temp_gpu, l.outputs*l.batch, TANH, l.temp2_gpu); + axpy_gpu(l.outputs*l.batch, 1, l.dc_gpu, 1, l.temp2_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); - activate_array_ongpu(l.temp_gpu, l.outputs*l.batch, TANH); - mul_ongpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.o_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wo.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.c_gpu, 1, l.temp_gpu, 1); + activate_array_gpu(l.temp_gpu, l.outputs*l.batch, TANH); + mul_gpu(l.outputs*l.batch, l.temp3_gpu, 1, l.temp_gpu, 1); + gradient_array_gpu(l.o_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, wo.delta_gpu, 1); s.input_gpu = l.prev_state_gpu; s.delta_gpu = l.dh_gpu; backward_connected_layer_gpu(wo, s); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uo.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, uo.delta_gpu, 1); s.input_gpu = state.input_gpu; s.delta_gpu = state.delta_gpu; backward_connected_layer_gpu(uo, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.g_gpu, l.outputs*l.batch, TANH, l.temp_gpu); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wg.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_gpu(l.outputs*l.batch, l.i_gpu, 1, l.temp_gpu, 1); + gradient_array_gpu(l.g_gpu, l.outputs*l.batch, TANH, l.temp_gpu); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, wg.delta_gpu, 1); s.input_gpu = l.prev_state_gpu; s.delta_gpu = l.dh_gpu; backward_connected_layer_gpu(wg, s); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, ug.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, ug.delta_gpu, 1); s.input_gpu = state.input_gpu; s.delta_gpu = state.delta_gpu; backward_connected_layer_gpu(ug, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.i_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wi.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_gpu(l.outputs*l.batch, l.g_gpu, 1, l.temp_gpu, 1); + gradient_array_gpu(l.i_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, wi.delta_gpu, 1); s.input_gpu = l.prev_state_gpu; s.delta_gpu = l.dh_gpu; backward_connected_layer_gpu(wi, s); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, ui.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, ui.delta_gpu, 1); s.input_gpu = state.input_gpu; s.delta_gpu = state.delta_gpu; backward_connected_layer_gpu(ui, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.prev_cell_gpu, 1, l.temp_gpu, 1); - gradient_array_ongpu(l.f_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, wf.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_gpu(l.outputs*l.batch, l.prev_cell_gpu, 1, l.temp_gpu, 1); + gradient_array_gpu(l.f_gpu, l.outputs*l.batch, LOGISTIC, l.temp_gpu); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, wf.delta_gpu, 1); s.input_gpu = l.prev_state_gpu; s.delta_gpu = l.dh_gpu; backward_connected_layer_gpu(wf, s); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, uf.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, uf.delta_gpu, 1); s.input_gpu = state.input_gpu; s.delta_gpu = state.delta_gpu; backward_connected_layer_gpu(uf, s); - copy_ongpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); - mul_ongpu(l.outputs*l.batch, l.f_gpu, 1, l.temp_gpu, 1); - copy_ongpu(l.outputs*l.batch, l.temp_gpu, 1, l.dc_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp2_gpu, 1, l.temp_gpu, 1); + mul_gpu(l.outputs*l.batch, l.f_gpu, 1, l.temp_gpu, 1); + copy_gpu(l.outputs*l.batch, l.temp_gpu, 1, l.dc_gpu, 1); state.input_gpu -= l.inputs*l.batch; if (state.delta_gpu) state.delta_gpu -= l.inputs*l.batch; diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 7c955309f7f..5af37608d18 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -42,7 +42,7 @@ void forward_network_gpu(network net) net.index = i; layer l = net.layers[i]; if(l.delta_gpu){ - fill_ongpu(l.outputs * l.batch, 0, l.delta_gpu, 1); + fill_gpu(l.outputs * l.batch, 0, l.delta_gpu, 1); } l.forward_gpu(l, net); net.input_gpu = l.output_gpu; @@ -107,9 +107,9 @@ void harmless_update_network_gpu(network net) int i; for(i = 0; i < net.n; ++i){ layer l = net.layers[i]; - if(l.weight_updates_gpu) fill_ongpu(l.nweights, 0, l.weight_updates_gpu, 1); - if(l.bias_updates_gpu) fill_ongpu(l.nbiases, 0, l.bias_updates_gpu, 1); - if(l.scale_updates_gpu) fill_ongpu(l.nbiases, 0, l.scale_updates_gpu, 1); + if(l.weight_updates_gpu) fill_gpu(l.nweights, 0, l.weight_updates_gpu, 1); + if(l.bias_updates_gpu) fill_gpu(l.nbiases, 0, l.bias_updates_gpu, 1); + if(l.scale_updates_gpu) fill_gpu(l.nbiases, 0, l.scale_updates_gpu, 1); } } @@ -383,6 +383,7 @@ float train_networks(network *nets, int n, data d, int interval) float sum = 0; for(i = 0; i < n; ++i){ + nets[i].learning_rate *= n; data p = get_data_part(d, i, n); threads[i] = train_network_in_thread(nets[i], p, errors + i); } diff --git a/src/normalization_layer.c b/src/normalization_layer.c index 9f959a4f6a7..424714fe865 100644 --- a/src/normalization_layer.c +++ b/src/normalization_layer.c @@ -113,29 +113,29 @@ void forward_normalization_layer_gpu(const layer layer, network net) int w = layer.w; int h = layer.h; int c = layer.c; - scal_ongpu(w*h*c*layer.batch, 0, layer.squared_gpu, 1); + scal_gpu(w*h*c*layer.batch, 0, layer.squared_gpu, 1); for(b = 0; b < layer.batch; ++b){ float *squared = layer.squared_gpu + w*h*c*b; float *norms = layer.norms_gpu + w*h*c*b; float *input = net.input_gpu + w*h*c*b; - pow_ongpu(w*h*c, 2, input, 1, squared, 1); + pow_gpu(w*h*c, 2, input, 1, squared, 1); - const_ongpu(w*h, layer.kappa, norms, 1); + const_gpu(w*h, layer.kappa, norms, 1); for(k = 0; k < layer.size/2; ++k){ - axpy_ongpu(w*h, layer.alpha, squared + w*h*k, 1, norms, 1); + axpy_gpu(w*h, layer.alpha, squared + w*h*k, 1, norms, 1); } for(k = 1; k < layer.c; ++k){ - copy_ongpu(w*h, norms + w*h*(k-1), 1, norms + w*h*k, 1); + copy_gpu(w*h, norms + w*h*(k-1), 1, norms + w*h*k, 1); int prev = k - ((layer.size-1)/2) - 1; int next = k + (layer.size/2); - if(prev >= 0) axpy_ongpu(w*h, -layer.alpha, squared + w*h*prev, 1, norms + w*h*k, 1); - if(next < layer.c) axpy_ongpu(w*h, layer.alpha, squared + w*h*next, 1, norms + w*h*k, 1); + if(prev >= 0) axpy_gpu(w*h, -layer.alpha, squared + w*h*prev, 1, norms + w*h*k, 1); + if(next < layer.c) axpy_gpu(w*h, layer.alpha, squared + w*h*next, 1, norms + w*h*k, 1); } } - pow_ongpu(w*h*c*layer.batch, -layer.beta, layer.norms_gpu, 1, layer.output_gpu, 1); - mul_ongpu(w*h*c*layer.batch, net.input_gpu, 1, layer.output_gpu, 1); + pow_gpu(w*h*c*layer.batch, -layer.beta, layer.norms_gpu, 1, layer.output_gpu, 1); + mul_gpu(w*h*c*layer.batch, net.input_gpu, 1, layer.output_gpu, 1); } void backward_normalization_layer_gpu(const layer layer, network net) @@ -145,7 +145,7 @@ void backward_normalization_layer_gpu(const layer layer, network net) int w = layer.w; int h = layer.h; int c = layer.c; - pow_ongpu(w*h*c*layer.batch, -layer.beta, layer.norms_gpu, 1, net.delta_gpu, 1); - mul_ongpu(w*h*c*layer.batch, layer.delta_gpu, 1, net.delta_gpu, 1); + pow_gpu(w*h*c*layer.batch, -layer.beta, layer.norms_gpu, 1, net.delta_gpu, 1); + mul_gpu(w*h*c*layer.batch, layer.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/parser.c b/src/parser.c index 703904166c6..da025367938 100644 --- a/src/parser.c +++ b/src/parser.c @@ -213,13 +213,11 @@ layer parse_crnn(list *options, size_params params) layer parse_rnn(list *options, size_params params) { int output = option_find_int(options, "output",1); - int hidden = option_find_int(options, "hidden",1); char *activation_s = option_find_str(options, "activation", "logistic"); ACTIVATION activation = get_activation(activation_s); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - int logistic = option_find_int_quiet(options, "logistic", 0); - layer l = make_rnn_layer(params.batch, params.inputs, hidden, output, params.time_steps, activation, batch_normalize, logistic, params.net.adam); + layer l = make_rnn_layer(params.batch, params.inputs, output, params.time_steps, activation, batch_normalize, params.net.adam); l.shortcut = option_find_int_quiet(options, "shortcut", 0); @@ -353,6 +351,7 @@ cost_layer parse_cost(list *options, size_params params) float scale = option_find_float_quiet(options, "scale",1); cost_layer layer = make_cost_layer(params.batch, params.inputs, type, scale); layer.ratio = option_find_float_quiet(options, "ratio",0); + layer.noobject_scale = option_find_float_quiet(options, "noobj", 1); layer.thresh = option_find_float_quiet(options, "thresh",0); return layer; } @@ -921,12 +920,18 @@ void save_weights_upto(network net, char *filename, int cutoff) save_connected_weights(*(l.uo), fp); save_connected_weights(*(l.ug), fp); } if (l.type == GRU) { - save_connected_weights(*(l.wz), fp); - save_connected_weights(*(l.wr), fp); - save_connected_weights(*(l.wh), fp); - save_connected_weights(*(l.uz), fp); - save_connected_weights(*(l.ur), fp); - save_connected_weights(*(l.uh), fp); + if(1){ + save_connected_weights(*(l.wz), fp); + save_connected_weights(*(l.wr), fp); + save_connected_weights(*(l.wh), fp); + save_connected_weights(*(l.uz), fp); + save_connected_weights(*(l.ur), fp); + save_connected_weights(*(l.uh), fp); + }else{ + save_connected_weights(*(l.reset_layer), fp); + save_connected_weights(*(l.update_layer), fp); + save_connected_weights(*(l.state_layer), fp); + } } if(l.type == CRNN){ save_convolutional_weights(*(l.input_layer), fp); save_convolutional_weights(*(l.self_layer), fp); @@ -1132,12 +1137,18 @@ void load_weights_upto(network *net, char *filename, int start, int cutoff) load_connected_weights(*(l.ug), fp, transpose); } if (l.type == GRU) { - load_connected_weights(*(l.wz), fp, transpose); - load_connected_weights(*(l.wr), fp, transpose); - load_connected_weights(*(l.wh), fp, transpose); - load_connected_weights(*(l.uz), fp, transpose); - load_connected_weights(*(l.ur), fp, transpose); - load_connected_weights(*(l.uh), fp, transpose); + if(1){ + load_connected_weights(*(l.wz), fp, transpose); + load_connected_weights(*(l.wr), fp, transpose); + load_connected_weights(*(l.wh), fp, transpose); + load_connected_weights(*(l.uz), fp, transpose); + load_connected_weights(*(l.ur), fp, transpose); + load_connected_weights(*(l.uh), fp, transpose); + }else{ + load_connected_weights(*(l.reset_layer), fp, transpose); + load_connected_weights(*(l.update_layer), fp, transpose); + load_connected_weights(*(l.state_layer), fp, transpose); + } } if(l.type == LOCAL){ int locations = l.out_w*l.out_h; diff --git a/src/region_layer.c b/src/region_layer.c index d2f7302906d..c090075ea37 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -434,14 +434,14 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f void forward_region_layer_gpu(const layer l, network net) { - copy_ongpu(l.batch*l.inputs, net.input_gpu, 1, l.output_gpu, 1); + copy_gpu(l.batch*l.inputs, net.input_gpu, 1, l.output_gpu, 1); int b, n; for (b = 0; b < l.batch; ++b){ for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); - activate_array_ongpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC); + activate_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC); index = entry_index(l, b, n*l.w*l.h, l.coords); - if(!l.background) activate_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC); + if(!l.background) activate_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC); } } if (l.softmax_tree){ @@ -545,12 +545,12 @@ void backward_region_layer_gpu(const layer l, network net) for (b = 0; b < l.batch; ++b){ for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); - gradient_array_ongpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); + gradient_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); index = entry_index(l, b, n*l.w*l.h, l.coords); - if(!l.background) gradient_array_ongpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); + if(!l.background) gradient_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); } } - axpy_ongpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); + axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/reorg_layer.c b/src/reorg_layer.c index d7fc00104d9..31d6b843676 100644 --- a/src/reorg_layer.c +++ b/src/reorg_layer.c @@ -136,18 +136,18 @@ void forward_reorg_layer_gpu(layer l, network net) int i; if(l.flatten){ if(l.reverse){ - flatten_ongpu(net.input_gpu, l.w*l.h, l.c, l.batch, 0, l.output_gpu); + flatten_gpu(net.input_gpu, l.w*l.h, l.c, l.batch, 0, l.output_gpu); }else{ - flatten_ongpu(net.input_gpu, l.w*l.h, l.c, l.batch, 1, l.output_gpu); + flatten_gpu(net.input_gpu, l.w*l.h, l.c, l.batch, 1, l.output_gpu); } } else if (l.extra) { for(i = 0; i < l.batch; ++i){ - copy_ongpu(l.inputs, net.input_gpu + i*l.inputs, 1, l.output_gpu + i*l.outputs, 1); + copy_gpu(l.inputs, net.input_gpu + i*l.inputs, 1, l.output_gpu + i*l.outputs, 1); } } else if (l.reverse) { - reorg_ongpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); + reorg_gpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); }else { - reorg_ongpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, l.output_gpu); + reorg_gpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, l.output_gpu); } } @@ -155,19 +155,19 @@ void backward_reorg_layer_gpu(layer l, network net) { if(l.flatten){ if(l.reverse){ - flatten_ongpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 1, net.delta_gpu); + flatten_gpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 1, net.delta_gpu); }else{ - flatten_ongpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 0, net.delta_gpu); + flatten_gpu(l.delta_gpu, l.w*l.h, l.c, l.batch, 0, net.delta_gpu); } } else if (l.extra) { int i; for(i = 0; i < l.batch; ++i){ - copy_ongpu(l.inputs, l.delta_gpu + i*l.outputs, 1, net.delta_gpu + i*l.inputs, 1); + copy_gpu(l.inputs, l.delta_gpu + i*l.outputs, 1, net.delta_gpu + i*l.inputs, 1); } } else if(l.reverse){ - reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, net.delta_gpu); + reorg_gpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, net.delta_gpu); } else { - reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, net.delta_gpu); + reorg_gpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, net.delta_gpu); } } #endif diff --git a/src/rnn_layer.c b/src/rnn_layer.c index 6ff9a0f88ed..8c9b457e26e 100644 --- a/src/rnn_layer.c +++ b/src/rnn_layer.c @@ -26,7 +26,7 @@ static void increment_layer(layer *l, int steps) #endif } -layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, ACTIVATION activation, int batch_normalize, int log, int adam) +layer make_rnn_layer(int batch, int inputs, int outputs, int steps, ACTIVATION activation, int batch_normalize, int adam) { fprintf(stderr, "RNN Layer: %d inputs, %d outputs\n", inputs, outputs); batch = batch / steps; @@ -34,24 +34,24 @@ layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, l.batch = batch; l.type = RNN; l.steps = steps; - l.hidden = hidden; l.inputs = inputs; - l.state = calloc(batch*hidden*(steps+1), sizeof(float)); + l.state = calloc(batch*outputs, sizeof(float)); + l.prev_state = calloc(batch*outputs, sizeof(float)); l.input_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.input_layer) = make_connected_layer(batch*steps, inputs, hidden, activation, batch_normalize, adam); + *(l.input_layer) = make_connected_layer(batch*steps, inputs, outputs, activation, batch_normalize, adam); l.input_layer->batch = batch; l.self_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.self_layer) = make_connected_layer(batch*steps, hidden, hidden, (log==2)?LOGGY:(log==1?LOGISTIC:activation), batch_normalize, adam); + *(l.self_layer) = make_connected_layer(batch*steps, outputs, outputs, activation, batch_normalize, adam); l.self_layer->batch = batch; l.output_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.output_layer) = make_connected_layer(batch*steps, hidden, outputs, activation, batch_normalize, adam); + *(l.output_layer) = make_connected_layer(batch*steps, outputs, outputs, activation, batch_normalize, adam); l.output_layer->batch = batch; l.outputs = outputs; @@ -65,9 +65,15 @@ layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, l.forward_gpu = forward_rnn_layer_gpu; l.backward_gpu = backward_rnn_layer_gpu; l.update_gpu = update_rnn_layer_gpu; - l.state_gpu = cuda_make_array(l.state, batch*hidden*(steps+1)); + l.state_gpu = cuda_make_array(0, batch*outputs); + l.prev_state_gpu = cuda_make_array(0, batch*outputs); l.output_gpu = l.output_layer->output_gpu; l.delta_gpu = l.output_layer->delta_gpu; +#ifdef CUDNN + cudnnSetTensor4dDescriptor(l.input_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.input_layer->out_c, l.input_layer->out_h, l.input_layer->out_w); + cudnnSetTensor4dDescriptor(l.self_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.self_layer->out_c, l.self_layer->out_h, l.self_layer->out_w); + cudnnSetTensor4dDescriptor(l.output_layer->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batch, l.output_layer->out_c, l.output_layer->out_h, l.output_layer->out_w); +#endif #endif return l; @@ -90,9 +96,9 @@ void forward_rnn_layer(layer l, network net) layer output_layer = *(l.output_layer); fill_cpu(l.outputs * l.batch * l.steps, 0, output_layer.delta, 1); - fill_cpu(l.hidden * l.batch * l.steps, 0, self_layer.delta, 1); - fill_cpu(l.hidden * l.batch * l.steps, 0, input_layer.delta, 1); - if(net.train) fill_cpu(l.hidden * l.batch, 0, l.state, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, self_layer.delta, 1); + fill_cpu(l.outputs * l.batch * l.steps, 0, input_layer.delta, 1); + if(net.train) fill_cpu(l.outputs * l.batch, 0, l.state, 1); for (i = 0; i < l.steps; ++i) { s.input = net.input; @@ -102,14 +108,14 @@ void forward_rnn_layer(layer l, network net) forward_connected_layer(self_layer, s); float *old_state = l.state; - if(net.train) l.state += l.hidden*l.batch; + if(net.train) l.state += l.outputs*l.batch; if(l.shortcut){ - copy_cpu(l.hidden * l.batch, old_state, 1, l.state, 1); + copy_cpu(l.outputs * l.batch, old_state, 1, l.state, 1); }else{ - fill_cpu(l.hidden * l.batch, 0, l.state, 1); + fill_cpu(l.outputs * l.batch, 0, l.state, 1); } - axpy_cpu(l.hidden * l.batch, 1, input_layer.output, 1, l.state, 1); - axpy_cpu(l.hidden * l.batch, 1, self_layer.output, 1, l.state, 1); + axpy_cpu(l.outputs * l.batch, 1, input_layer.output, 1, l.state, 1); + axpy_cpu(l.outputs * l.batch, 1, self_layer.output, 1, l.state, 1); s.input = l.state; forward_connected_layer(output_layer, s); @@ -134,32 +140,32 @@ void backward_rnn_layer(layer l, network net) increment_layer(&self_layer, l.steps-1); increment_layer(&output_layer, l.steps-1); - l.state += l.hidden*l.batch*l.steps; + l.state += l.outputs*l.batch*l.steps; for (i = l.steps-1; i >= 0; --i) { - copy_cpu(l.hidden * l.batch, input_layer.output, 1, l.state, 1); - axpy_cpu(l.hidden * l.batch, 1, self_layer.output, 1, l.state, 1); + copy_cpu(l.outputs * l.batch, input_layer.output, 1, l.state, 1); + axpy_cpu(l.outputs * l.batch, 1, self_layer.output, 1, l.state, 1); s.input = l.state; s.delta = self_layer.delta; backward_connected_layer(output_layer, s); - l.state -= l.hidden*l.batch; + l.state -= l.outputs*l.batch; /* if(i > 0){ - copy_cpu(l.hidden * l.batch, input_layer.output - l.hidden*l.batch, 1, l.state, 1); - axpy_cpu(l.hidden * l.batch, 1, self_layer.output - l.hidden*l.batch, 1, l.state, 1); + copy_cpu(l.outputs * l.batch, input_layer.output - l.outputs*l.batch, 1, l.state, 1); + axpy_cpu(l.outputs * l.batch, 1, self_layer.output - l.outputs*l.batch, 1, l.state, 1); }else{ - fill_cpu(l.hidden * l.batch, 0, l.state, 1); + fill_cpu(l.outputs * l.batch, 0, l.state, 1); } */ s.input = l.state; - s.delta = self_layer.delta - l.hidden*l.batch; + s.delta = self_layer.delta - l.outputs*l.batch; if (i == 0) s.delta = 0; backward_connected_layer(self_layer, s); - copy_cpu(l.hidden*l.batch, self_layer.delta, 1, input_layer.delta, 1); - if (i > 0 && l.shortcut) axpy_cpu(l.hidden*l.batch, 1, self_layer.delta, 1, self_layer.delta - l.hidden*l.batch, 1); + copy_cpu(l.outputs*l.batch, self_layer.delta, 1, input_layer.delta, 1); + if (i > 0 && l.shortcut) axpy_cpu(l.outputs*l.batch, 1, self_layer.delta, 1, self_layer.delta - l.outputs*l.batch, 1); s.input = net.input + i*l.inputs*l.batch; if(net.delta) s.delta = net.delta + i*l.inputs*l.batch; else s.delta = 0; @@ -196,17 +202,21 @@ void update_rnn_layer_gpu(layer l, update_args a) void forward_rnn_layer_gpu(layer l, network net) { - network s = net; + network s = {0}; s.train = net.train; int i; layer input_layer = *(l.input_layer); layer self_layer = *(l.self_layer); layer output_layer = *(l.output_layer); - fill_ongpu(l.outputs * l.batch * l.steps, 0, output_layer.delta_gpu, 1); - fill_ongpu(l.hidden * l.batch * l.steps, 0, self_layer.delta_gpu, 1); - fill_ongpu(l.hidden * l.batch * l.steps, 0, input_layer.delta_gpu, 1); - if(net.train) fill_ongpu(l.hidden * l.batch, 0, l.state_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, output_layer.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, self_layer.delta_gpu, 1); + fill_gpu(l.outputs * l.batch * l.steps, 0, input_layer.delta_gpu, 1); + + if(net.train) { + fill_gpu(l.outputs * l.batch * l.steps, 0, l.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, l.state_gpu, 1, l.prev_state_gpu, 1); + } for (i = 0; i < l.steps; ++i) { s.input_gpu = net.input_gpu; @@ -215,15 +225,9 @@ void forward_rnn_layer_gpu(layer l, network net) s.input_gpu = l.state_gpu; forward_connected_layer_gpu(self_layer, s); - float *old_state = l.state_gpu; - if(net.train) l.state_gpu += l.hidden*l.batch; - if(l.shortcut){ - copy_ongpu(l.hidden * l.batch, old_state, 1, l.state_gpu, 1); - }else{ - fill_ongpu(l.hidden * l.batch, 0, l.state_gpu, 1); - } - axpy_ongpu(l.hidden * l.batch, 1, input_layer.output_gpu, 1, l.state_gpu, 1); - axpy_ongpu(l.hidden * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); + fill_gpu(l.outputs * l.batch, 0, l.state_gpu, 1); + axpy_gpu(l.outputs * l.batch, 1, input_layer.output_gpu, 1, l.state_gpu, 1); + axpy_gpu(l.outputs * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); s.input_gpu = l.state_gpu; forward_connected_layer_gpu(output_layer, s); @@ -237,7 +241,7 @@ void forward_rnn_layer_gpu(layer l, network net) void backward_rnn_layer_gpu(layer l, network net) { - network s = net; + network s = {0}; s.train = net.train; int i; layer input_layer = *(l.input_layer); @@ -246,24 +250,32 @@ void backward_rnn_layer_gpu(layer l, network net) increment_layer(&input_layer, l.steps - 1); increment_layer(&self_layer, l.steps - 1); increment_layer(&output_layer, l.steps - 1); - l.state_gpu += l.hidden*l.batch*l.steps; + float *last_input = input_layer.output_gpu; + float *last_self = self_layer.output_gpu; for (i = l.steps-1; i >= 0; --i) { + fill_gpu(l.outputs * l.batch, 0, l.state_gpu, 1); + axpy_gpu(l.outputs * l.batch, 1, input_layer.output_gpu, 1, l.state_gpu, 1); + axpy_gpu(l.outputs * l.batch, 1, self_layer.output_gpu, 1, l.state_gpu, 1); s.input_gpu = l.state_gpu; s.delta_gpu = self_layer.delta_gpu; backward_connected_layer_gpu(output_layer, s); - l.state_gpu -= l.hidden*l.batch; + if(i != 0) { + fill_gpu(l.outputs * l.batch, 0, l.state_gpu, 1); + axpy_gpu(l.outputs * l.batch, 1, input_layer.output_gpu - l.outputs*l.batch, 1, l.state_gpu, 1); + axpy_gpu(l.outputs * l.batch, 1, self_layer.output_gpu - l.outputs*l.batch, 1, l.state_gpu, 1); + }else { + copy_gpu(l.outputs*l.batch, l.prev_state_gpu, 1, l.state_gpu, 1); + } - copy_ongpu(l.hidden*l.batch, self_layer.delta_gpu, 1, input_layer.delta_gpu, 1); + copy_gpu(l.outputs*l.batch, self_layer.delta_gpu, 1, input_layer.delta_gpu, 1); s.input_gpu = l.state_gpu; - s.delta_gpu = self_layer.delta_gpu - l.hidden*l.batch; + s.delta_gpu = (i > 0) ? self_layer.delta_gpu - l.outputs*l.batch : 0; if (i == 0) s.delta_gpu = 0; backward_connected_layer_gpu(self_layer, s); - //copy_ongpu(l.hidden*l.batch, self_layer.delta_gpu, 1, input_layer.delta_gpu, 1); - if (i > 0 && l.shortcut) axpy_ongpu(l.hidden*l.batch, 1, self_layer.delta_gpu, 1, self_layer.delta_gpu - l.hidden*l.batch, 1); s.input_gpu = net.input_gpu + i*l.inputs*l.batch; if(net.delta_gpu) s.delta_gpu = net.delta_gpu + i*l.inputs*l.batch; else s.delta_gpu = 0; @@ -273,5 +285,8 @@ void backward_rnn_layer_gpu(layer l, network net) increment_layer(&self_layer, -1); increment_layer(&output_layer, -1); } + fill_gpu(l.outputs * l.batch, 0, l.state_gpu, 1); + axpy_gpu(l.outputs * l.batch, 1, last_input, 1, l.state_gpu, 1); + axpy_gpu(l.outputs * l.batch, 1, last_self, 1, l.state_gpu, 1); } #endif diff --git a/src/rnn_layer.h b/src/rnn_layer.h index 37e1f1ca801..270a63ffafc 100644 --- a/src/rnn_layer.h +++ b/src/rnn_layer.h @@ -7,7 +7,7 @@ #include "network.h" #define USET -layer make_rnn_layer(int batch, int inputs, int hidden, int outputs, int steps, ACTIVATION activation, int batch_normalize, int log, int adam); +layer make_rnn_layer(int batch, int inputs, int outputs, int steps, ACTIVATION activation, int batch_normalize, int adam); void forward_rnn_layer(layer l, network net); void backward_rnn_layer(layer l, network net); diff --git a/src/route_layer.c b/src/route_layer.c index bce66fa43ff..a8970a46001 100644 --- a/src/route_layer.c +++ b/src/route_layer.c @@ -111,7 +111,7 @@ void forward_route_layer_gpu(const route_layer l, network net) float *input = net.layers[index].output_gpu; int input_size = l.input_sizes[i]; for(j = 0; j < l.batch; ++j){ - copy_ongpu(input_size, input + j*input_size, 1, l.output_gpu + offset + j*l.outputs, 1); + copy_gpu(input_size, input + j*input_size, 1, l.output_gpu + offset + j*l.outputs, 1); } offset += input_size; } @@ -126,7 +126,7 @@ void backward_route_layer_gpu(const route_layer l, network net) float *delta = net.layers[index].delta_gpu; int input_size = l.input_sizes[i]; for(j = 0; j < l.batch; ++j){ - axpy_ongpu(input_size, 1, l.delta_gpu + offset + j*l.outputs, 1, delta + j*input_size, 1); + axpy_gpu(input_size, 1, l.delta_gpu + offset + j*l.outputs, 1, delta + j*input_size, 1); } offset += input_size; } diff --git a/src/shortcut_layer.c b/src/shortcut_layer.c index b39ba8e83e2..0818ca7edc1 100644 --- a/src/shortcut_layer.c +++ b/src/shortcut_layer.c @@ -55,15 +55,15 @@ void backward_shortcut_layer(const layer l, network net) #ifdef GPU void forward_shortcut_layer_gpu(const layer l, network net) { - copy_ongpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); + copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); shortcut_gpu(l.batch, l.w, l.h, l.c, net.layers[l.index].output_gpu, l.out_w, l.out_h, l.out_c, l.output_gpu); - activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation); + activate_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation); } void backward_shortcut_layer_gpu(const layer l, network net) { - gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); - axpy_ongpu(l.outputs*l.batch, 1, l.delta_gpu, 1, net.delta_gpu, 1); + gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); + axpy_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1, net.delta_gpu, 1); shortcut_gpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta_gpu, l.w, l.h, l.c, net.layers[l.index].delta_gpu); } #endif diff --git a/src/softmax_layer.c b/src/softmax_layer.c index 7f2048028b4..372b037c4e8 100644 --- a/src/softmax_layer.c +++ b/src/softmax_layer.c @@ -81,7 +81,7 @@ void forward_softmax_layer_gpu(const softmax_layer l, network net) void backward_softmax_layer_gpu(const softmax_layer layer, network net) { - axpy_ongpu(layer.batch*layer.inputs, 1, layer.delta_gpu, 1, net.delta_gpu, 1); + axpy_gpu(layer.batch*layer.inputs, 1, layer.delta_gpu, 1, net.delta_gpu, 1); } #endif From bc2cc8fe8651f78fc95c022e8f4a9f1f736a8560 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 18 Jun 2017 13:16:16 -0700 Subject: [PATCH 036/118] YO DAWG, I HEARD YOU LIKE LICENSES --- LICENSE.fuck | 13 + LICENSE.gpl | 674 +++++++++++++++++++++++++++++++++++++++++++++++++++ LICENSE.mit | 22 ++ 3 files changed, 709 insertions(+) create mode 100644 LICENSE.fuck create mode 100644 LICENSE.gpl create mode 100644 LICENSE.mit diff --git a/LICENSE.fuck b/LICENSE.fuck new file mode 100644 index 00000000000..8b1a9d8189b --- /dev/null +++ b/LICENSE.fuck @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + +Copyright (C) 2004 Sam Hocevar + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/LICENSE.gpl b/LICENSE.gpl new file mode 100644 index 00000000000..9cecc1d4669 --- /dev/null +++ b/LICENSE.gpl @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSE.mit b/LICENSE.mit new file mode 100644 index 00000000000..5bd806ce16e --- /dev/null +++ b/LICENSE.mit @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2017 Joseph Redmon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + From 63ebd694d733cb9cbdf51f1b6ed5c045253d5e04 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 20 Jun 2017 15:35:29 -0700 Subject: [PATCH 037/118] generate own license, totally legal :verified: :snake: :snake: :snake: --- LICENSE.gen | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++ LICENSE.meta | 8 +++++ LICENSE.v1 | 13 ++++++++ cfg/gru.cfg | 3 -- 4 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 LICENSE.gen create mode 100644 LICENSE.meta create mode 100644 LICENSE.v1 diff --git a/LICENSE.gen b/LICENSE.gen new file mode 100644 index 00000000000..c54113271e1 --- /dev/null +++ b/LICENSE.gen @@ -0,0 +1,91 @@ +RNN LICENSE Version 3, June 21 2017 + +Copyright (c) 1990, 1989, 1999 Free87337 May 48 THIRD PARTIES OR ANY OTHER THE +COMPLAIN OR CONSEQUENTIAL DAMAGES AND REGARDLESS OF WHETHER IN CONTRACT, TO THE +EXTENT REPAIR OR AGENTS (NOT THE IN ANY EVENT). THE SOFTWARE WILL BE +UNINTERRUPTED OR ERROR-FREE OR ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF ALL THE WORK (GOVERNED CODE) HIM RESPONSES, OR OF FINES, +SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR ANY OTHER OR OTHER HARL UNDER NO +CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), +PATENT PERMITTED BY THE INSTAGRAM PARENT STATE OR TORT (INCLUDING NEGLIGENCE), +PRODUCT LIABILITY OR OTHERWISE, ARISING OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR ANYTHING PROVIDED IN THIS PRODUCT, COMMIS AND SERVICES +ARE LICENSED SOFTWARE AND ANY RESULE OR ANY OTHER THE COPYRIGHT HOLDERS BE +LIABLE FOR ANY SPECIAL, INCIDENTAL, CASE, SUCH WARRANTIES, EXPRESS OR IMPLIED, +INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COPYRIGHT HOLDERS AND/OR ANY +PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY +EXPRESS OR DISTRIBUTE THAT ALL CLAIMS ARE SHALL CREATE DERAVE BE LIABLE TO YOU +WILL HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6\. TERMINATION. TO THE EXTENT PERMITTED BY LAW, NO USE OF THE COVERED CODE IS +WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE +INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY +SERVICING, REPAIR OR COULT OR IN ANY WAY OUT OF THE USE OF THE WEBSITES OR +SERVICE WILL BE CONSEQUENTIAL DAMAGES OF ANY KIND HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + +This paragraph Agreement constitutes the entire agreement between the parties +with respect to the Work licensed here. However, if you place the name of the +fact that the arbitration was the consultation of the parties as a "patent is". +Subject to the terms and conditions of this License, Contributor has knowledge +that a license under a third party may also be used to endorse or promote +products derived from the Work, and there is no warranty on the Software and +Science Fees. For the purposes of this Agreement, attach the following +disclaimers (without liabilities of written notice to the Subject Software) in a +manner that a product is under common control with you. The Free Software +Foundation may publish revised and/or new versions of the License for the +Modifications made by the applicable terms. The Recipient shall promptly retain +the covered works for any reason be entered in any federal or state or login +Restricted Laws appearing in the United States or any of its own information +that is not disabled from a derivative work except as expressly permitted in +this License, to the extent that they are in receiving the Software and Source +Code or any exercise of the rights granted to You by this License or a +Contributor made by the Licensor or are authorized to make a reasonable +retirement by the courts of the courts located in Santa Clara County, California +printed and related to the Work or “Company” and Apache Software Foundation. If +the Licensor shall be entitled to reflect your rights to use the Software and +the Software to exercise the rights granted to the recipient without a +requirement to exercise the rights granted by the Agreement to the provision +will begin will appear in such cases, you will use such information without such +corporation shall be an officer with respect to any part of the Software or any +portion thereof. Capitalized terms are included in the Initial Contributor and +under no circumstances will license the Service at any time and for any direct, +indirect, special, incidental, or consequential damages of or assist in +connection with any Services or the registration purposes only to the extent +that it includes any or all means including the processing of which you download +any derivative work. Any of the purchases’ transmission purposes are made +available, if any, in other circumstances, we may review the copyright notice. +In the event that this Agreement is required to give us strict content. The +inclusion of the other party hereunder may also notify you Intellectual Property +Rights to any third party. This means that the Source Code exists of the Work +will not charge a program available to you at any time. You must include a +prominent statement that the Software is governed under a particular version of +this Agreement. You must include a provision to the extent that there is no +warranty for the content of others. You agree that the Recipient was appointed +as a Contributor, (c) are effective until terminated by hereunder, then the +registration are not disabled and not limited to, submit any Customer Data +without the updated use of the Software and that no fee is released. You grant +to Use Other Arbitration Rules for Diagnostic or Services may use or modify the +Apple Software and Consolidated Apple Software or Services. The Company may have +full risk as a product of the Compatible Source. A Contribution by the Licensor +or by the updated Software under the following conditions we can redistribute +any General Provision of this Agreement. If the Program is used in accordance +with the terms of this Agreement, Customer may provide advertisements from your +devices that clause you can your employer or a transaction or country that has +been controlled by the arbitrator, that they will be useful of this Agreement. +The term "Open Source Software is available in connection with the program, and +you may not protect the combination of the Covered Code. You should like to +select a user's rights to charge a copy of this License. I are Contributor's +confidentiality of the exercise of the rights granted herein. Such a covered +work is released as a consequence, the Licensor shall be eligible for a purpose +or subcontractor of the person or entity to the user of the user, then the word +"Application" means having the original fee for any reason; and that no patent +license to more than fifty stated close of the license term. The terms of this +License will the license terms and conditions set forth in Section 2.2 (OPEC) +and You will not use the Software or any set of responsibility for any resulting +information that the Original Code warrants that you have the right to disclose +these information (or in the notification; or (iii) late use of the software or +any third party to the three (50) days before such belief to the extent that it +includes a court court obtains the rights granted by this License. diff --git a/LICENSE.meta b/LICENSE.meta new file mode 100644 index 00000000000..6728bd28d31 --- /dev/null +++ b/LICENSE.meta @@ -0,0 +1,8 @@ + META-LICENSE + Version 1, June 21 2017 + +Any and all licenses may be applied to the software either individually +or in concert. Any issues, ambiguities, paradoxes, or metaphysical quandries +arising from this combination should be discussed with a local faith leader, +hermit, or guru. The Oxford comma shall be used. + diff --git a/LICENSE.v1 b/LICENSE.v1 new file mode 100644 index 00000000000..5b8709acc43 --- /dev/null +++ b/LICENSE.v1 @@ -0,0 +1,13 @@ + YOLO LICENSE + Version 1, July 10 2015 + +THIS SOFTWARE LICENSE IS PROVIDED "ALL CAPS" SO THAT YOU KNOW IT IS SUPER +SERIOUS AND YOU DON'T MESS AROUND WITH COPYRIGHT LAW BECAUSE YOU WILL GET IN +TROUBLE HERE ARE SOME OTHER BUZZWORDS COMMONLY IN THESE THINGS WARRANTIES +LIABILITY CONTRACT TORT LIABLE CLAIMS RESTRICTION MERCHANTABILITY SUBJECT TO +THE FOLLOWING CONDITIONS: + +1. #yolo +2. #swag +3. #blazeit + diff --git a/cfg/gru.cfg b/cfg/gru.cfg index 1b5363ca346..cc331dcf392 100644 --- a/cfg/gru.cfg +++ b/cfg/gru.cfg @@ -13,15 +13,12 @@ power=4 max_batches=400000 [gru] -batch_normalize=1 output = 1024 [gru] -batch_normalize=1 output = 1024 [gru] -batch_normalize=1 output = 1024 [connected] From 59ed1719d4aa77a462eb41dd4db2dd3a2f8e4a1b Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 26 Jun 2017 14:00:18 -0700 Subject: [PATCH 038/118] accidentally broke multigpu a while ago :-/ --- cfg/gru.cfg | 2 +- examples/classifier.c | 1 + examples/darknet.c | 2 +- examples/detector.c | 1 + examples/rnn.c | 3 ++- examples/segmenter.c | 33 +++++++++++++------------ src/data.c | 48 +++++++++++++++++++++++++++++++++++++ src/deconvolutional_layer.c | 35 +++++++++++++++++++-------- src/image.c | 2 +- src/network.c | 5 ++++ src/network_kernels.cu | 1 - src/region_layer.c | 32 ++++++++++++------------- 12 files changed, 119 insertions(+), 46 deletions(-) diff --git a/cfg/gru.cfg b/cfg/gru.cfg index cc331dcf392..a68d3fc51d0 100644 --- a/cfg/gru.cfg +++ b/cfg/gru.cfg @@ -10,7 +10,7 @@ adam=1 policy=constant power=4 -max_batches=400000 +max_batches=1000000 [gru] output = 1024 diff --git a/examples/classifier.c b/examples/classifier.c index 0d28a58b125..ee3f40089f8 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -33,6 +33,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, cuda_set_device(gpus[i]); #endif nets[i] = load_network(cfgfile, weightfile, clear); + nets[i].learning_rate *= ngpus; } srand(time(0)); network net = nets[0]; diff --git a/examples/darknet.c b/examples/darknet.c index 92f42bca81a..a7ce1482601 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -337,7 +337,7 @@ void denormalize_net(char *cfgfile, char *weightfile, char *outfile) int i; for (i = 0; i < net.n; ++i) { layer l = net.layers[i]; - if (l.type == CONVOLUTIONAL && l.batch_normalize) { + if ((l.type == DECONVOLUTIONAL || l.type == CONVOLUTIONAL) && l.batch_normalize) { denormalize_convolutional_layer(l); net.layers[i].batch_normalize=0; } diff --git a/examples/detector.c b/examples/detector.c index 4bec0507a7b..8debcc61e2f 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -23,6 +23,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i cuda_set_device(gpus[i]); #endif nets[i] = load_network(cfgfile, weightfile, clear); + nets[i].learning_rate *= ngpus; } srand(time(0)); network net = nets[0]; diff --git a/examples/rnn.c b/examples/rnn.c index 8d1fa2424d6..af0f8985e24 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -43,6 +43,7 @@ char **read_tokens(char *filename, size_t *read) size = size*2; d = realloc(d, size*sizeof(char *)); } + if(0==strcmp(line, "")) line = "\n"; d[count-1] = line; } fclose(fp); @@ -190,7 +191,7 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, for(j = 0; j < streams; ++j){ //printf("%d\n", j); - if(rand()%10 == 0){ + if(rand()%64 == 0){ //fprintf(stderr, "Reset\n"); offsets[j] = rand_size_t()%size; reset_rnn_state(net, j); diff --git a/examples/segmenter.c b/examples/segmenter.c index e3804d3704c..2c1979d4952 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -2,7 +2,7 @@ #include #include -void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) +void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int display) { int i; @@ -95,9 +95,9 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #else loss = train_network(net, train); #endif - if(1){ - image tr = float_to_image(net.w/div, net.h/div, 80, train.y.vals[net.batch]); - image im = float_to_image(net.w, net.h, net.c, train.X.vals[net.batch]); + if(display){ + image tr = float_to_image(net.w/div, net.h/div, 80, train.y.vals[net.batch*(net.subdivisions-1)]); + image im = float_to_image(net.w, net.h, net.c, train.X.vals[net.batch*(net.subdivisions-1)]); image mask = mask_to_rgb(tr); image prmask = mask_to_rgb(pred); show_image(im, "input"); @@ -163,10 +163,10 @@ void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *fi float *X = sized.data; time=clock(); float *predictions = network_predict(net, X); - image m = float_to_image(sized.w, sized.h, 81, predictions); - image rgb = mask_to_rgb(m); + image pred = get_network_image(net); + image prmask = mask_to_rgb(pred); show_image(sized, "orig"); - show_image(rgb, "pred"); + show_image(prmask, "pred"); #ifdef OPENCV cvWaitKey(0); #endif @@ -174,7 +174,7 @@ void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *fi printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); free_image(im); free_image(sized); - free_image(rgb); + free_image(prmask); if (filename) break; } } @@ -183,7 +183,7 @@ void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *fi void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename) { #ifdef OPENCV - printf("Regressor Demo\n"); + printf("Classifier Demo\n"); network net = parse_network_cfg(cfgfile); if(weightfile){ load_weights(&net, weightfile); @@ -200,8 +200,8 @@ void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_inde } if(!cap) error("Couldn't connect to webcam.\n"); - cvNamedWindow("Regressor", CV_WINDOW_NORMAL); - cvResizeWindow("Regressor", 512, 512); + cvNamedWindow("Segmenter", CV_WINDOW_NORMAL); + cvResizeWindow("Segmenter", 512, 512); float fps = 0; while(1){ @@ -210,7 +210,6 @@ void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_inde image in = get_image_from_stream(cap); image in_s = letterbox_image(in, net.w, net.h); - show_image(in, "Regressor"); float *predictions = network_predict(net, in_s.data); @@ -218,10 +217,13 @@ void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_inde printf("\033[1;1H"); printf("\nFPS:%.0f\n",fps); - printf("People: %f\n", predictions[0]); - + image pred = get_network_image(net); + image prmask = mask_to_rgb(pred); + show_image(prmask, "Segmenter"); + free_image(in_s); free_image(in); + free_image(prmask); cvWaitKey(10); @@ -266,12 +268,13 @@ void run_segmenter(int argc, char **argv) int cam_index = find_int_arg(argc, argv, "-c", 0); int clear = find_arg(argc, argv, "-clear"); + int display = find_arg(argc, argv, "-display"); char *data = argv[3]; char *cfg = argv[4]; char *weights = (argc > 5) ? argv[5] : 0; char *filename = (argc > 6) ? argv[6]: 0; if(0==strcmp(argv[2], "test")) predict_segmenter(data, cfg, weights, filename); - else if(0==strcmp(argv[2], "train")) train_segmenter(data, cfg, weights, gpus, ngpus, clear); + else if(0==strcmp(argv[2], "train")) train_segmenter(data, cfg, weights, gpus, ngpus, clear, display); else if(0==strcmp(argv[2], "demo")) demo_segmenter(data, cfg, weights, cam_index, filename); } diff --git a/src/data.c b/src/data.c index 80ca13133d4..0f566060a93 100644 --- a/src/data.c +++ b/src/data.c @@ -623,6 +623,54 @@ data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int mi d.X.cols = h*w*3; + d.y.rows = n; + d.y.cols = h*w*classes/div/div; + d.y.vals = calloc(d.X.rows, sizeof(float*)); + + for(i = 0; i < n; ++i){ + image orig = load_image_color(random_paths[i], 0, 0); + augment_args a = random_augment_args(orig, angle, aspect, min, max, w, h); + image sized = rotate_crop_image(orig, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect); + + int flip = rand()%2; + if(flip) flip_image(sized); + random_distort_image(sized, hue, saturation, exposure); + d.X.vals[i] = sized.data; + + image mask = get_segmentation_image(random_paths[i], orig.w, orig.h, classes); + //image mask = make_image(orig.w, orig.h, classes+1); + image sized_m = rotate_crop_image(mask, a.rad, a.scale/div, a.w/div, a.h/div, a.dx/div, a.dy/div, a.aspect); + + if(flip) flip_image(sized_m); + d.y.vals[i] = sized_m.data; + + free_image(orig); + free_image(mask); + + /* + image rgb = mask_to_rgb(sized_m, classes); + show_image(rgb, "part"); + show_image(sized, "orig"); + cvWaitKey(0); + free_image(rgb); + */ + } + free(random_paths); + return d; +} + +data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int min, int max, float angle, float aspect, float hue, float saturation, float exposure, int div) +{ + char **random_paths = get_random_paths(paths, n, m); + int i; + data d = {0}; + d.shallow = 0; + + d.X.rows = n; + d.X.vals = calloc(d.X.rows, sizeof(float*)); + d.X.cols = h*w*3; + + d.y.rows = n; d.y.cols = h*w*classes/div/div; d.y.vals = calloc(d.X.rows, sizeof(float*)); diff --git a/src/deconvolutional_layer.c b/src/deconvolutional_layer.c index 0959d7388c0..674ce6b3e9f 100644 --- a/src/deconvolutional_layer.c +++ b/src/deconvolutional_layer.c @@ -112,20 +112,20 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size l.output_gpu = cuda_make_array(l.output, l.batch*l.out_h*l.out_w*n); if(batch_normalize){ - l.mean_gpu = cuda_make_array(l.mean, n); - l.variance_gpu = cuda_make_array(l.variance, n); + l.mean_gpu = cuda_make_array(0, n); + l.variance_gpu = cuda_make_array(0, n); - l.rolling_mean_gpu = cuda_make_array(l.mean, n); - l.rolling_variance_gpu = cuda_make_array(l.variance, n); + l.rolling_mean_gpu = cuda_make_array(0, n); + l.rolling_variance_gpu = cuda_make_array(0, n); - l.mean_delta_gpu = cuda_make_array(l.mean, n); - l.variance_delta_gpu = cuda_make_array(l.variance, n); + l.mean_delta_gpu = cuda_make_array(0, n); + l.variance_delta_gpu = cuda_make_array(0, n); - l.scales_gpu = cuda_make_array(l.scales, n); - l.scale_updates_gpu = cuda_make_array(l.scale_updates, n); + l.scales_gpu = cuda_make_array(0, n); + l.scale_updates_gpu = cuda_make_array(0, n); - l.x_gpu = cuda_make_array(l.output, l.batch*l.out_h*l.out_w*n); - l.x_norm_gpu = cuda_make_array(l.output, l.batch*l.out_h*l.out_w*n); + l.x_gpu = cuda_make_array(0, l.batch*l.out_h*l.out_w*n); + l.x_norm_gpu = cuda_make_array(0, l.batch*l.out_h*l.out_w*n); } } #ifdef CUDNN @@ -144,6 +144,21 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size return l; } +void denormalize_deconvolutional_layer(layer l) +{ + int i, j; + for(i = 0; i < l.n; ++i){ + float scale = l.scales[i]/sqrt(l.rolling_variance[i] + .00001); + for(j = 0; j < l.c*l.size*l.size; ++j){ + l.weights[i*l.c*l.size*l.size + j] *= scale; + } + l.biases[i] -= l.rolling_mean[i] * scale; + l.scales[i] = 1; + l.rolling_mean[i] = 0; + l.rolling_variance[i] = 1; + } +} + void resize_deconvolutional_layer(layer *l, int h, int w) { l->h = h; diff --git a/src/image.c b/src/image.c index 146ec355056..c28fd5c06b1 100644 --- a/src/image.c +++ b/src/image.c @@ -199,7 +199,7 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, float prob = probs[i][class]; if(prob > thresh){ - int width = im.h * .012; + int width = im.h * .006; if(0){ width = pow(prob, 1./2.)*10+1; diff --git a/src/network.c b/src/network.c index 0d2773e8629..424057b980a 100644 --- a/src/network.c +++ b/src/network.c @@ -312,6 +312,11 @@ void set_batch_network(network *net, int b) if(net->layers[i].type == CONVOLUTIONAL){ cudnn_convolutional_setup(net->layers + i); } + if(net->layers[i].type == DECONVOLUTIONAL){ + layer *l = net->layers + i; + cudnnSetTensor4dDescriptor(l->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l->out_c, l->out_h, l->out_w); + cudnnSetTensor4dDescriptor(l->normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l->out_c, 1, 1); + } #endif } } diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 5af37608d18..df859d70f26 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -383,7 +383,6 @@ float train_networks(network *nets, int n, data d, int interval) float sum = 0; for(i = 0; i < n; ++i){ - nets[i].learning_rate *= n; data p = get_data_part(d, i, n); threads[i] = train_network_in_thread(nets[i], p, errors + i); } diff --git a/src/region_layer.c b/src/region_layer.c index c090075ea37..86ec4d473a8 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -152,13 +152,13 @@ void forward_region_layer(const layer l, network net) for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); activate_array(l.output + index, 2*l.w*l.h, LOGISTIC); - index = entry_index(l, b, n*l.w*l.h, 4); + index = entry_index(l, b, n*l.w*l.h, l.coords); if(!l.background) activate_array(l.output + index, l.w*l.h, LOGISTIC); } } if (l.softmax_tree){ int i; - int count = 5; + int count = l.coords + 1; for (i = 0; i < l.softmax_tree->groups; ++i) { int group_size = l.softmax_tree->group_size[i]; softmax_cpu(net.input + count, group_size, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + count); @@ -186,13 +186,13 @@ void forward_region_layer(const layer l, network net) for(t = 0; t < 30; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; - int class = net.truth[t*(l.coords + 1) + b*l.truths + 4]; + int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; float maxp = 0; int maxi = 0; if(truth.x > 100000 && truth.y > 100000){ for(n = 0; n < l.n*l.w*l.h; ++n){ - int class_index = entry_index(l, b, n, 5); - int obj_index = entry_index(l, b, n, 4); + int class_index = entry_index(l, b, n, l.coords + 1); + int obj_index = entry_index(l, b, n, l.coords); float scale = l.output[obj_index]; l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); float p = scale*get_hierarchy_probability(l.output + class_index, l.softmax_tree, class, l.w*l.h); @@ -201,8 +201,8 @@ void forward_region_layer(const layer l, network net) maxi = n; } } - int class_index = entry_index(l, b, maxi, 5); - int obj_index = entry_index(l, b, maxi, 4); + int class_index = entry_index(l, b, maxi, l.coords + 1); + int obj_index = entry_index(l, b, maxi, l.coords); delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); else l.delta[obj_index] = 0; @@ -220,14 +220,14 @@ void forward_region_layer(const layer l, network net) box pred = get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); float best_iou = 0; for(t = 0; t < 30; ++t){ - box truth = float_to_box(net.truth + t*5 + b*l.truths, 1); + box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; float iou = box_iou(pred, truth); if (iou > best_iou) { best_iou = iou; } } - int obj_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 4); + int obj_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, l.coords); avg_anyobj += l.output[obj_index]; l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); if(l.background) l.delta[obj_index] = l.noobject_scale * (1 - l.output[obj_index]); @@ -247,7 +247,7 @@ void forward_region_layer(const layer l, network net) } } for(t = 0; t < 30; ++t){ - box truth = float_to_box(net.truth + t*5 + b*l.truths, 1); + box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; float best_iou = 0; @@ -356,7 +356,7 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f for (j = 0; j < l.h; ++j) { for (i = 0; i < l.w/2; ++i) { for (n = 0; n < l.n; ++n) { - for(z = 0; z < l.classes + 5; ++z){ + for(z = 0; z < l.classes + l.coords + 1; ++z){ int i1 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + i; int i2 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + (l.w - i - 1); float swap = flip[i1]; @@ -382,7 +382,7 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f for(j = 0; j < l.classes; ++j){ probs[index][j] = 0; } - int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4); + int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); float scale = l.background ? 1 : predictions[obj_index]; boxes[index] = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h, l.w*l.h); @@ -393,7 +393,7 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f hierarchy_predictions(predictions + class_index, l.classes, l.softmax_tree, 0, l.w*l.h); if(map){ for(j = 0; j < 200; ++j){ - int class_index = entry_index(l, 0, n*l.w*l.h + i, 5 + map[j]); + int class_index = entry_index(l, 0, n*l.w*l.h + i, l.coords + 1 + map[j]); float prob = scale*predictions[class_index]; probs[index][j] = (prob > thresh) ? prob : 0; } @@ -405,7 +405,7 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f } else { float max = 0; for(j = 0; j < l.classes; ++j){ - int class_index = entry_index(l, 0, n*l.w*l.h + i, 5 + j); + int class_index = entry_index(l, 0, n*l.w*l.h + i, l.coords + 1 + j); float prob = scale*predictions[class_index]; probs[index][j] = (prob > thresh) ? prob : 0; if(prob > max) max = prob; @@ -454,7 +454,7 @@ void forward_region_layer_gpu(const layer l, network net) if (group_size > mmax) mmax = group_size; } printf("%d %d %d \n", l.softmax_tree->groups, mmin, mmax); - int index = entry_index(l, 0, 0, 5); + int index = entry_index(l, 0, 0, l.coords + 1); softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); /* // TIMING CODE @@ -559,7 +559,7 @@ void zero_objectness(layer l) int i, n; for (i = 0; i < l.w*l.h; ++i){ for(n = 0; n < l.n; ++n){ - int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4); + int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); l.output[obj_index] = 0; } } From 248d9f179d942e379dd6d097f95a011a3b1f7e43 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sat, 1 Jul 2017 01:31:38 -0700 Subject: [PATCH 039/118] :fire: :fire: MEMORY LEAK!!! :fire: :fire: --- src/region_layer.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/region_layer.c b/src/region_layer.c index 86ec4d473a8..4b76d5d2c2f 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -526,12 +526,6 @@ void forward_region_layer_gpu(const layer l, network net) return; } - float *truth_cpu = 0; - if(net.truth_gpu){ - int num_truth = l.batch*l.truths; - truth_cpu = calloc(num_truth, sizeof(float)); - cuda_pull_array(net.truth_gpu, truth_cpu, num_truth); - } cuda_pull_array(l.output_gpu, net.input, l.batch*l.inputs); forward_region_layer(l, net); //cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); From 616e6305e232c1bfa76bc70c2f48e31489807b52 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 11 Jul 2017 16:44:09 -0700 Subject: [PATCH 040/118] GUYS I KNOW HOW TO MULTITHREAD :SNAKE: --- Makefile | 9 +- cfg/imagenet1k.data | 2 +- examples/classifier.c | 7 +- examples/coco.c | 2 +- examples/detector.c | 38 ++++----- examples/rnn.c | 48 +++++++++++ examples/yolo.c | 3 +- include/darknet.h | 11 ++- src/blas_kernels.cu | 13 ++- src/box.h | 1 - src/convolutional_layer.c | 4 + src/data.c | 167 ++++++++++++++++++++++++++------------ src/demo.c | 4 +- src/gemm.c | 4 + src/image.c | 19 ++++- src/network.c | 2 +- src/parser.c | 12 +++ src/region_layer.c | 124 ++++++++++++++++------------ 18 files changed, 319 insertions(+), 151 deletions(-) diff --git a/Makefile b/Makefile index a0393b535e4..1a64a0afa41 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ GPU=0 CUDNN=0 OPENCV=0 +OPENMP=0 DEBUG=0 ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ @@ -19,13 +20,17 @@ EXEC=darknet OBJDIR=./obj/ CC=gcc -NVCC=nvcc --compiler-options '-fPIC' +NVCC=nvcc AR=ar ARFLAGS=rcs OPTS=-Ofast LDFLAGS= -lm -pthread COMMON= -Iinclude/ -Isrc/ -CFLAGS=-Wall -Wfatal-errors -fPIC +CFLAGS=-Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC + +ifeq ($(OPENMP), 1) +COMMON+= -fopenmp +endif ifeq ($(DEBUG), 1) OPTS=-O0 -g diff --git a/cfg/imagenet1k.data b/cfg/imagenet1k.data index b28c26c57b5..6634a2740cf 100644 --- a/cfg/imagenet1k.data +++ b/cfg/imagenet1k.data @@ -1,6 +1,6 @@ classes=1000 train = /data/imagenet/imagenet1k.train.list -valid = /data/imagenet/imagenet1k.train.list +valid = /data/imagenet/imagenet1k.valid.list backup = /home/pjreddie/backup/ labels = data/imagenet.labels.list names = data/imagenet.shortnames.list diff --git a/examples/classifier.c b/examples/classifier.c index ee3f40089f8..75786237888 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -58,7 +58,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, load_args args = {0}; args.w = net.w; args.h = net.h; - args.threads = 32; + args.threads = 64; args.hierarchy = net.hierarchy; args.min = net.min_crop; @@ -670,7 +670,6 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi int *indexes = calloc(top, sizeof(int)); char buff[256]; char *input = buff; - int size = net.w; while(1){ if(filename){ strncpy(input, filename, 256); @@ -682,8 +681,8 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi strtok(input, "\n"); } image im = load_image_color(input, 0, 0); - image r = resize_min(im, size); - resize_network(&net, r.w, r.h); + image r = letterbox_image(im, net.w, net.h); + //resize_network(&net, r.w, r.h); //printf("%d %d\n", r.w, r.h); float *X = r.data; diff --git a/examples/coco.c b/examples/coco.c index a07906e41b7..32abcc2f5f2 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -342,7 +342,7 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); get_detection_boxes(l, 1, 1, thresh, probs, boxes, 0); if (nms) do_nms_sort(boxes, probs, l.side*l.side*l.n, l.classes, nms); - draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, coco_classes, alphabet, 80); + draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, 0, coco_classes, alphabet, 80); save_image(im, "prediction"); show_image(im, "predictions"); free_image(im); diff --git a/examples/detector.c b/examples/detector.c index 8debcc61e2f..b482cb6225f 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -41,9 +41,8 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i //int N = plist->size; char **paths = (char **)list_to_array(plist); - load_args args = {0}; - args.w = net.w; - args.h = net.h; + load_args args = get_base_args(net); + args.coords = l.coords; args.paths = paths; args.n = imgs; args.m = plist->size; @@ -52,13 +51,9 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i args.num_boxes = l.max_boxes; args.d = &buffer; args.type = DETECTION_DATA; + //args.type = INSTANCE_DATA; args.threads = 8; - args.angle = net.angle; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - pthread_t load_thread = load_data(args); clock_t time; int count = 0; @@ -102,7 +97,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i image im = float_to_image(net.w, net.h, 3, train.X.vals[zz]); int k; for(k = 0; k < l.max_boxes; ++k){ - box b = float_to_box(train.y.vals[zz] + k*5); + box b = float_to_box(train.y.vals[zz] + k*5, 1); printf("%f %f %f %f\n", b.x, b.y, b.w, b.h); draw_bbox(im, b, 1, 1,0,0); } @@ -130,7 +125,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i i = get_current_batch(net); printf("%ld: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs); - if(i%1000==0){ + if(i%100==0){ #ifdef GPU if(ngpus != 1) sync_nets(nets, ngpus, 0); #endif @@ -342,7 +337,7 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char network_predict(net, input.data); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, map, .5, 0); + get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, 0, map, .5, 0); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -473,7 +468,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out network_predict(net, X); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, map, .5, 0); + get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, 0, map, .5, 0); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -537,7 +532,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) image sized = resize_image(orig, net.w, net.h); char *id = basecfg(path); network_predict(net, sized.data); - get_region_boxes(l, sized.w, sized.h, net.w, net.h, thresh, probs, boxes, 1, 0, .5, 1); + get_region_boxes(l, sized.w, sized.h, net.w, net.h, thresh, probs, boxes, 0, 1, 0, .5, 1); if (nms) do_nms(boxes, probs, l.w*l.h*l.n, 1, nms); char labelpath[4096]; @@ -589,11 +584,11 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam } set_batch_network(&net, 1); srand(2222222); - clock_t time; + double time; char buff[256]; char *input = buff; int j; - float nms=.4; + float nms=.3; while(1){ if(filename){ strncpy(input, filename, 256); @@ -615,15 +610,20 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(l.classes + 1, sizeof(float *)); + float **masks = 0; + if (l.coords > 4){ + masks = calloc(l.w*l.h*l.n, sizeof(float*)); + for(j = 0; j < l.w*l.h*l.n; ++j) masks[j] = calloc(l.coords-4, sizeof(float *)); + } float *X = sized.data; - time=clock(); + time=what_time_is_it_now(); network_predict(net, X); - printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - get_region_boxes(l, im.w, im.h, net.w, net.h, thresh, probs, boxes, 0, 0, hier_thresh, 1); + printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time); + get_region_boxes(l, im.w, im.h, net.w, net.h, thresh, probs, boxes, masks, 0, 0, hier_thresh, 1); if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); //else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); - draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); + draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, masks, names, alphabet, l.classes); if(outfile){ save_image(im, outfile); } diff --git a/examples/rnn.c b/examples/rnn.c index af0f8985e24..faef6a7c3da 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -279,6 +279,54 @@ void test_char_rnn(char *cfgfile, char *weightfile, int num, char *seed, float t printf("\n"); } +void test_tactic_rnn_multi(char *cfgfile, char *weightfile, int num, float temp, int rseed, char *token_file) +{ + char **tokens = 0; + if(token_file){ + size_t n; + tokens = read_tokens(token_file, &n); + } + + srand(rseed); + char *base = basecfg(cfgfile); + fprintf(stderr, "%s\n", base); + + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + int inputs = net.inputs; + + int i, j; + for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp; + int c = 0; + float *input = calloc(inputs, sizeof(float)); + float *out = 0; + + while(1){ + reset_rnn_state(net, 0); + while((c = getc(stdin)) != EOF && c != 0){ + input[c] = 1; + out = network_predict(net, input); + input[c] = 0; + } + for(i = 0; i < num; ++i){ + for(j = 0; j < inputs; ++j){ + if (out[j] < .0001) out[j] = 0; + } + int next = sample_array(out, inputs); + if(c == '.' && next == '\n') break; + c = next; + print_symbol(c, tokens); + + input[c] = 1; + out = network_predict(net, input); + input[c] = 0; + } + printf("\n"); + } +} + void test_tactic_rnn(char *cfgfile, char *weightfile, int num, float temp, int rseed, char *token_file) { char **tokens = 0; diff --git a/examples/yolo.c b/examples/yolo.c index 5b3fd163b10..39a3f4998a2 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -308,8 +308,7 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); get_detection_boxes(l, 1, 1, thresh, probs, boxes, 0); if (nms) do_nms_sort(boxes, probs, l.side*l.side*l.n, l.classes, nms); - //draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, alphabet, 20); - draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, alphabet, 20); + draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, 0, voc_names, alphabet, 20); save_image(im, "predictions"); show_image(im, "predictions"); diff --git a/include/darknet.h b/include/darknet.h index 8ae68eb42a5..92425e214eb 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -175,6 +175,7 @@ struct layer{ float coord_scale; float object_scale; float noobject_scale; + float mask_scale; float class_scale; int bias_match; int random; @@ -508,7 +509,7 @@ typedef struct{ } data; typedef enum { - CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA, SEGMENTATION_DATA + CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA, SEGMENTATION_DATA, INSTANCE_DATA } data_type; typedef struct load_args{ @@ -530,6 +531,7 @@ typedef struct load_args{ int background; int scale; int center; + int coords; float jitter; float angle; float aspect; @@ -642,7 +644,7 @@ void save_weights_upto(network net, char *filename, int cutoff); void load_weights_upto(network *net, char *filename, int start, int cutoff); void zero_objectness(layer l); -void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int relative); +void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, float **masks, int only_objectness, int *map, float tree_thresh, int relative); void free_network(network net); void set_batch_network(network *net, int b); image load_image(char *filename, int w, int h, int c); @@ -677,13 +679,15 @@ void random_distort_image(image im, float hue, float saturation, float exposure) void fill_image(image m, float s); image grayscale_image(image im); void rotate_image_cw(image im, int times); +double what_time_is_it_now(); image rotate_image(image m, float rad); void visualize_network(network net); float box_iou(box a, box b); void do_nms(box *boxes, float **probs, int total, int classes, float thresh); data load_all_cifar10(); box_label *read_boxes(char *filename, int *n); -void draw_detections(image im, int num, float thresh, box *boxes, float **probs, char **names, image **labels, int classes); +box float_to_box(float *f, int stride); +void draw_detections(image im, int num, float thresh, box *boxes, float **probs, float **masks, char **names, image **alphabet, int classes); matrix network_predict_data(network net, data test); image **load_alphabet(); @@ -709,6 +713,7 @@ image get_image_from_stream(CvCapture *cap); void free_image(image m); float train_network(network net, data d); pthread_t load_data_in_thread(load_args args); +void load_data_blocking(load_args args); list *get_paths(char *filename); void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves, int stride); void change_leaves(tree *t, char *leaf_list); diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index 484d469e155..867db038594 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -698,9 +698,6 @@ extern "C" void shortcut_gpu(int batch, int w1, int h1, int c1, float *add, int int minw = (w1 < w2) ? w1 : w2; int minh = (h1 < h2) ? h1 : h2; int minc = (c1 < c2) ? c1 : c2; - assert(w1 == w2); - assert(h1 == h2); - assert(c1 == c2); int stride = w1/w2; int sample = w2/w1; @@ -892,19 +889,21 @@ __global__ void softmax_tree_kernel(float *input, int spatial, int batch, int st extern "C" void softmax_tree(float *input, int spatial, int batch, int stride, float temp, float *output, tree hier) { - //int *tree_groups_size = cuda_make_int_array(hier.group_size, hier.groups); - //int *tree_groups_offset = cuda_make_int_array(hier.group_offset, hier.groups); + int *tree_groups_size = cuda_make_int_array(hier.group_size, hier.groups); + int *tree_groups_offset = cuda_make_int_array(hier.group_offset, hier.groups); + /* static int *tree_groups_size = 0; static int *tree_groups_offset = 0; if(!tree_groups_size){ tree_groups_size = cuda_make_int_array(hier.group_size, hier.groups); tree_groups_offset = cuda_make_int_array(hier.group_offset, hier.groups); } + */ int num = spatial*batch*hier.groups; softmax_tree_kernel<<>>(input, spatial, batch, stride, temp, output, hier.groups, tree_groups_size, tree_groups_offset); check_error(cudaPeekAtLastError()); - //cuda_free((float *)tree_groups_size); - //cuda_free((float *)tree_groups_offset); + cuda_free((float *)tree_groups_size); + cuda_free((float *)tree_groups_offset); } __global__ void softmax_kernel(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output) diff --git a/src/box.h b/src/box.h index 35e8bdc9a21..dda3e59100c 100644 --- a/src/box.h +++ b/src/box.h @@ -6,7 +6,6 @@ typedef struct{ float dx, dy, dw, dh; } dbox; -box float_to_box(float *f, int stride); float box_rmse(box a, box b); dbox diou(box a, box b); box decode_box(box b, box anchor); diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index a12b7c23fe0..93f8ba995cb 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -130,7 +130,11 @@ void cudnn_convolutional_setup(layer *l) cudnnSetTensor4dDescriptor(l->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l->batch, l->out_c, l->out_h, l->out_w); cudnnSetTensor4dDescriptor(l->normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l->out_c, 1, 1); cudnnSetFilter4dDescriptor(l->weightDesc, CUDNN_DATA_FLOAT, CUDNN_TENSOR_NCHW, l->n, l->c, l->size, l->size); + #if CUDNN_MAJOR >= 6 + cudnnSetConvolution2dDescriptor(l->convDesc, l->pad, l->pad, l->stride, l->stride, 1, 1, CUDNN_CROSS_CORRELATION, CUDNN_DATA_FLOAT); + #else cudnnSetConvolution2dDescriptor(l->convDesc, l->pad, l->pad, l->stride, l->stride, 1, 1, CUDNN_CROSS_CORRELATION); + #endif cudnnGetConvolutionForwardAlgorithm(cudnn_handle(), l->srcTensorDesc, l->weightDesc, diff --git a/src/data.c b/src/data.c index 0f566060a93..e060e9371dc 100644 --- a/src/data.c +++ b/src/data.c @@ -295,6 +295,112 @@ void fill_truth_region(char *path, float *truth, int classes, int num_boxes, int free(boxes); } +void load_rle(image im, int *rle, int n) +{ + int count = 0; + int curr = 0; + int i,j; + for(i = 0; i < n; ++i){ + for(j = 0; j < rle[i]; ++j){ + im.data[count++] = curr; + } + curr = 1 - curr; + } + for(; count < im.h*im.w*im.c; ++count){ + im.data[count] = curr; + } +} + +void or_image(image src, image dest, int c) +{ + int i; + for(i = 0; i < src.w*src.h; ++i){ + if(src.data[i]) dest.data[dest.w*dest.h*c + i] = 1; + } +} + +void exclusive_image(image src) +{ + int k, j, i; + int s = src.w*src.h; + for(k = 0; k < src.c-1; ++k){ + for(i = 0; i < s; ++i){ + if (src.data[k*s + i]){ + for(j = k+1; j < src.c; ++j){ + src.data[j*s + i] = 0; + } + } + } + } +} + +box bound_image(image im) +{ + int x,y; + int minx = im.w; + int miny = im.h; + int maxx = 0; + int maxy = 0; + for(y = 0; y < im.h; ++y){ + for(x = 0; x < im.w; ++x){ + if(im.data[y*im.w + x]){ + minx = (x < minx) ? x : minx; + miny = (y < miny) ? y : miny; + maxx = (x > maxx) ? x : maxx; + maxy = (y > maxy) ? y : maxy; + } + } + } + box b = {minx, miny, maxx-minx + 1, maxy-miny + 1}; + //printf("%f %f %f %f\n", b.x, b.y, b.w, b.h); + return b; +} + +void fill_truth_iseg(char *path, int num_boxes, float *truth, int classes, int w, int h, augment_args aug, int flip, int mw, int mh) +{ + char labelpath[4096]; + find_replace(path, "images", "mask", labelpath); + find_replace(labelpath, "JPEGImages", "mask", labelpath); + find_replace(labelpath, ".jpg", ".txt", labelpath); + find_replace(labelpath, ".JPG", ".txt", labelpath); + find_replace(labelpath, ".JPEG", ".txt", labelpath); + FILE *file = fopen(labelpath, "r"); + if(!file) file_error(labelpath); + char buff[32788]; + int id; + int i = 0; + image part = make_image(w, h, 1); + while((fscanf(file, "%d %s", &id, buff) == 2) && i < num_boxes){ + int n = 0; + int *rle = read_intlist(buff, &n, 0); + load_rle(part, rle, n); + image sized = rotate_crop_image(part, aug.rad, aug.scale, aug.w, aug.h, aug.dx, aug.dy, aug.aspect); + if(flip) flip_image(sized); + box b = bound_image(sized); + if(b.w > 0){ + image crop = crop_image(sized, b.x, b.y, b.w, b.h); + image mask = resize_image(crop, mw, mh); + truth[i*(4 + mw*mh + 1) + 0] = (b.x + b.w/2.)/sized.w; + truth[i*(4 + mw*mh + 1) + 1] = (b.y + b.h/2.)/sized.h; + truth[i*(4 + mw*mh + 1) + 2] = b.w/sized.w; + truth[i*(4 + mw*mh + 1) + 3] = b.h/sized.h; + int j; + for(j = 0; j < mw*mh; ++j){ + truth[i*(4 + mw*mh + 1) + 4 + j] = mask.data[j]; + } + truth[i*(4 + mw*mh + 1) + 4 + mw*mh] = id; + free_image(crop); + free_image(mask); + ++i; + } + free_image(sized); + free(rle); + } + fclose(file); + free_image(part); +} + + void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, int flip, float dx, float dy, float sx, float sy) { char labelpath[4096]; @@ -443,7 +549,7 @@ matrix load_regression_labels_paths(char **paths, int n) find_replace(labelpath, "JPEGImages", "targets", labelpath); find_replace(labelpath, ".jpg", ".txt", labelpath); find_replace(labelpath, ".png", ".txt", labelpath); - + FILE *file = fopen(labelpath, "r"); fscanf(file, "%f", &(y.vals[i][0])); fclose(file); @@ -511,45 +617,6 @@ void free_data(data d) } } -void load_rle(image im, int *rle, int n) -{ - int count = 0; - int curr = 0; - int i,j; - for(i = 0; i < n; ++i){ - for(j = 0; j < rle[i]; ++j){ - im.data[count++] = curr; - } - curr = 1 - curr; - } - for(; count < im.h*im.w*im.c; ++count){ - im.data[count] = curr; - } -} - -void or_image(image src, image dest, int c) -{ - int i; - for(i = 0; i < src.w*src.h; ++i){ - if(src.data[i]) dest.data[dest.w*dest.h*c + i] = 1; - } -} - -void exclusive_image(image src) -{ - int k, j, i; - int s = src.w*src.h; - for(k = 0; k < src.c-1; ++k){ - for(i = 0; i < s; ++i){ - if (src.data[k*s + i]){ - for(j = k+1; j < src.c; ++j){ - src.data[j*s + i] = 0; - } - } - } - } -} - image get_segmentation_image(char *path, int w, int h, int classes) { char labelpath[4096]; @@ -659,7 +726,7 @@ data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int mi return d; } -data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int min, int max, float angle, float aspect, float hue, float saturation, float exposure, int div) +data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int boxes, int coords, int min, int max, float angle, float aspect, float hue, float saturation, float exposure) { char **random_paths = get_random_paths(paths, n, m); int i; @@ -670,32 +737,22 @@ data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int m d.X.vals = calloc(d.X.rows, sizeof(float*)); d.X.cols = h*w*3; - - d.y.rows = n; - d.y.cols = h*w*classes/div/div; - d.y.vals = calloc(d.X.rows, sizeof(float*)); + d.y = make_matrix(n, (coords+1)*boxes); for(i = 0; i < n; ++i){ image orig = load_image_color(random_paths[i], 0, 0); augment_args a = random_augment_args(orig, angle, aspect, min, max, w, h); - a.dx = 0; - a.dy = 0; image sized = rotate_crop_image(orig, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect); int flip = rand()%2; if(flip) flip_image(sized); random_distort_image(sized, hue, saturation, exposure); d.X.vals[i] = sized.data; + //show_image(sized, "image"); - image mask = get_segmentation_image(random_paths[i], orig.w, orig.h, classes); - //image mask = make_image(orig.w, orig.h, classes+1); - image sized_m = rotate_crop_image(mask, a.rad, a.scale/div, a.w/div, a.h/div, a.dx, a.dy, a.aspect); - - if(flip) flip_image(sized_m); - d.y.vals[i] = sized_m.data; + fill_truth_iseg(random_paths[i], boxes, d.y.vals[i], classes, orig.w, orig.h, a, flip, 14, 14); free_image(orig); - free_image(mask); /* image rgb = mask_to_rgb(sized_m, classes); @@ -950,6 +1007,8 @@ void *load_thread(void *ptr) *a.d = load_data_super(a.paths, a.n, a.m, a.w, a.h, a.scale); } else if (a.type == WRITING_DATA){ *a.d = load_data_writing(a.paths, a.n, a.m, a.w, a.h, a.out_w, a.out_h); + } else if (a.type == INSTANCE_DATA){ + *a.d = load_data_iseg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.num_boxes, a.coords, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } else if (a.type == SEGMENTATION_DATA){ *a.d = load_data_seg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure, a.scale); } else if (a.type == REGION_DATA){ diff --git a/src/demo.c b/src/demo.c index 9dc4946a6dc..a84c2a3f22f 100644 --- a/src/demo.c +++ b/src/demo.c @@ -66,7 +66,7 @@ void *detect_in_thread(void *ptr) if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else if (l.type == REGION){ - get_region_boxes(l, buff[0].w, buff[0].h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, demo_hier, 1); + get_region_boxes(l, buff[0].w, buff[0].h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, 0, demo_hier, 1); } else { error("Last layer must produce detections\n"); } @@ -77,7 +77,7 @@ void *detect_in_thread(void *ptr) printf("\nFPS:%.1f\n",fps); printf("Objects:\n\n"); image display = buff[(buff_index+2) % 3]; - draw_detections(display, demo_detections, demo_thresh, boxes, probs, demo_names, demo_alphabet, demo_classes); + draw_detections(display, demo_detections, demo_thresh, boxes, probs, 0, demo_names, demo_alphabet, demo_classes); demo_index = (demo_index + 1)%demo_frame; running = 0; diff --git a/src/gemm.c b/src/gemm.c index 53ab1404f98..648027f2cdf 100644 --- a/src/gemm.c +++ b/src/gemm.c @@ -77,6 +77,7 @@ void gemm_nn(int M, int N, int K, float ALPHA, float *C, int ldc) { int i,j,k; + #pragma omp parallel for for(i = 0; i < M; ++i){ for(k = 0; k < K; ++k){ register float A_PART = ALPHA*A[i*lda+k]; @@ -93,6 +94,7 @@ void gemm_nt(int M, int N, int K, float ALPHA, float *C, int ldc) { int i,j,k; + #pragma omp parallel for for(i = 0; i < M; ++i){ for(j = 0; j < N; ++j){ register float sum = 0; @@ -110,6 +112,7 @@ void gemm_tn(int M, int N, int K, float ALPHA, float *C, int ldc) { int i,j,k; + #pragma omp parallel for for(i = 0; i < M; ++i){ for(k = 0; k < K; ++k){ register float A_PART = ALPHA*A[k*lda+i]; @@ -126,6 +129,7 @@ void gemm_tt(int M, int N, int K, float ALPHA, float *C, int ldc) { int i,j,k; + #pragma omp parallel for for(i = 0; i < M; ++i){ for(j = 0; j < N; ++j){ register float sum = 0; diff --git a/src/image.c b/src/image.c index c28fd5c06b1..ece5ff50434 100644 --- a/src/image.c +++ b/src/image.c @@ -190,7 +190,7 @@ image **load_alphabet() return alphabets; } -void draw_detections(image im, int num, float thresh, box *boxes, float **probs, char **names, image **alphabet, int classes) +void draw_detections(image im, int num, float thresh, box *boxes, float **probs, float **masks, char **names, image **alphabet, int classes) { int i; @@ -198,7 +198,6 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, int class = max_index(probs[i], classes); float prob = probs[i][class]; if(prob > thresh){ - int width = im.h * .006; if(0){ @@ -237,6 +236,15 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, draw_label(im, top + width, left, label, rgb); free_image(label); } + if (masks){ + image mask = float_to_image(14, 14, 1, masks[i]); + image resized_mask = resize_image(mask, b.w*im.w, b.h*im.h); + image tmask = threshold_image(resized_mask, .5); + embed_image(tmask, im, left, top); + free_image(mask); + free_image(resized_mask); + free_image(tmask); + } } } } @@ -933,8 +941,8 @@ augment_args random_augment_args(image im, float angle, float aspect, int low, i float dx = (im.w*scale/aspect - w) / 2.; float dy = (im.h*scale - w) / 2.; - if(dx < 0) dx = 0; - if(dy < 0) dy = 0; + //if(dx < 0) dx = 0; + //if(dy < 0) dy = 0; dx = rand_uniform(-dx, dx); dy = rand_uniform(-dy, dy); @@ -1419,10 +1427,13 @@ float get_pixel(image m, int x, int y, int c) } float get_pixel_extend(image m, int x, int y, int c) { + if(x < 0 || x >= m.w || y < 0 || y >= m.h) return 0; + /* if(x < 0) x = 0; if(x >= m.w) x = m.w-1; if(y < 0) y = 0; if(y >= m.h) y = m.h-1; + */ if(c < 0 || c >= m.c) return 0; return get_pixel(m, x, y, c); } diff --git a/src/network.c b/src/network.c index 424057b980a..c72df25ec14 100644 --- a/src/network.c +++ b/src/network.c @@ -173,7 +173,7 @@ network make_network(int n) network net = {0}; net.n = n; net.layers = calloc(net.n, sizeof(layer)); - net.seen = calloc(1, sizeof(int)); + net.seen = calloc(1, sizeof(size_t)); net.t = calloc(1, sizeof(int)); net.cost = calloc(1, sizeof(float)); return net; diff --git a/src/parser.c b/src/parser.c index da025367938..80bf2750aa9 100644 --- a/src/parser.c +++ b/src/parser.c @@ -296,6 +296,7 @@ layer parse_region(list *options, size_params params) l.coord_scale = option_find_float(options, "coord_scale", 1); l.object_scale = option_find_float(options, "object_scale", 1); l.noobject_scale = option_find_float(options, "noobject_scale", 1); + l.mask_scale = option_find_float(options, "mask_scale", 1); l.class_scale = option_find_float(options, "class_scale", 1); l.bias_match = option_find_int_quiet(options, "bias_match",0); @@ -1061,6 +1062,17 @@ void load_convolutional_weights(layer l, FILE *fp) fill_cpu(l.n, 0, l.rolling_mean, 1); fill_cpu(l.n, 0, l.rolling_variance, 1); } + if(0){ + int i; + for(i = 0; i < l.n; ++i){ + printf("%g, ", l.rolling_mean[i]); + } + printf("\n"); + for(i = 0; i < l.n; ++i){ + printf("%g, ", l.rolling_variance[i]); + } + printf("\n"); + } } fread(l.weights, sizeof(float), num, fp); //if(l.c == 3) scal_cpu(num, 1./256, l.weights, 1); diff --git a/src/region_layer.c b/src/region_layer.c index 86ec4d473a8..b0a8facf550 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -100,6 +100,15 @@ float delta_region_box(box truth, float *x, float *biases, int n, int index, int return iou; } +void delta_region_mask(float *truth, float *x, int n, int index, float *delta, int stride, int scale) +{ + int i; + for(i = 0; i < n; ++i){ + delta[index + i*stride] = scale*(truth[i] - x[index + i*stride]); + } +} + + void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, int stride, float *avg_cat) { int i, n; @@ -194,7 +203,7 @@ void forward_region_layer(const layer l, network net) int class_index = entry_index(l, b, n, l.coords + 1); int obj_index = entry_index(l, b, n, l.coords); float scale = l.output[obj_index]; - l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); + //l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); float p = scale*get_hierarchy_probability(l.output + class_index, l.softmax_tree, class, l.w*l.h); if(p > maxp){ maxp = p; @@ -204,8 +213,9 @@ void forward_region_layer(const layer l, network net) int class_index = entry_index(l, b, maxi, l.coords + 1); int obj_index = entry_index(l, b, maxi, l.coords); delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); - if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); - else l.delta[obj_index] = 0; + //if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); + //else l.delta[obj_index] = 0; + l.delta[obj_index] = 0; ++class_count; onlyclass = 1; break; @@ -279,6 +289,10 @@ void forward_region_layer(const layer l, network net) int box_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 0); float iou = delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, l.delta, l.coord_scale * (2 - truth.w*truth.h), l.w*l.h); + if(l.coords > 4){ + int mask_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 4); + delta_region_mask(net.truth + t*(l.coords + 1) + b*l.truths + 5, l.output, l.coords - 4, mask_index, l.delta, l.w*l.h, l.mask_scale); + } if(iou > .5) recall += 1; avg_iou += iou; @@ -347,7 +361,7 @@ void correct_region_boxes(box *boxes, int n, int w, int h, int netw, int neth, i } } -void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, int only_objectness, int *map, float tree_thresh, int relative) +void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, float **masks, int only_objectness, int *map, float tree_thresh, int relative) { int i,j,n,z; float *predictions = l.output; @@ -382,10 +396,16 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f for(j = 0; j < l.classes; ++j){ probs[index][j] = 0; } - int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); - int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); + int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); + int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); + int mask_index = entry_index(l, 0, n*l.w*l.h + i, 4); float scale = l.background ? 1 : predictions[obj_index]; boxes[index] = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h, l.w*l.h); + if(masks){ + for(j = 0; j < l.coords - 4; ++j){ + masks[index][j] = l.output[mask_index + j*l.w*l.h]; + } + } int class_index = entry_index(l, 0, n*l.w*l.h + i, l.coords + !l.background); if(l.softmax_tree){ @@ -440,11 +460,18 @@ void forward_region_layer_gpu(const layer l, network net) for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); activate_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC); + if(l.coords > 4){ + index = entry_index(l, b, n*l.w*l.h, 4); + activate_array_gpu(l.output_gpu + index, (l.coords - 4)*l.w*l.h, LOGISTIC); + } index = entry_index(l, b, n*l.w*l.h, l.coords); if(!l.background) activate_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC); } } if (l.softmax_tree){ + int index = entry_index(l, 0, 0, l.coords + 1); + softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); + /* int mmin = 9000; int mmax = 0; int i; @@ -453,9 +480,8 @@ void forward_region_layer_gpu(const layer l, network net) if (group_size < mmin) mmin = group_size; if (group_size > mmax) mmax = group_size; } - printf("%d %d %d \n", l.softmax_tree->groups, mmin, mmax); - int index = entry_index(l, 0, 0, l.coords + 1); - softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); + //printf("%d %d %d \n", l.softmax_tree->groups, mmin, mmax); + */ /* // TIMING CODE int zz; @@ -463,49 +489,49 @@ void forward_region_layer_gpu(const layer l, network net) int count = 0; int i; for (i = 0; i < l.softmax_tree->groups; ++i) { - int group_size = l.softmax_tree->group_size[i]; - count += group_size; + int group_size = l.softmax_tree->group_size[i]; + count += group_size; } printf("%d %d\n", l.softmax_tree->groups, count); { - double then = what_time_is_it_now(); - for(zz = 0; zz < number; ++zz){ - int index = entry_index(l, 0, 0, 5); - softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); - } - cudaDeviceSynchronize(); - printf("Good GPU Timing: %f\n", what_time_is_it_now() - then); + double then = what_time_is_it_now(); + for(zz = 0; zz < number; ++zz){ + int index = entry_index(l, 0, 0, 5); + softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); + } + cudaDeviceSynchronize(); + printf("Good GPU Timing: %f\n", what_time_is_it_now() - then); } { - double then = what_time_is_it_now(); - for(zz = 0; zz < number; ++zz){ - int i; - int count = 5; - for (i = 0; i < l.softmax_tree->groups; ++i) { - int group_size = l.softmax_tree->group_size[i]; - int index = entry_index(l, 0, 0, count); - softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); - count += group_size; - } - } - cudaDeviceSynchronize(); - printf("Bad GPU Timing: %f\n", what_time_is_it_now() - then); + double then = what_time_is_it_now(); + for(zz = 0; zz < number; ++zz){ + int i; + int count = 5; + for (i = 0; i < l.softmax_tree->groups; ++i) { + int group_size = l.softmax_tree->group_size[i]; + int index = entry_index(l, 0, 0, count); + softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); + count += group_size; + } + } + cudaDeviceSynchronize(); + printf("Bad GPU Timing: %f\n", what_time_is_it_now() - then); } { - double then = what_time_is_it_now(); - for(zz = 0; zz < number; ++zz){ - int i; - int count = 5; - for (i = 0; i < l.softmax_tree->groups; ++i) { - int group_size = l.softmax_tree->group_size[i]; - softmax_cpu(net.input + count, group_size, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + count); - count += group_size; - } - } - cudaDeviceSynchronize(); - printf("CPU Timing: %f\n", what_time_is_it_now() - then); + double then = what_time_is_it_now(); + for(zz = 0; zz < number; ++zz){ + int i; + int count = 5; + for (i = 0; i < l.softmax_tree->groups; ++i) { + int group_size = l.softmax_tree->group_size[i]; + softmax_cpu(net.input + count, group_size, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + count); + count += group_size; } - */ + } + cudaDeviceSynchronize(); + printf("CPU Timing: %f\n", what_time_is_it_now() - then); + } + */ /* int i; int count = 5; @@ -526,12 +552,6 @@ void forward_region_layer_gpu(const layer l, network net) return; } - float *truth_cpu = 0; - if(net.truth_gpu){ - int num_truth = l.batch*l.truths; - truth_cpu = calloc(num_truth, sizeof(float)); - cuda_pull_array(net.truth_gpu, truth_cpu, num_truth); - } cuda_pull_array(l.output_gpu, net.input, l.batch*l.inputs); forward_region_layer(l, net); //cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); @@ -546,6 +566,10 @@ void backward_region_layer_gpu(const layer l, network net) for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); gradient_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); + if(l.coords > 4){ + index = entry_index(l, b, n*l.w*l.h, 4); + gradient_array_gpu(l.output_gpu + index, (l.coords - 4)*l.w*l.h, LOGISTIC, l.delta_gpu + index); + } index = entry_index(l, b, n*l.w*l.h, l.coords); if(!l.background) gradient_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); } From 0710531b666d233cae5f88706c754d900a2600af Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 11 Jul 2017 17:02:07 -0700 Subject: [PATCH 041/118] :charizard: NEW MODELSgit add -f cfg/densenet201.cfg git add -f cfg/densenet201.cfg :charizard: --- cfg/densenet201.cfg | 1954 +++++++++++++++++++++++++++++++++++++++++++ cfg/resnet50.cfg | 511 +++++++++++ 2 files changed, 2465 insertions(+) create mode 100644 cfg/densenet201.cfg create mode 100644 cfg/resnet50.cfg diff --git a/cfg/densenet201.cfg b/cfg/densenet201.cfg new file mode 100644 index 00000000000..5e1e7dd1fda --- /dev/null +++ b/cfg/densenet201.cfg @@ -0,0 +1,1954 @@ +[net] +# Training +# batch=128 +# subdivisions=4 + +# Testing +batch=1 +subdivisions=1 + +height=256 +width=256 +max_crop=448 +channels=3 +momentum=0.9 +decay=0.0005 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=1600000 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + +[convolutional] +batch_normalize=1 +filters=64 +size=7 +stride=2 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[route] +layers=-1,-3 + + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[avgpool] + +[softmax] +groups=1 + +[cost] +type=sse + diff --git a/cfg/resnet50.cfg b/cfg/resnet50.cfg new file mode 100644 index 00000000000..bfe69b18e3b --- /dev/null +++ b/cfg/resnet50.cfg @@ -0,0 +1,511 @@ +[net] +# Training +# batch=128 +# subdivisions=4 + +# Testing +batch=1 +subdivisions=1 + +height=256 +width=256 +max_crop=448 +channels=3 +momentum=0.9 +decay=0.0005 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=1600000 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + +[convolutional] +batch_normalize=1 +filters=64 +size=7 +stride=2 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +# Conv 4 +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +#Conv 5 +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + + + + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[avgpool] + +[softmax] +groups=1 + +[cost] +type=sse + From 7a223d8591e0a497889b9fce9bc43ac4bd3969fd Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Fri, 21 Jul 2017 19:33:49 -0700 Subject: [PATCH 042/118] gotta make a CVPR demo --- examples/classifier.c | 10 ++-- examples/detector.c | 2 +- src/demo.c | 118 ++++++++++++++++++++++++++++++++++-------- 3 files changed, 102 insertions(+), 28 deletions(-) diff --git a/examples/classifier.c b/examples/classifier.c index 75786237888..593b34e5e5f 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -53,7 +53,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, char **paths = (char **)list_to_array(plist); printf("%d\n", plist->size); int N = plist->size; - clock_t time; + double time; load_args args = {0}; args.w = net.w; @@ -85,14 +85,14 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int epoch = (*net.seen)/N; while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ - time=clock(); + time = what_time_is_it_now(); pthread_join(load_thread, 0); train = buffer; load_thread = load_data(args); - printf("Loaded: %lf seconds\n", sec(clock()-time)); - time=clock(); + printf("Loaded: %lf seconds\n", what_time_is_it_now()-time); + time = what_time_is_it_now(); float loss = 0; #ifdef GPU @@ -106,7 +106,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #endif if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net.seen); free_data(train); if(*net.seen/N > epoch){ epoch = *net.seen/N; diff --git a/examples/detector.c b/examples/detector.c index b482cb6225f..0537588c47a 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -503,7 +503,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); srand(time(0)); - list *plist = get_paths("data/voc.2007.test"); + list *plist = get_paths("data/coco_val_5k.list"); char **paths = (char **)list_to_array(plist); layer l = net.layers[net.n-1]; diff --git a/src/demo.c b/src/demo.c index a84c2a3f22f..a60c456d36a 100644 --- a/src/demo.c +++ b/src/demo.c @@ -20,6 +20,10 @@ static int demo_classes; static float **probs; static box *boxes; static network net; +static network net2; +static float **probs2; +static box *boxes2; +static float **predictions2; static image buff [3]; static image buff_letter[3]; static int buff_index = 0; @@ -30,14 +34,11 @@ static float demo_thresh = 0; static float demo_hier = .5; static int running = 0; -static int demo_delay = 0; static int demo_frame = 3; static int demo_detections = 0; static float **predictions; static int demo_index = 0; static int demo_done = 0; -static float *last_avg2; -static float *last_avg; static float *avg; double demo_time; @@ -61,8 +62,7 @@ void *detect_in_thread(void *ptr) memcpy(predictions[demo_index], prediction, l.outputs*sizeof(float)); mean_arrays(predictions, demo_frame, l.outputs, avg); - l.output = last_avg2; - if(demo_delay == 0) l.output = avg; + l.output = avg; if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else if (l.type == REGION){ @@ -97,12 +97,7 @@ void *display_in_thread(void *ptr) show_image_cv(buff[(buff_index + 1)%3], "Demo", ipl); int c = cvWaitKey(1); if (c != -1) c = c%256; - if (c == 10){ - if(demo_delay == 0) demo_delay = 60; - else if(demo_delay == 5) demo_delay = 0; - else if(demo_delay == 60) demo_delay = 5; - else demo_delay = 0; - } else if (c == 27) { + if (c == 27) { demo_done = 1; return 0; } else if (c == 82) { @@ -135,7 +130,6 @@ void *detect_loop(void *ptr) void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen) { - demo_delay = delay; demo_frame = avg_frames; predictions = calloc(demo_frame, sizeof(float*)); image **alphabet = load_alphabet(); @@ -179,8 +173,6 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch int j; avg = (float *) calloc(l.outputs, sizeof(float)); - last_avg = (float *) calloc(l.outputs, sizeof(float)); - last_avg2 = (float *) calloc(l.outputs, sizeof(float)); for(j = 0; j < demo_frame; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float)); boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box)); @@ -213,14 +205,96 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); if(!prefix){ - if(count % (demo_delay+1) == 0){ - fps = 1./(get_wall_time() - demo_time); - demo_time = get_wall_time(); - float *swap = last_avg; - last_avg = last_avg2; - last_avg2 = swap; - memcpy(last_avg, avg, l.outputs*sizeof(float)); - } + fps = 1./(get_wall_time() - demo_time); + demo_time = get_wall_time(); + display_in_thread(0); + }else{ + char name[256]; + sprintf(name, "%s_%08d", prefix, count); + save_image(buff[(buff_index + 1)%3], name); + } + pthread_join(fetch_thread, 0); + pthread_join(detect_thread, 0); + ++count; + } +} + +void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen) +{ + demo_frame = avg_frames; + predictions = calloc(demo_frame, sizeof(float*)); + image **alphabet = load_alphabet(); + demo_names = names; + demo_alphabet = alphabet; + demo_classes = classes; + demo_thresh = thresh; + demo_hier = hier; + printf("Demo\n"); + net = load_network(cfg1, weight1, 0); + set_batch_network(&net, 1); + pthread_t detect_thread; + pthread_t fetch_thread; + + srand(2222222); + + if(filename){ + printf("video file: %s\n", filename); + cap = cvCaptureFromFile(filename); + }else{ + cap = cvCaptureFromCAM(cam_index); + + if(w){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); + } + if(h){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); + } + if(frames){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, frames); + } + } + + if(!cap) error("Couldn't connect to webcam.\n"); + + layer l = net.layers[net.n-1]; + demo_detections = l.n*l.w*l.h; + int j; + + avg = (float *) calloc(l.outputs, sizeof(float)); + for(j = 0; j < demo_frame; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float)); + + boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box)); + probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes+1, sizeof(float)); + + buff[0] = get_image_from_stream(cap); + buff[1] = copy_image(buff[0]); + buff[2] = copy_image(buff[0]); + buff_letter[0] = letterbox_image(buff[0], net.w, net.h); + buff_letter[1] = letterbox_image(buff[0], net.w, net.h); + buff_letter[2] = letterbox_image(buff[0], net.w, net.h); + ipl = cvCreateImage(cvSize(buff[0].w,buff[0].h), IPL_DEPTH_8U, buff[0].c); + + int count = 0; + if(!prefix){ + cvNamedWindow("Demo", CV_WINDOW_NORMAL); + if(fullscreen){ + cvSetWindowProperty("Demo", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); + } else { + cvMoveWindow("Demo", 0, 0); + cvResizeWindow("Demo", 1352, 1013); + } + } + + demo_time = get_wall_time(); + + while(!demo_done){ + buff_index = (buff_index + 1) %3; + if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); + if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); + if(!prefix){ + fps = 1./(get_wall_time() - demo_time); + demo_time = get_wall_time(); display_in_thread(0); }else{ char name[256]; From 2f212a47425b2e1002c7c8a20e139fe0da7489b5 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 27 Jul 2017 01:28:57 -0700 Subject: [PATCH 043/118] idk man :snake: stuff --- Makefile | 5 +-- examples/darknet.c | 2 +- examples/rnn.c | 22 ++----------- include/darknet.h | 4 +++ python/darknet.py | 82 +++++++++++++++++++++++++++------------------- src/network.c | 30 +++++++++++++++++ src/region_layer.c | 6 ++-- 7 files changed, 93 insertions(+), 58 deletions(-) diff --git a/Makefile b/Makefile index 1a64a0afa41..b0a9f1ced64 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ COMMON= -Iinclude/ -Isrc/ CFLAGS=-Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC ifeq ($(OPENMP), 1) -COMMON+= -fopenmp +CFLAGS+= -fopenmp endif ifeq ($(DEBUG), 1) @@ -68,7 +68,8 @@ EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA)) OBJS = $(addprefix $(OBJDIR), $(OBJ)) DEPS = $(wildcard src/*.h) Makefile include/darknet.h -all: obj backup results $(SLIB) $(ALIB) $(EXEC) +#all: obj backup results $(SLIB) $(ALIB) $(EXEC) +all: obj results $(SLIB) $(ALIB) $(EXEC) $(EXEC): $(EXECOBJ) $(ALIB) diff --git a/examples/darknet.c b/examples/darknet.c index a7ce1482601..8e44df12e60 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -146,7 +146,7 @@ void oneoff(char *cfgfile, char *weightfile, char *outfile) int c = net.layers[net.n - 2].c; scal_cpu(oldn*c, .1, net.layers[net.n - 2].weights, 1); scal_cpu(oldn, 0, net.layers[net.n - 2].biases, 1); - net.layers[net.n - 2].n = 9418; + net.layers[net.n - 2].n = 11921; net.layers[net.n - 2].biases += 5; net.layers[net.n - 2].weights += 5*c; if(weightfile){ diff --git a/examples/rnn.c b/examples/rnn.c index faef6a7c3da..45e8deba2b6 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -108,22 +108,6 @@ float_pair get_rnn_data(unsigned char *text, size_t *offsets, int characters, si return p; } -void reset_rnn_state(network net, int b) -{ - int i; - for (i = 0; i < net.n; ++i) { - #ifdef GPU - layer l = net.layers[i]; - if(l.state_gpu){ - fill_gpu(l.outputs, 0, l.state_gpu + l.outputs*b, 1); - } - if(l.h_gpu){ - fill_gpu(l.outputs, 0, l.h_gpu + l.outputs*b, 1); - } - #endif - } -} - void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, int tokenized) { srand(time(0)); @@ -194,7 +178,7 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, if(rand()%64 == 0){ //fprintf(stderr, "Reset\n"); offsets[j] = rand_size_t()%size; - reset_rnn_state(net, j); + reset_network_state(net, j); } } @@ -304,7 +288,7 @@ void test_tactic_rnn_multi(char *cfgfile, char *weightfile, int num, float temp, float *out = 0; while(1){ - reset_rnn_state(net, 0); + reset_network_state(net, 0); while((c = getc(stdin)) != EOF && c != 0){ input[c] = 1; out = network_predict(net, input); @@ -482,7 +466,7 @@ void vec_char_rnn(char *cfgfile, char *weightfile, char *seed) int i; char *line; while((line=fgetl(stdin)) != 0){ - reset_rnn_state(net, 0); + reset_network_state(net, 0); for(i = 0; i < seed_len; ++i){ c = seed[i]; input[(int)c] = 1; diff --git a/include/darknet.h b/include/darknet.h index 92425e214eb..4f6bd6d6620 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -647,6 +647,7 @@ void zero_objectness(layer l); void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, float **masks, int only_objectness, int *map, float tree_thresh, int relative); void free_network(network net); void set_batch_network(network *net, int b); +void set_temp_network(network net, float t); image load_image(char *filename, int w, int h, int c); image load_image_color(char *filename, int w, int h); image make_image(int w, int h, int c); @@ -699,6 +700,9 @@ int network_width(network *net); int network_height(network *net); float *network_predict_image(network *net, image im); +void reset_network_state(network net, int b); +void reset_network_state(network net, int b); + char **get_labels(char *filename); void do_nms_sort(box *boxes, float **probs, int total, int classes, float thresh); void do_nms_obj(box *boxes, float **probs, int total, int classes, float thresh); diff --git a/python/darknet.py b/python/darknet.py index e23e5383410..7dff2f061b6 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -1,4 +1,19 @@ from ctypes import * +import math +import random + +def sample(probs): + s = sum(probs) + probs = [a/s for a in probs] + r = random.uniform(0, 1) + for i in range(len(probs)): + r = r - probs[i] + if r <= 0: + return i + return len(probs)-1 + +def c_array(ctype, values): + return (ctype * len(values))(*values) class IMAGE(Structure): _fields_ = [("w", c_int), @@ -10,43 +25,42 @@ class METADATA(Structure): _fields_ = [("classes", c_int), ("names", POINTER(c_char_p))] -lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL) +#lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL) +lib = CDLL("libdarknet.so", RTLD_GLOBAL) lib.network_width.argtypes = [c_void_p] lib.network_width.restype = c_int lib.network_height.argtypes = [c_void_p] lib.network_height.restype = c_int -def load_meta(f): - lib.get_metadata.argtypes = [c_char_p] - lib.get_metadata.restype = METADATA - return lib.get_metadata(f) - -def load_net(cfg, weights): - load_network = lib.load_network_p - load_network.argtypes = [c_char_p, c_char_p, c_int] - load_network.restype = c_void_p - return load_network(cfg, weights, 0) - -def load_img(f): - load_image = lib.load_image_color - load_image.argtypes = [c_char_p, c_int, c_int] - load_image.restype = IMAGE - return load_image(f, 0, 0) - -def letterbox_img(im, w, h): - letterbox_image = lib.letterbox_image - letterbox_image.argtypes = [IMAGE, c_int, c_int] - letterbox_image.restype = IMAGE - return letterbox_image(im, w, h) - -def predict(net, im): - pred = lib.network_predict_image - pred.argtypes = [c_void_p, IMAGE] - pred.restype = POINTER(c_float) - return pred(net, im) +predict = lib.network_predict_p +predict.argtypes = [c_void_p, POINTER(c_float)] +predict.restype = POINTER(c_float) + +reset_rnn = lib.reset_rnn +reset_rnn.argtypes = [c_void_p] + +load_net = lib.load_network_p +load_net.argtypes = [c_char_p, c_char_p, c_int] +load_net.restype = c_void_p + +letterbox_image = lib.letterbox_image +letterbox_image.argtypes = [IMAGE, c_int, c_int] +letterbox_image.restype = IMAGE + +load_meta = lib.get_metadata +lib.get_metadata.argtypes = [c_char_p] +lib.get_metadata.restype = METADATA + +load_image = lib.load_image_color +load_image.argtypes = [c_char_p, c_int, c_int] +load_image.restype = IMAGE + +predict_image = lib.network_predict_image +predict_image.argtypes = [c_void_p, IMAGE] +predict_image.restype = POINTER(c_float) def classify(net, meta, im): - out = predict(net, im) + out = predict_image(net, im) res = [] for i in range(meta.classes): res.append((meta.names[i], out[i])) @@ -54,17 +68,19 @@ def classify(net, meta, im): return res def detect(net, meta, im): - out = predict(net, im) + out = predict_image(net, im) res = [] for i in range(meta.classes): res.append((meta.names[i], out[i])) res = sorted(res, key=lambda x: -x[1]) return res + if __name__ == "__main__": - net = load_net("cfg/densenet.cfg", "/home/pjreddie/trained/densenet201.weights") - im = load_img("data/wolf.jpg") + net = load_net("cfg/densenet201.cfg", "/home/pjreddie/trained/densenet201.weights", 0) + im = load_image("data/wolf.jpg", 0, 0) meta = load_meta("cfg/imagenet1k.data") r = classify(net, meta, im) print r[:10] + diff --git a/src/network.c b/src/network.c index c72df25ec14..38d5229e2c2 100644 --- a/src/network.c +++ b/src/network.c @@ -82,6 +82,27 @@ void reset_momentum(network net) #endif } +void reset_network_state(network net, int b) +{ + int i; + for (i = 0; i < net.n; ++i) { + #ifdef GPU + layer l = net.layers[i]; + if(l.state_gpu){ + fill_gpu(l.outputs, 0, l.state_gpu + l.outputs*b, 1); + } + if(l.h_gpu){ + fill_gpu(l.outputs, 0, l.h_gpu + l.outputs*b, 1); + } + #endif + } +} + +void reset_rnn(network *net) +{ + reset_network_state(*net, 0); +} + float get_current_rate(network net) { size_t batch_num = get_current_batch(net); @@ -302,6 +323,15 @@ float train_network(network net, data d) return (float)sum/(n*batch); } +void set_temp_network(network net, float t) +{ + int i; + for(i = 0; i < net.n; ++i){ + net.layers[i].temperature = t; + } +} + + void set_batch_network(network *net, int b) { net->batch = b; diff --git a/src/region_layer.c b/src/region_layer.c index b0a8facf550..ba4cc336676 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -203,7 +203,7 @@ void forward_region_layer(const layer l, network net) int class_index = entry_index(l, b, n, l.coords + 1); int obj_index = entry_index(l, b, n, l.coords); float scale = l.output[obj_index]; - //l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); + l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); float p = scale*get_hierarchy_probability(l.output + class_index, l.softmax_tree, class, l.w*l.h); if(p > maxp){ maxp = p; @@ -213,8 +213,8 @@ void forward_region_layer(const layer l, network net) int class_index = entry_index(l, b, maxi, l.coords + 1); int obj_index = entry_index(l, b, maxi, l.coords); delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); - //if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); - //else l.delta[obj_index] = 0; + if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); + else l.delta[obj_index] = 0; l.delta[obj_index] = 0; ++class_count; onlyclass = 1; From 624a59307568212b7aecd9ae617bbcf4d94b8cec Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 27 Jul 2017 01:29:30 -0700 Subject: [PATCH 044/118] forgot a :snake: --- python/proverbot.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 python/proverbot.py diff --git a/python/proverbot.py b/python/proverbot.py new file mode 100644 index 00000000000..095aae8f8bf --- /dev/null +++ b/python/proverbot.py @@ -0,0 +1,37 @@ +from darknet import * + +def predict_tactic(net, s): + prob = 0 + d = c_array(c_float, [0.0]*256) + tac = '' + if not len(s): + s = '\n' + for c in s[:-1]: + d[ord(c)] = 1 + pred = predict(net, d) + d[ord(c)] = 0 + c = s[-1] + while 1: + d[ord(c)] = 1 + pred = predict(net, d) + d[ord(c)] = 0 + pred = [pred[i] for i in range(256)] + ind = sample(pred) + c = chr(ind) + prob += math.log(pred[ind]) + if len(tac) and tac[-1] == '.': + break + tac = tac + c + return (tac, prob) + +def predict_tactics(net, s, n): + tacs = [] + for i in range(n): + reset_rnn(net) + tacs.append(predict_tactic(net, s)) + tacs = sorted(tacs, key=lambda x: -x[1]) + return tacs + +net = load_net("cfg/coq.test.cfg", "/home/pjreddie/backup/coq.backup", 0) +t = predict_tactics(net, "+++++\n", 10) +print t From b34082019d6d262dd9bce4c4ee4b0bd038a1560a Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 3 Aug 2017 04:14:36 -0700 Subject: [PATCH 045/118] PYTHON DETECTION NOW I'M OUT DON'T WAIT UP FOR ME :camel: :horse: :dog: :desert: --- cfg/tiny-yolo.cfg | 21 +++++++++------- include/darknet.h | 3 +++ python/darknet.py | 61 +++++++++++++++++++++++++++++++++++++++-------- src/network.c | 32 +++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 18 deletions(-) diff --git a/cfg/tiny-yolo.cfg b/cfg/tiny-yolo.cfg index 5580098b45f..9a4a184f13b 100644 --- a/cfg/tiny-yolo.cfg +++ b/cfg/tiny-yolo.cfg @@ -1,6 +1,10 @@ [net] -batch=64 -subdivisions=8 +# Training +# batch=64 +# subdivisions=2 +# Testing +batch=1 +subdivisions=1 width=416 height=416 channels=3 @@ -12,10 +16,11 @@ exposure = 1.5 hue=.1 learning_rate=0.001 -max_batches = 120000 +burn_in=1000 +max_batches = 500200 policy=steps -steps=-1,100,80000,100000 -scales=.1,10,.1,.1 +steps=400000,450000 +scales=.1,.1 [convolutional] batch_normalize=1 @@ -104,7 +109,7 @@ batch_normalize=1 size=3 stride=1 pad=1 -filters=1024 +filters=512 activation=leaky [convolutional] @@ -115,14 +120,14 @@ filters=425 activation=linear [region] -anchors = 0.738768,0.874946, 2.42204,2.65704, 4.30971,7.04493, 10.246,4.59428, 12.6868,11.8741 +anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 bias_match=1 classes=80 coords=4 num=5 softmax=1 jitter=.2 -rescore=1 +rescore=0 object_scale=5 noobject_scale=1 diff --git a/include/darknet.h b/include/darknet.h index 4f6bd6d6620..cdf3cc66239 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -699,6 +699,9 @@ float *network_predict_p(network *net, float *input); int network_width(network *net); int network_height(network *net); float *network_predict_image(network *net, image im); +void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, box *boxes, float **probs); +int num_boxes(network *net); +box *make_boxes(network *net); void reset_network_state(network net, int b); void reset_network_state(network net, int b); diff --git a/python/darknet.py b/python/darknet.py index 7dff2f061b6..b2750aeaf80 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -15,6 +15,12 @@ def sample(probs): def c_array(ctype, values): return (ctype * len(values))(*values) +class BOX(Structure): + _fields_ = [("x", c_float), + ("y", c_float), + ("w", c_float), + ("h", c_float)] + class IMAGE(Structure): _fields_ = [("w", c_int), ("h", c_int), @@ -36,6 +42,24 @@ class METADATA(Structure): predict.argtypes = [c_void_p, POINTER(c_float)] predict.restype = POINTER(c_float) +make_boxes = lib.make_boxes +make_boxes.argtypes = [c_void_p] +make_boxes.restype = POINTER(BOX) + +free_ptrs = lib.free_ptrs +free_ptrs.argtypes = [POINTER(c_void_p), c_int] + +num_boxes = lib.num_boxes +num_boxes.argtypes = [c_void_p] +num_boxes.restype = c_int + +make_probs = lib.make_probs +make_probs.argtypes = [c_void_p] +make_probs.restype = POINTER(POINTER(c_float)) + +detect = lib.network_predict_p +detect.argtypes = [c_void_p, IMAGE, c_float, c_float, c_float, POINTER(BOX), POINTER(POINTER(c_float))] + reset_rnn = lib.reset_rnn reset_rnn.argtypes = [c_void_p] @@ -43,6 +67,9 @@ class METADATA(Structure): load_net.argtypes = [c_char_p, c_char_p, c_int] load_net.restype = c_void_p +free_image = lib.free_image +free_image.argtypes = [IMAGE] + letterbox_image = lib.letterbox_image letterbox_image.argtypes = [IMAGE, c_int, c_int] letterbox_image.restype = IMAGE @@ -59,6 +86,9 @@ class METADATA(Structure): predict_image.argtypes = [c_void_p, IMAGE] predict_image.restype = POINTER(c_float) +network_detect = lib.network_detect +network_detect.argtypes = [c_void_p, IMAGE, c_float, c_float, c_float, POINTER(BOX), POINTER(POINTER(c_float))] + def classify(net, meta, im): out = predict_image(net, im) res = [] @@ -67,20 +97,31 @@ def classify(net, meta, im): res = sorted(res, key=lambda x: -x[1]) return res -def detect(net, meta, im): - out = predict_image(net, im) +def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45): + im = load_image(image, 0, 0) + boxes = make_boxes(net) + probs = make_probs(net) + num = num_boxes(net) + network_detect(net, im, thresh, hier_thresh, nms, boxes, probs) res = [] - for i in range(meta.classes): - res.append((meta.names[i], out[i])) + for j in range(num): + for i in range(meta.classes): + if probs[j][i] > 0: + res.append((meta.names[i], probs[j][i], (boxes[j].x, boxes[j].y, boxes[j].w, boxes[j].h))) res = sorted(res, key=lambda x: -x[1]) + free_image(im) + free_ptrs(cast(probs, POINTER(c_void_p)), num) return res - if __name__ == "__main__": - net = load_net("cfg/densenet201.cfg", "/home/pjreddie/trained/densenet201.weights", 0) - im = load_image("data/wolf.jpg", 0, 0) - meta = load_meta("cfg/imagenet1k.data") - r = classify(net, meta, im) - print r[:10] + #net = load_net("cfg/densenet201.cfg", "/home/pjreddie/trained/densenet201.weights", 0) + #im = load_image("data/wolf.jpg", 0, 0) + #meta = load_meta("cfg/imagenet1k.data") + #r = classify(net, meta, im) + #print r[:10] + net = load_net("cfg/tiny-yolo.cfg", "tiny-yolo.backup", 0) + meta = load_meta("cfg/coco.data") + r = detect(net, meta, "data/dog.jpg") + print r diff --git a/src/network.c b/src/network.c index 38d5229e2c2..89e18238852 100644 --- a/src/network.c +++ b/src/network.c @@ -494,6 +494,38 @@ float *network_predict(network net, float *input) return net.output; } +int num_boxes(network *net) +{ + layer l = net->layers[net->n-1]; + return l.w*l.h*l.n; +} + +box *make_boxes(network *net) +{ + layer l = net->layers[net->n-1]; + box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); + return boxes; +} + +float **make_probs(network *net) +{ + int j; + layer l = net->layers[net->n-1]; + float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(l.classes + 1, sizeof(float *)); + return probs; +} + +void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, box *boxes, float **probs) +{ + network_predict_image(net, im); + layer l = net->layers[net->n-1]; + if(l.type == REGION){ + get_region_boxes(l, im.w, im.h, net->w, net->h, thresh, probs, boxes, 0, 0, 0, hier_thresh, 0); + if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); + } +} + float *network_predict_p(network *net, float *input) { return network_predict(*net, input); From 8327154a673d14dfc237d2b55e9aa50a092f243f Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 3 Aug 2017 04:26:48 -0700 Subject: [PATCH 046/118] OK ADDED ONE MORE EXAMPLE BUT NOW I'M REALLY GONE FOR SERIOUS BACK IN A WHILE --- examples/detector.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 examples/detector.py diff --git a/examples/detector.py b/examples/detector.py new file mode 100644 index 00000000000..10697bab020 --- /dev/null +++ b/examples/detector.py @@ -0,0 +1,25 @@ +# Stupid python path shit. +# Instead just add darknet.py to somewhere in your python path +# OK actually that might not be a great idea, idk, work in progress +# Use at your own risk. or don't, i don't care + +import sys, os +sys.path.append(os.path.join(os.getcwd(),'python/')) + +import darknet as dn + +net = dn.load_net("cfg/tiny-yolo.cfg", "tiny-yolo.backup", 0) +meta = dn.load_meta("cfg/coco.data") +r = dn.detect(net, meta, "data/dog.jpg") +print r + +# And then down here you could detect a lot more images like: +r = dn.detect(net, meta, "data/eagle.jpg") +print r +r = dn.detect(net, meta, "data/giraffe.jpg") +print r +r = dn.detect(net, meta, "data/horses.jpg") +print r +r = dn.detect(net, meta, "data/person.jpg") +print r + From 1e729804f61c8627eb257fba8b83f74e04945db7 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 3 Aug 2017 04:31:04 -0700 Subject: [PATCH 047/118] OK GOD DAMN IT I THINK IT'S RIGHT NOW WHATEVER --- examples/detector.py | 2 +- python/darknet.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/detector.py b/examples/detector.py index 10697bab020..aa565d61169 100644 --- a/examples/detector.py +++ b/examples/detector.py @@ -8,7 +8,7 @@ import darknet as dn -net = dn.load_net("cfg/tiny-yolo.cfg", "tiny-yolo.backup", 0) +net = dn.load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0) meta = dn.load_meta("cfg/coco.data") r = dn.detect(net, meta, "data/dog.jpg") print r diff --git a/python/darknet.py b/python/darknet.py index b2750aeaf80..aadc6347dc6 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -119,7 +119,7 @@ def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45): #meta = load_meta("cfg/imagenet1k.data") #r = classify(net, meta, im) #print r[:10] - net = load_net("cfg/tiny-yolo.cfg", "tiny-yolo.backup", 0) + net = load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0) meta = load_meta("cfg/coco.data") r = detect(net, meta, "data/dog.jpg") print r From a4ae313b1c03915ac0c380fddc4b34f4f3707b52 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 19 Sep 2017 15:02:39 -0700 Subject: [PATCH 048/118] FIX OPENCV :snake: --- examples/darknet.c | 4 ++-- include/darknet.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/darknet.c b/examples/darknet.c index 8e44df12e60..e63afef8461 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -89,12 +89,12 @@ void speed(char *cfgfile, int tics) network net = parse_network_cfg(cfgfile); set_batch_network(&net, 1); int i; - time_t start = time(0); + double time=what_time_is_it_now(); image im = make_image(net.w, net.h, net.c*net.batch); for(i = 0; i < tics; ++i){ network_predict(net, im.data); } - double t = difftime(time(0), start); + double t = what_time_is_it_now() - time; printf("\n%d evals, %f Seconds\n", tics, t); printf("Speed: %f sec/eval\n", t/tics); printf("Speed: %f Hz\n", tics/t); diff --git a/include/darknet.h b/include/darknet.h index cdf3cc66239..336ed6f685e 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -27,6 +27,7 @@ extern int gpu_index; #include "opencv2/core/version.hpp" #if CV_MAJOR_VERSION == 3 #include "opencv2/videoio/videoio_c.h" + #include "opencv2/imgcodecs/imgcodecs_c.h" #endif #endif #endif From 1b001a7f58aacc7f8b751332d3a9d6d6d0200a2d Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 20 Sep 2017 19:17:27 -0700 Subject: [PATCH 049/118] :bug: :bug: :bug: --- src/tree.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tree.c b/src/tree.c index f36ca3a1da0..67b6d431f6f 100644 --- a/src/tree.c +++ b/src/tree.c @@ -71,6 +71,8 @@ int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int s p = p*max; group = hier->child[max_i]; if(hier->child[max_i] < 0) return max_i; + } else if (group == 0){ + return max_i; } else { return hier->parent[hier->group_offset[group]]; } From 62b781af4d01fc5f074407590cf556b36c70e837 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 2 Oct 2017 15:17:48 -0700 Subject: [PATCH 050/118] resnet that works --- Makefile | 4 +- cfg/msr_34.cfg | 366 ------------------- cfg/msr_50.cfg | 558 ----------------------------- cfg/{msr_152.cfg => resnet152.cfg} | 299 +++++----------- examples/classifier.c | 3 +- examples/darknet.c | 49 +-- examples/detector.c | 20 +- examples/rnn.c | 30 ++ examples/segmenter.c | 2 +- src/activation_kernels.cu | 42 +-- src/blas_kernels.cu | 26 +- src/convolutional_kernels.cu | 8 +- src/crop_layer_kernels.cu | 26 +- src/data.c | 9 +- src/demo.c | 4 - src/image.c | 90 ++--- src/image.h | 6 - src/utils.h | 9 +- 18 files changed, 267 insertions(+), 1284 deletions(-) delete mode 100644 cfg/msr_34.cfg delete mode 100644 cfg/msr_50.cfg rename cfg/{msr_152.cfg => resnet152.cfg} (92%) diff --git a/Makefile b/Makefile index b0a9f1ced64..b61f1c60b57 100644 --- a/Makefile +++ b/Makefile @@ -4,11 +4,11 @@ OPENCV=0 OPENMP=0 DEBUG=0 -ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \ - -gencode arch=compute_30,code=sm_30 \ +ARCH= -gencode arch=compute_30,code=sm_30 \ -gencode arch=compute_35,code=sm_35 \ -gencode arch=compute_50,code=[sm_50,compute_50] \ -gencode arch=compute_52,code=[sm_52,compute_52] +# -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated? # This is what I use, uncomment if you know your arch and want to specify # ARCH= -gencode arch=compute_52,code=compute_52 diff --git a/cfg/msr_34.cfg b/cfg/msr_34.cfg deleted file mode 100644 index 5ae23cf587b..00000000000 --- a/cfg/msr_34.cfg +++ /dev/null @@ -1,366 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=256 -width=256 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.1 -policy=poly -power=4 -max_batches=500000 - -[crop] -crop_height=224 -crop_width=224 -flip=1 -saturation=1 -exposure=1 -angle=0 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=3 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - - - - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - - - - - - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - - - - - - - - - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from = -3 - -[avgpool] - -[connected] -output=1000 -activation=leaky - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/cfg/msr_50.cfg b/cfg/msr_50.cfg deleted file mode 100644 index 2edd21c1a66..00000000000 --- a/cfg/msr_50.cfg +++ /dev/null @@ -1,558 +0,0 @@ -[net] -batch=128 -subdivisions=8 -height=256 -width=256 -channels=3 -momentum=0.9 -decay=0.0001 - -learning_rate=0.05 -policy=poly -power=4 -max_batches=500000 - - - -[crop] -crop_height=224 -crop_width=224 -flip=1 -saturation=1 -exposure=1 -angle=0 - -##### Conv 1 ##### - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=3 -stride=2 - - -##### Conv 2_x ##### - - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[route] -layers=-4 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -activation=linear -filters=256 - -[shortcut] -from = -3 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - - -##### Conv 3_x ##### - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[route] -layers=-4 - -[convolutional] -batch_normalize=1 -size=1 -stride=2 -pad=1 -activation=linear -filters=512 - -[shortcut] -from = -3 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - - -##### Conv 4_x ##### - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[route] -layers=-4 - -[convolutional] -batch_normalize=1 -size=1 -stride=2 -pad=1 -activation=linear -filters=1024 - -[shortcut] -from = -3 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - - -##### Conv 5_x ##### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - - -[route] -layers=-4 - -[convolutional] -batch_normalize=1 -size=1 -stride=2 -pad=1 -activation=linear -filters=2048 - -[shortcut] -from = -3 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from = -4 -activation=leaky - -[avgpool] - -[connected] -output=1000 -activation=leaky - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/cfg/msr_152.cfg b/cfg/resnet152.cfg similarity index 92% rename from cfg/msr_152.cfg rename to cfg/resnet152.cfg index b19c999dd1f..d5fe90948a2 100644 --- a/cfg/msr_152.cfg +++ b/cfg/resnet152.cfg @@ -1,26 +1,30 @@ [net] -batch=128 -subdivisions=8 +# Training +# batch=128 +# subdivisions=8 + +# Testing +batch=1 +subdivisions=1 + height=256 width=256 +max_crop=448 channels=3 momentum=0.9 -decay=0.0001 +decay=0.0005 +burn_in=1000 learning_rate=0.1 policy=poly power=4 -max_batches=500000 - -[crop] -crop_height=224 -crop_width=224 -flip=1 -saturation=1 -exposure=1 -angle=0 +max_batches=1600000 -##### Conv 1 ##### +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 [convolutional] batch_normalize=1 @@ -31,13 +35,9 @@ pad=1 activation=leaky [maxpool] -size=3 +size=2 stride=2 - -##### Conv 2_x ##### - - [convolutional] batch_normalize=1 filters=64 @@ -62,19 +62,8 @@ stride=1 pad=1 activation=linear -[route] -layers=-4 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -activation=linear -filters=256 - [shortcut] -from = -3 +from=-4 activation=leaky [convolutional] @@ -102,8 +91,7 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky [convolutional] @@ -131,13 +119,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - -##### Conv 3_x ##### - [convolutional] batch_normalize=1 filters=128 @@ -162,23 +146,10 @@ stride=1 pad=1 activation=linear - -[route] -layers=-4 - -[convolutional] -batch_normalize=1 -size=1 -stride=2 -pad=1 -activation=linear -filters=512 - [shortcut] -from = -3 +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=128 @@ -204,11 +175,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=128 @@ -234,11 +203,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=128 @@ -264,11 +231,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=128 @@ -294,11 +259,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=128 @@ -324,11 +287,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=128 @@ -354,11 +315,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=128 @@ -384,14 +343,11 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - -##### Conv 4_x ##### - +# Conv 4 [convolutional] batch_normalize=1 filters=256 @@ -416,23 +372,10 @@ stride=1 pad=1 activation=linear - -[route] -layers=-4 - -[convolutional] -batch_normalize=1 -size=1 -stride=2 -pad=1 -activation=linear -filters=1024 - [shortcut] -from = -3 +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -458,11 +401,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -488,11 +429,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -518,11 +457,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -548,11 +485,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -578,11 +513,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -608,11 +541,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -638,11 +569,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -668,11 +597,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -698,11 +625,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -728,11 +653,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -758,11 +681,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -788,11 +709,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -818,11 +737,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -848,11 +765,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -878,11 +793,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -908,11 +821,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -938,11 +849,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -968,11 +877,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -998,11 +905,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1028,11 +933,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1058,11 +961,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1088,11 +989,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1118,11 +1017,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1148,11 +1045,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1178,11 +1073,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1208,11 +1101,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1238,11 +1129,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1268,11 +1157,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1298,11 +1185,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1328,11 +1213,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1358,11 +1241,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1388,11 +1269,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1418,11 +1297,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1448,11 +1325,9 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=256 @@ -1478,13 +1353,10 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky - -##### Conv 5_x ##### - +#Conv 5 [convolutional] batch_normalize=1 filters=512 @@ -1509,23 +1381,10 @@ stride=1 pad=1 activation=linear - -[route] -layers=-4 - -[convolutional] -batch_normalize=1 -size=1 -stride=2 -pad=1 -activation=linear -filters=2048 - [shortcut] -from = -3 +from=-4 activation=leaky - [convolutional] batch_normalize=1 filters=512 @@ -1551,8 +1410,7 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky [convolutional] @@ -1580,15 +1438,22 @@ pad=1 activation=linear [shortcut] -from = -4 - +from=-4 activation=leaky -[avgpool] -[connected] -output=1000 -activation=leaky + + + + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[avgpool] [softmax] groups=1 diff --git a/examples/classifier.c b/examples/classifier.c index 593b34e5e5f..20202c8c21d 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -58,7 +58,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, load_args args = {0}; args.w = net.w; args.h = net.h; - args.threads = 64; + args.threads = 32; args.hierarchy = net.hierarchy; args.min = net.min_crop; @@ -123,6 +123,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, char buff[256]; sprintf(buff, "%s/%s.weights", backup_directory, base); save_weights(net, buff); + pthread_join(load_thread, 0); free_network(net); free_ptrs((void**)labels, classes); diff --git a/examples/darknet.c b/examples/darknet.c index e63afef8461..9ead608ccb4 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -83,27 +83,8 @@ void average(int argc, char *argv[]) save_weights(sum, outfile); } -void speed(char *cfgfile, int tics) -{ - if (tics == 0) tics = 1000; - network net = parse_network_cfg(cfgfile); - set_batch_network(&net, 1); - int i; - double time=what_time_is_it_now(); - image im = make_image(net.w, net.h, net.c*net.batch); - for(i = 0; i < tics; ++i){ - network_predict(net, im.data); - } - double t = what_time_is_it_now() - time; - printf("\n%d evals, %f Seconds\n", tics, t); - printf("Speed: %f sec/eval\n", t/tics); - printf("Speed: %f Hz\n", tics/t); -} - -void operations(char *cfgfile) +long numops(network net) { - gpu_index = -1; - network net = parse_network_cfg(cfgfile); int i; long ops = 0; for(i = 0; i < net.n; ++i){ @@ -134,6 +115,34 @@ void operations(char *cfgfile) ops += 2l * l.wo->inputs * l.wo->outputs; } } + return ops; +} + +void speed(char *cfgfile, int tics) +{ + if (tics == 0) tics = 1000; + network net = parse_network_cfg(cfgfile); + set_batch_network(&net, 1); + int i; + double time=what_time_is_it_now(); + image im = make_image(net.w, net.h, net.c*net.batch); + for(i = 0; i < tics; ++i){ + network_predict(net, im.data); + } + double t = what_time_is_it_now() - time; + long ops = numops(net); + printf("\n%d evals, %f Seconds\n", tics, t); + printf("Floating Point Operations: %.2f Bn\n", (float)ops/1000000000.); + printf("FLOPS: %.2f Bn\n", (float)ops/1000000000.*tics/t); + printf("Speed: %f sec/eval\n", t/tics); + printf("Speed: %f Hz\n", tics/t); +} + +void operations(char *cfgfile) +{ + gpu_index = -1; + network net = parse_network_cfg(cfgfile); + long ops = numops(net); printf("Floating Point Operations: %ld\n", ops); printf("Floating Point Operations: %.2f Bn\n", (float)ops/1000000000.); } diff --git a/examples/detector.c b/examples/detector.c index 0537588c47a..4709b898da9 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -52,10 +52,10 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i args.d = &buffer; args.type = DETECTION_DATA; //args.type = INSTANCE_DATA; - args.threads = 8; + args.threads = 64; pthread_t load_thread = load_data(args); - clock_t time; + double time; int count = 0; //while(i*imgs < N*120){ while(get_current_batch(net) < net.max_batches){ @@ -78,7 +78,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i } net = nets[0]; } - time=clock(); + time=what_time_is_it_now(); pthread_join(load_thread, 0); train = buffer; load_thread = load_data(args); @@ -107,9 +107,9 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i } */ - printf("Loaded: %lf seconds\n", sec(clock()-time)); + printf("Loaded: %lf seconds\n", what_time_is_it_now()-time); - time=clock(); + time=what_time_is_it_now(); float loss = 0; #ifdef GPU if(ngpus == 1){ @@ -124,7 +124,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i avg_loss = avg_loss*.9 + loss*.1; i = get_current_batch(net); - printf("%ld: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs); + printf("%ld: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, i*imgs); if(i%100==0){ #ifdef GPU if(ngpus != 1) sync_nets(nets, ngpus, 0); @@ -313,7 +313,7 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char args.resized = &buf_resized[t]; thr[t] = load_data_in_thread(args); } - time_t start = time(0); + double start = what_time_is_it_now(); for(i = nthreads; i < m+nthreads; i += nthreads){ fprintf(stderr, "%d\n", i); for(t = 0; t < nthreads && i+t-nthreads < m; ++t){ @@ -359,7 +359,7 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char fprintf(fp, "\n]\n"); fclose(fp); } - fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start)); + fprintf(stderr, "Total Detection Time: %f Seconds\n", what_time_is_it_now() - start); } @@ -447,7 +447,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out args.resized = &buf_resized[t]; thr[t] = load_data_in_thread(args); } - time_t start = time(0); + double start = what_time_is_it_now(); for(i = nthreads; i < m+nthreads; i += nthreads){ fprintf(stderr, "%d\n", i); for(t = 0; t < nthreads && i+t-nthreads < m; ++t){ @@ -490,7 +490,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out fprintf(fp, "\n]\n"); fclose(fp); } - fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start)); + fprintf(stderr, "Total Detection Time: %f Seconds\n", what_time_is_it_now() - start); } void validate_detector_recall(char *cfgfile, char *weightfile) diff --git a/examples/rnn.c b/examples/rnn.c index 45e8deba2b6..8169f510937 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -52,6 +52,7 @@ char **read_tokens(char *filename, size_t *read) return d; } + float_pair get_rnn_token_data(int *tokens, size_t *offsets, int characters, size_t len, int batch, int steps) { float *x = calloc(batch * steps * characters, sizeof(float)); @@ -78,6 +79,35 @@ float_pair get_rnn_token_data(int *tokens, size_t *offsets, int characters, size return p; } +float_pair get_seq2seq_data(char **source, char **dest, int n, int characters, size_t len, int batch, int steps) +{ + int i,j; + float *x = calloc(batch * steps * characters, sizeof(float)); + float *y = calloc(batch * steps * characters, sizeof(float)); + for(i = 0; i < batch; ++i){ + int index = rand()%n; + for(j = 0; j < steps; ++j){ + unsigned char curr = source[index][j]; + unsigned char next = dest[index][j]; + + x[(j*batch + i)*characters + curr] = 1; + y[(j*batch + i)*characters + next] = 1; + + if(curr > 255 || curr <= 0 || next > 255 || next <= 0){ + /*text[(index+j+2)%len] = 0; + printf("%ld %d %d %d %d\n", index, j, len, (int)text[index+j], (int)text[index+j+1]); + printf("%s", text+index); + */ + error("Bad char"); + } + } + } + float_pair p; + p.x = x; + p.y = y; + return p; +} + float_pair get_rnn_data(unsigned char *text, size_t *offsets, int characters, size_t len, int batch, int steps) { float *x = calloc(batch * steps * characters, sizeof(float)); diff --git a/examples/segmenter.c b/examples/segmenter.c index 2c1979d4952..137ecd8e1aa 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -211,7 +211,7 @@ void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_inde image in = get_image_from_stream(cap); image in_s = letterbox_image(in, net.w, net.h); - float *predictions = network_predict(net, in_s.data); + network_predict(net, in_s.data); printf("\033[2J"); printf("\033[1;1H"); diff --git a/src/activation_kernels.cu b/src/activation_kernels.cu index 73530056246..80a849f73b2 100644 --- a/src/activation_kernels.cu +++ b/src/activation_kernels.cu @@ -10,8 +10,8 @@ extern "C" { __device__ float lhtan_activate_kernel(float x) { - if(x < 0) return .001*x; - if(x > 1) return .001*(x-1) + 1; + if(x < 0) return .001f*x; + if(x > 1) return .001f*(x-1.f) + 1.f; return x; } __device__ float lhtan_gradient_kernel(float x) @@ -27,25 +27,25 @@ __device__ float hardtan_activate_kernel(float x) return x; } __device__ float linear_activate_kernel(float x){return x;} -__device__ float logistic_activate_kernel(float x){return 1./(1. + exp(-x));} -__device__ float loggy_activate_kernel(float x){return 2./(1. + exp(-x)) - 1;} +__device__ float logistic_activate_kernel(float x){return 1.f/(1.f + expf(-x));} +__device__ float loggy_activate_kernel(float x){return 2.f/(1.f + expf(-x)) - 1;} __device__ float relu_activate_kernel(float x){return x*(x>0);} -__device__ float elu_activate_kernel(float x){return (x >= 0)*x + (x < 0)*(exp(x)-1);} -__device__ float relie_activate_kernel(float x){return (x>0) ? x : .01*x;} -__device__ float ramp_activate_kernel(float x){return x*(x>0)+.1*x;} -__device__ float leaky_activate_kernel(float x){return (x>0) ? x : .1*x;} -__device__ float tanh_activate_kernel(float x){return (2/(1 + exp(-2*x)) - 1);} +__device__ float elu_activate_kernel(float x){return (x >= 0)*x + (x < 0)*(expf(x)-1);} +__device__ float relie_activate_kernel(float x){return (x>0) ? x : .01f*x;} +__device__ float ramp_activate_kernel(float x){return x*(x>0)+.1f*x;} +__device__ float leaky_activate_kernel(float x){return (x>0) ? x : .1f*x;} +__device__ float tanh_activate_kernel(float x){return (2.f/(1 + expf(-2*x)) - 1);} __device__ float plse_activate_kernel(float x) { - if(x < -4) return .01 * (x + 4); - if(x > 4) return .01 * (x - 4) + 1; - return .125*x + .5; + if(x < -4) return .01f * (x + 4); + if(x > 4) return .01f * (x - 4) + 1; + return .125f*x + .5f; } __device__ float stair_activate_kernel(float x) { - int n = floor(x); - if (n%2 == 0) return floor(x/2.); - else return (x - n) + floor(x/2.); + int n = floorf(x); + if (n%2 == 0) return floorf(x/2); + else return (x - n) + floorf(x/2); } @@ -58,19 +58,19 @@ __device__ float linear_gradient_kernel(float x){return 1;} __device__ float logistic_gradient_kernel(float x){return (1-x)*x;} __device__ float loggy_gradient_kernel(float x) { - float y = (x+1.)/2.; + float y = (x+1)/2; return 2*(1-y)*y; } __device__ float relu_gradient_kernel(float x){return (x>0);} __device__ float elu_gradient_kernel(float x){return (x >= 0) + (x < 0)*(x + 1);} -__device__ float relie_gradient_kernel(float x){return (x>0) ? 1 : .01;} -__device__ float ramp_gradient_kernel(float x){return (x>0)+.1;} -__device__ float leaky_gradient_kernel(float x){return (x>0) ? 1 : .1;} +__device__ float relie_gradient_kernel(float x){return (x>0) ? 1 : .01f;} +__device__ float ramp_gradient_kernel(float x){return (x>0)+.1f;} +__device__ float leaky_gradient_kernel(float x){return (x>0) ? 1 : .1f;} __device__ float tanh_gradient_kernel(float x){return 1-x*x;} -__device__ float plse_gradient_kernel(float x){return (x < 0 || x > 1) ? .01 : .125;} +__device__ float plse_gradient_kernel(float x){return (x < 0 || x > 1) ? .01f : .125f;} __device__ float stair_gradient_kernel(float x) { - if (floor(x) == x) return 0; + if (floorf(x) == x) return 0; return 1; } diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index 867db038594..a483f2ebbc6 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -165,7 +165,7 @@ __global__ void adam_kernel(int N, float *x, float *m, float *v, float B1, float int index = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if (index >= N) return; - x[index] = x[index] + (rate * sqrt(1.-pow(B2, t)) / (1.-pow(B1, t)) * m[index] / (sqrt(v[index]) + eps)); + x[index] = x[index] + (rate * sqrtf(1.f-powf(B2, t)) / (1.f-powf(B1, t)) * m[index] / (sqrtf(v[index]) + eps)); } extern "C" void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rate, float eps, int t) @@ -194,7 +194,7 @@ __global__ void normalize_kernel(int N, float *x, float *mean, float *variance, if (index >= N) return; int f = (index/spatial)%filters; - x[index] = (x[index] - mean[f])/(sqrt(variance[f] + .00001f)); + x[index] = (x[index] - mean[f])/(sqrtf(variance[f] + .00001f)); } __global__ void normalize_delta_kernel(int N, float *x, float *mean, float *variance, float *mean_delta, float *variance_delta, int batch, int filters, int spatial, float *delta) @@ -203,7 +203,7 @@ __global__ void normalize_delta_kernel(int N, float *x, float *mean, float *vari if (index >= N) return; int f = (index/spatial)%filters; - delta[index] = delta[index] * 1./(sqrt(variance[f] + .00001f)) + variance_delta[f] * 2. * (x[index] - mean[f]) / (spatial * batch) + mean_delta[f]/(spatial*batch); + delta[index] = delta[index] * 1.f/(sqrtf(variance[f] + .00001f)) + variance_delta[f] * 2.f * (x[index] - mean[f]) / (spatial * batch) + mean_delta[f]/(spatial*batch); } extern "C" void normalize_delta_gpu(float *x, float *mean, float *variance, float *mean_delta, float *variance_delta, int batch, int filters, int spatial, float *delta) @@ -225,7 +225,7 @@ __global__ void variance_delta_kernel(float *x, float *delta, float *mean, floa variance_delta[i] += delta[index]*(x[index] - mean[i]); } } - variance_delta[i] *= -.5 * pow(variance[i] + .00001f, (float)(-3./2.)); + variance_delta[i] *= -.5f * powf(variance[i] + .00001f, (float)(-3.f/2.f)); } __global__ void accumulate_kernel(float *x, int n, int groups, float *sum) @@ -264,7 +264,7 @@ __global__ void fast_mean_delta_kernel(float *delta, float *variance, int batch, for(i = 0; i < threads; ++i){ mean_delta[filter] += local[i]; } - mean_delta[filter] *= (-1./sqrt(variance[filter] + .00001f)); + mean_delta[filter] *= (-1.f/sqrtf(variance[filter] + .00001f)); } } @@ -294,7 +294,7 @@ __global__ void fast_variance_delta_kernel(float *x, float *delta, float *mean, for(i = 0; i < threads; ++i){ variance_delta[filter] += local[i]; } - variance_delta[filter] *= -.5 * pow(variance[filter] + .00001f, (float)(-3./2.)); + variance_delta[filter] *= -.5f * powf(variance[filter] + .00001f, (float)(-3.f/2.f)); } } @@ -311,7 +311,7 @@ __global__ void mean_delta_kernel(float *delta, float *variance, int batch, int mean_delta[i] += delta[index]; } } - mean_delta[i] *= (-1./sqrt(variance[i] + .00001f)); + mean_delta[i] *= (-1.f/sqrtf(variance[i] + .00001f)); } extern "C" void mean_delta_gpu(float *delta, float *variance, int batch, int filters, int spatial, float *mean_delta) @@ -334,7 +334,7 @@ extern "C" void fast_variance_delta_gpu(float *x, float *delta, float *mean, flo __global__ void mean_kernel(float *x, int batch, int filters, int spatial, float *mean) { - float scale = 1./(batch * spatial); + float scale = 1.f/(batch * spatial); int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if (i >= filters) return; int j,k; @@ -350,7 +350,7 @@ __global__ void mean_kernel(float *x, int batch, int filters, int spatial, floa __global__ void variance_kernel(float *x, float *mean, int batch, int filters, int spatial, float *variance) { - float scale = 1./(batch * spatial - 1); + float scale = 1.f/(batch * spatial - 1); int j,k; int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if (i >= filters) return; @@ -358,7 +358,7 @@ __global__ void variance_kernel(float *x, float *mean, int batch, int filters, i for(j = 0; j < batch; ++j){ for(k = 0; k < spatial; ++k){ int index = j*filters*spatial + i*spatial + k; - variance[i] += pow((x[index] - mean[i]), 2); + variance[i] += powf((x[index] - mean[i]), 2); } } variance[i] *= scale; @@ -516,7 +516,7 @@ __global__ void fast_variance_kernel(float *x, float *mean, int batch, int filt for(i = 0; i < spatial; i += threads){ int index = j*spatial*filters + filter*spatial + i + id; - local[id] += (i+id < spatial) ? pow((x[index] - mean[filter]), 2) : 0; + local[id] += (i+id < spatial) ? powf((x[index] - mean[filter]), 2) : 0; } } @@ -716,7 +716,7 @@ __global__ void smooth_l1_kernel(int n, float *pred, float *truth, float *delta, int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if(i < n){ float diff = truth[i] - pred[i]; - float abs_val = abs(diff); + float abs_val = fabsf(diff); if(abs_val < 1) { error[i] = diff * diff; delta[i] = diff; @@ -864,7 +864,7 @@ __device__ void softmax_device(float *input, int n, float temp, int stride, floa largest = (val>largest) ? val : largest; } for(i = 0; i < n; ++i){ - float e = exp(input[i*stride]/temp - largest/temp); + float e = expf(input[i*stride]/temp - largest/temp); sum += e; output[i*stride] = e; } diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index b9b6f45592f..749b4c5e16e 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -33,7 +33,7 @@ __global__ void binarize_input_kernel(float *input, int n, int size, float *bina int i = 0; float mean = 0; for(i = 0; i < n; ++i){ - mean += abs(input[i*size + s]); + mean += fabsf(input[i*size + s]); } mean = mean / n; for(i = 0; i < n; ++i){ @@ -55,7 +55,7 @@ __global__ void binarize_weights_kernel(float *weights, int n, int size, float * int i = 0; float mean = 0; for(i = 0; i < size; ++i){ - mean += abs(weights[f*size + i]); + mean += fabsf(weights[f*size + i]); } mean = mean / size; for(i = 0; i < size; ++i){ @@ -139,8 +139,8 @@ __global__ void smooth_kernel(float *x, int n, int w, int h, int c, int size, fl id /= c; int b = id; - int w_offset = -(size/2.); - int h_offset = -(size/2.); + int w_offset = -(size/2.f); + int h_offset = -(size/2.f); int out_index = j + w*(i + h*(k + c*b)); int l, m; diff --git a/src/crop_layer_kernels.cu b/src/crop_layer_kernels.cu index b6568219c34..b5b9f554627 100644 --- a/src/crop_layer_kernels.cu +++ b/src/crop_layer_kernels.cu @@ -113,9 +113,9 @@ __global__ void levels_image_kernel(float *image, float *rand, int batch, int w, float r3 = rand[8*id + 3]; saturation = r0*(saturation - 1) + 1; - saturation = (r1 > .5) ? 1./saturation : saturation; + saturation = (r1 > .5f) ? 1.f/saturation : saturation; exposure = r2*(exposure - 1) + 1; - exposure = (r3 > .5) ? 1./exposure : exposure; + exposure = (r3 > .5f) ? 1.f/exposure : exposure; size_t offset = id * h * w * 3; image += offset; @@ -131,9 +131,9 @@ __global__ void levels_image_kernel(float *image, float *rand, int batch, int w, } else { shift = 0; } - image[x + w*(y + h*0)] = rgb.x*scale + translate + (rshift - .5)*shift; - image[x + w*(y + h*1)] = rgb.y*scale + translate + (gshift - .5)*shift; - image[x + w*(y + h*2)] = rgb.z*scale + translate + (bshift - .5)*shift; + image[x + w*(y + h*0)] = rgb.x*scale + translate + (rshift - .5f)*shift; + image[x + w*(y + h*1)] = rgb.y*scale + translate + (gshift - .5f)*shift; + image[x + w*(y + h*2)] = rgb.z*scale + translate + (bshift - .5f)*shift; } __global__ void forward_crop_layer_kernel(float *input, float *rand, int size, int c, int h, int w, int crop_height, int crop_width, int train, int flip, float angle, float *output) @@ -141,8 +141,8 @@ __global__ void forward_crop_layer_kernel(float *input, float *rand, int size, i int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if(id >= size) return; - float cx = w/2.; - float cy = h/2.; + float cx = w/2.f; + float cy = h/2.f; int count = id; int j = id % crop_width; @@ -160,11 +160,11 @@ __global__ void forward_crop_layer_kernel(float *input, float *rand, int size, i float dw = (w - crop_width)*r4; float dh = (h - crop_height)*r5; - flip = (flip && (r6 > .5)); + flip = (flip && (r6 > .5f)); angle = 2*angle*r7 - angle; if(!train){ - dw = (w - crop_width)/2.; - dh = (h - crop_height)/2.; + dw = (w - crop_width)/2.f; + dh = (h - crop_height)/2.f; flip = 0; angle = 0; } @@ -174,8 +174,8 @@ __global__ void forward_crop_layer_kernel(float *input, float *rand, int size, i float x = (flip) ? w - dw - j - 1 : j + dw; float y = i + dh; - float rx = cos(angle)*(x-cx) - sin(angle)*(y-cy) + cx; - float ry = sin(angle)*(x-cx) + cos(angle)*(y-cy) + cy; + float rx = cosf(angle)*(x-cx) - sinf(angle)*(y-cy) + cx; + float ry = sinf(angle)*(x-cx) + cosf(angle)*(y-cy) + cy; output[count] = bilinear_interpolate_kernel(input, w, h, rx, ry, k); } @@ -184,7 +184,7 @@ extern "C" void forward_crop_layer_gpu(crop_layer layer, network net) { cuda_random(layer.rand_gpu, layer.batch*8); - float radians = layer.angle*3.14159265/180.; + float radians = layer.angle*3.14159265f/180.f; float scale = 2; float translate = -1; diff --git a/src/data.c b/src/data.c index e060e9371dc..36b1286a491 100644 --- a/src/data.c +++ b/src/data.c @@ -137,14 +137,18 @@ matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, box_label *read_boxes(char *filename, int *n) { - box_label *boxes = calloc(1, sizeof(box_label)); FILE *file = fopen(filename, "r"); if(!file) file_error(filename); float x, y, h, w; int id; int count = 0; + int size = 64; + box_label *boxes = calloc(size, sizeof(box_label)); while(fscanf(file, "%d %f %f %f %f", &id, &x, &y, &w, &h) == 5){ - boxes = realloc(boxes, (count+1)*sizeof(box_label)); + if(count == size) { + size = size * 2; + boxes = realloc(boxes, size*sizeof(box_label)); + } boxes[count].id = id; boxes[count].x = x; boxes[count].y = y; @@ -976,6 +980,7 @@ data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, in place_image(orig, nw, nh, dx, dy, sized); random_distort_image(sized, hue, saturation, exposure); + int flip = rand()%2; if(flip) flip_image(sized); d.X.vals[i] = sized.data; diff --git a/src/demo.c b/src/demo.c index a60c456d36a..28a6ddc677a 100644 --- a/src/demo.c +++ b/src/demo.c @@ -20,10 +20,6 @@ static int demo_classes; static float **probs; static box *boxes; static network net; -static network net2; -static float **probs2; -static box *boxes2; -static float **predictions2; static image buff [3]; static image buff_letter[3]; static int buff_index = 0; diff --git a/src/image.c b/src/image.c index ece5ff50434..fc8d08d1564 100644 --- a/src/image.c +++ b/src/image.c @@ -44,6 +44,51 @@ image mask_to_rgb(image mask) return im; } +static float get_pixel(image m, int x, int y, int c) +{ + assert(x < m.w && y < m.h && c < m.c); + return m.data[c*m.h*m.w + y*m.w + x]; +} +static float get_pixel_extend(image m, int x, int y, int c) +{ + if(x < 0 || x >= m.w || y < 0 || y >= m.h) return 0; + /* + if(x < 0) x = 0; + if(x >= m.w) x = m.w-1; + if(y < 0) y = 0; + if(y >= m.h) y = m.h-1; + */ + if(c < 0 || c >= m.c) return 0; + return get_pixel(m, x, y, c); +} +static void set_pixel(image m, int x, int y, int c, float val) +{ + if (x < 0 || y < 0 || c < 0 || x >= m.w || y >= m.h || c >= m.c) return; + assert(x < m.w && y < m.h && c < m.c); + m.data[c*m.h*m.w + y*m.w + x] = val; +} +static void add_pixel(image m, int x, int y, int c, float val) +{ + assert(x < m.w && y < m.h && c < m.c); + m.data[c*m.h*m.w + y*m.w + x] += val; +} + +static float bilinear_interpolate(image im, float x, float y, int c) +{ + int ix = (int) floorf(x); + int iy = (int) floorf(y); + + float dx = x - ix; + float dy = y - iy; + + float val = (1-dy) * (1-dx) * get_pixel_extend(im, ix, iy, c) + + dy * (1-dx) * get_pixel_extend(im, ix, iy+1, c) + + (1-dy) * dx * get_pixel_extend(im, ix+1, iy, c) + + dy * dx * get_pixel_extend(im, ix+1, iy+1, c); + return val; +} + + void composite_image(image source, image dest, int dx, int dy) { int x,y,k; @@ -1255,21 +1300,6 @@ void saturate_exposure_image(image im, float sat, float exposure) constrain_image(im); } -float bilinear_interpolate(image im, float x, float y, int c) -{ - int ix = (int) floorf(x); - int iy = (int) floorf(y); - - float dx = x - ix; - float dy = y - iy; - - float val = (1-dy) * (1-dx) * get_pixel_extend(im, ix, iy, c) + - dy * (1-dx) * get_pixel_extend(im, ix, iy+1, c) + - (1-dy) * dx * get_pixel_extend(im, ix+1, iy, c) + - dy * dx * get_pixel_extend(im, ix+1, iy+1, c); - return val; -} - image resize_image(image im, int w, int h) { image resized = make_image(w, h, im.c); @@ -1419,36 +1449,6 @@ image get_image_layer(image m, int l) } return out; } - -float get_pixel(image m, int x, int y, int c) -{ - assert(x < m.w && y < m.h && c < m.c); - return m.data[c*m.h*m.w + y*m.w + x]; -} -float get_pixel_extend(image m, int x, int y, int c) -{ - if(x < 0 || x >= m.w || y < 0 || y >= m.h) return 0; - /* - if(x < 0) x = 0; - if(x >= m.w) x = m.w-1; - if(y < 0) y = 0; - if(y >= m.h) y = m.h-1; - */ - if(c < 0 || c >= m.c) return 0; - return get_pixel(m, x, y, c); -} -void set_pixel(image m, int x, int y, int c, float val) -{ - if (x < 0 || y < 0 || c < 0 || x >= m.w || y >= m.h || c >= m.c) return; - assert(x < m.w && y < m.h && c < m.c); - m.data[c*m.h*m.w + y*m.w + x] = val; -} -void add_pixel(image m, int x, int y, int c, float val) -{ - assert(x < m.w && y < m.h && c < m.c); - m.data[c*m.h*m.w + y*m.w + x] += val; -} - void print_image(image m) { int i, j, k; diff --git a/src/image.h b/src/image.h index 02c79f0887d..4ff0eacb773 100644 --- a/src/image.h +++ b/src/image.h @@ -60,12 +60,6 @@ void print_image(image m); image make_empty_image(int w, int h, int c); void copy_image_into(image src, image dest); -float get_pixel(image m, int x, int y, int c); -float get_pixel_extend(image m, int x, int y, int c); -void set_pixel(image m, int x, int y, int c, float val); -void add_pixel(image m, int x, int y, int c, float val); -float bilinear_interpolate(image im, float x, float y, int c); - image get_image_layer(image m, int l); #endif diff --git a/src/utils.h b/src/utils.h index 1593e62bbdf..4e4670754bb 100644 --- a/src/utils.h +++ b/src/utils.h @@ -5,7 +5,14 @@ #include "darknet.h" #include "list.h" -#define TWO_PI 6.2831853071795864769252866 +#define TIME(a) \ + do { \ + double start = what_time_is_it_now(); \ + a; \ + printf("%s took: %f seconds\n", #a, what_time_is_it_now() - start); \ + } while (0) + +#define TWO_PI 6.2831853071795864769252866f double what_time_is_it_now(); void shuffle(void *arr, size_t n, size_t size); From fbd48ab606dd91f076eaa68588f285c1d5f436fb Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 4 Oct 2017 16:51:41 -0700 Subject: [PATCH 051/118] grouped convolutions :snake: :snake: :snake: --- cfg/darknet.cfg | 4 + cfg/tiny.cfg | 4 + examples/darknet.c | 2 +- src/convolutional_kernels.cu | 118 +++++++++++++++------------- src/convolutional_layer.c | 145 +++++++++++++++++++---------------- src/convolutional_layer.h | 2 +- src/crnn_layer.c | 6 +- src/network_kernels.cu | 18 ++--- src/parser.c | 7 +- 9 files changed, 166 insertions(+), 140 deletions(-) diff --git a/cfg/darknet.cfg b/cfg/darknet.cfg index 60b939a38ff..a088f5d3011 100644 --- a/cfg/darknet.cfg +++ b/cfg/darknet.cfg @@ -1,6 +1,10 @@ [net] +# Train batch=128 subdivisions=1 +# Test +# batch=1 +# subdivisions=1 height=224 width=224 channels=3 diff --git a/cfg/tiny.cfg b/cfg/tiny.cfg index 99c260366d7..ba686f56aca 100644 --- a/cfg/tiny.cfg +++ b/cfg/tiny.cfg @@ -1,6 +1,10 @@ [net] +# Train batch=128 subdivisions=1 +# Test +# batch=1 +# subdivisions=1 height=224 width=224 channels=3 diff --git a/examples/darknet.c b/examples/darknet.c index 9ead608ccb4..4f6e54affd1 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -90,7 +90,7 @@ long numops(network net) for(i = 0; i < net.n; ++i){ layer l = net.layers[i]; if(l.type == CONVOLUTIONAL){ - ops += 2l * l.n * l.size*l.size*l.c * l.out_h*l.out_w; + ops += 2l * l.n * l.size*l.size*l.c/l.groups * l.out_h*l.out_w; } else if(l.type == CONNECTED){ ops += 2l * l.inputs * l.outputs; } else if (l.type == RNN){ diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index 749b4c5e16e..dd516fd311c 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -74,12 +74,12 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network net) { fill_gpu(l.outputs*l.batch, 0, l.output_gpu, 1); if(l.binary){ - binarize_weights_gpu(l.weights_gpu, l.n, l.c*l.size*l.size, l.binary_weights_gpu); + binarize_weights_gpu(l.weights_gpu, l.n, l.c/l.groups*l.size*l.size, l.binary_weights_gpu); swap_binary(&l); } if(l.xnor){ - binarize_weights_gpu(l.weights_gpu, l.n, l.c*l.size*l.size, l.binary_weights_gpu); + binarize_weights_gpu(l.weights_gpu, l.n, l.c/l.groups*l.size*l.size, l.binary_weights_gpu); swap_binary(&l); binarize_gpu(net.input_gpu, l.c*l.h*l.w*l.batch, l.binary_input_gpu); net.input_gpu = l.binary_input_gpu; @@ -102,16 +102,20 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network net) l.output_gpu); #else - int i; - int m = l.n; - int k = l.size*l.size*l.c; + int i, j; + int m = l.n/l.groups; + int k = l.size*l.size*l.c/l.groups; int n = l.out_w*l.out_h; for(i = 0; i < l.batch; ++i){ - im2col_gpu(net.input_gpu + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); - float * a = l.weights_gpu; - float * b = net.workspace; - float * c = l.output_gpu; - gemm_gpu(0,0,m,n,k,1.,a,k,b,n,1.,c+i*m*n,n); + for(j = 0; j < l.groups; ++j){ + float *a = l.weights_gpu + j*l.nweights/l.groups; + float *b = net.workspace; + float *c = l.output_gpu + (i*l.groups + j)*n*m; + + im2col_gpu(net.input_gpu + (i*l.groups + j)*l.c/l.groups*l.h*l.w, + l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, b); + gemm_gpu(0,0,m,n,k,1,a,k,b,n,1,c,n); + } } #endif @@ -221,30 +225,36 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) } #else - int m = l.n; - int n = l.size*l.size*l.c; + int m = l.n/l.groups; + int n = l.size*l.size*l.c/l.groups; int k = l.out_w*l.out_h; - int i; + int i, j; for(i = 0; i < l.batch; ++i){ - float * a = l.delta_gpu; - float * b = net.workspace; - float * c = l.weight_updates_gpu; - - im2col_gpu(net.input_gpu + i*l.c*l.h*l.w, l.c, l.h, l.w, l.size, l.stride, l.pad, net.workspace); - gemm_gpu(0,1,m,n,k,1,a + i*m*k,k,b,k,1,c,n); - - if(net.delta_gpu){ - if(l.binary || l.xnor) swap_binary(&l); - float * a = l.weights_gpu; - float * b = l.delta_gpu; - float * c = net.workspace; - - gemm_gpu(1,0,n,k,m,1,a,n,b + i*k*m,k,0,c,k); - - col2im_gpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta_gpu + i*l.c*l.h*l.w); - if(l.binary || l.xnor) { - swap_binary(&l); + for(j = 0; j < l.groups; ++j){ + float *a = l.delta_gpu + (i*l.groups + j)*m*k; + float *b = net.workspace; + float *c = l.weight_updates_gpu + j*l.nweights/l.groups; + + float *im = net.input+(i*l.groups + j)*l.c/l.groups*l.h*l.w; + + im2col_gpu(im, l.c/l.groups, l.h, l.w, + l.size, l.stride, l.pad, b); + gemm_gpu(0,1,m,n,k,1,a,k,b,k,1,c,n); + + if(net.delta_gpu){ + if(l.binary || l.xnor) swap_binary(&l); + a = l.weights_gpu + j*l.nweights/l.groups; + b = l.delta_gpu + (i*l.groups + j)*m*k; + c = net.workspace; + + gemm_gpu(1,0,n,k,m,1,a,n,b,k,0,c,k); + + col2im_gpu(net.workspace, l.c/l.groups, l.h, l.w, l.size, l.stride, + l.pad, net.delta_gpu + (i*l.groups + j)*l.c/l.groups*l.h*l.w); + if(l.binary || l.xnor) { + swap_binary(&l); + } } if(l.xnor) gradient_array_gpu(original_input + i*l.c*l.h*l.w, l.c*l.h*l.w, HARDTAN, net.delta_gpu + i*l.c*l.h*l.w); } @@ -252,29 +262,29 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) #endif } -void pull_convolutional_layer(convolutional_layer layer) +void pull_convolutional_layer(layer l) { - cuda_pull_array(layer.weights_gpu, layer.weights, layer.c*layer.n*layer.size*layer.size); - cuda_pull_array(layer.biases_gpu, layer.biases, layer.n); - cuda_pull_array(layer.weight_updates_gpu, layer.weight_updates, layer.c*layer.n*layer.size*layer.size); - cuda_pull_array(layer.bias_updates_gpu, layer.bias_updates, layer.n); - if (layer.batch_normalize){ - cuda_pull_array(layer.scales_gpu, layer.scales, layer.n); - cuda_pull_array(layer.rolling_mean_gpu, layer.rolling_mean, layer.n); - cuda_pull_array(layer.rolling_variance_gpu, layer.rolling_variance, layer.n); + cuda_pull_array(l.weights_gpu, l.weights, l.nweights); + cuda_pull_array(l.biases_gpu, l.biases, l.n); + cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.nweights); + cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.n); + if (l.batch_normalize){ + cuda_pull_array(l.scales_gpu, l.scales, l.n); + cuda_pull_array(l.rolling_mean_gpu, l.rolling_mean, l.n); + cuda_pull_array(l.rolling_variance_gpu, l.rolling_variance, l.n); } } -void push_convolutional_layer(convolutional_layer layer) +void push_convolutional_layer(layer l) { - cuda_push_array(layer.weights_gpu, layer.weights, layer.c*layer.n*layer.size*layer.size); - cuda_push_array(layer.biases_gpu, layer.biases, layer.n); - cuda_push_array(layer.weight_updates_gpu, layer.weight_updates, layer.c*layer.n*layer.size*layer.size); - cuda_push_array(layer.bias_updates_gpu, layer.bias_updates, layer.n); - if (layer.batch_normalize){ - cuda_push_array(layer.scales_gpu, layer.scales, layer.n); - cuda_push_array(layer.rolling_mean_gpu, layer.rolling_mean, layer.n); - cuda_push_array(layer.rolling_variance_gpu, layer.rolling_variance, layer.n); + cuda_push_array(l.weights_gpu, l.weights, l.nweights); + cuda_push_array(l.biases_gpu, l.biases, l.n); + cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.nweights); + cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.n); + if (l.batch_normalize){ + cuda_push_array(l.scales_gpu, l.scales, l.n); + cuda_push_array(l.rolling_mean_gpu, l.rolling_mean, l.n); + cuda_push_array(l.rolling_variance_gpu, l.rolling_variance, l.n); } } @@ -285,18 +295,16 @@ void update_convolutional_layer_gpu(layer l, update_args a) float decay = a.decay; int batch = a.batch; - int size = l.size*l.size*l.c*l.n; - if(a.adam){ - adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, size, batch, a.t); + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.nweights, batch, a.t); adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); if(l.scales_gpu){ adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); } }else{ - axpy_gpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); - axpy_gpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); - scal_gpu(size, momentum, l.weight_updates_gpu, 1); + axpy_gpu(l.nweights, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_gpu(l.nweights, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_gpu(l.nweights, momentum, l.weight_updates_gpu, 1); axpy_gpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); scal_gpu(l.n, momentum, l.bias_updates_gpu, 1); diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index 93f8ba995cb..86930b58484 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -115,7 +115,7 @@ static size_t get_workspace_size(layer l){ return most; } #endif - return (size_t)l.out_h*l.out_w*l.size*l.size*l.c*sizeof(float); + return (size_t)l.out_h*l.out_w*l.size*l.size*l.c/l.groups*sizeof(float); } #ifdef GPU @@ -124,17 +124,27 @@ void cudnn_convolutional_setup(layer *l) { cudnnSetTensor4dDescriptor(l->dsrcTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l->batch, l->c, l->h, l->w); cudnnSetTensor4dDescriptor(l->ddstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l->batch, l->out_c, l->out_h, l->out_w); - cudnnSetFilter4dDescriptor(l->dweightDesc, CUDNN_DATA_FLOAT, CUDNN_TENSOR_NCHW, l->n, l->c, l->size, l->size); cudnnSetTensor4dDescriptor(l->srcTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l->batch, l->c, l->h, l->w); cudnnSetTensor4dDescriptor(l->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, l->batch, l->out_c, l->out_h, l->out_w); cudnnSetTensor4dDescriptor(l->normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l->out_c, 1, 1); - cudnnSetFilter4dDescriptor(l->weightDesc, CUDNN_DATA_FLOAT, CUDNN_TENSOR_NCHW, l->n, l->c, l->size, l->size); + + cudnnSetFilter4dDescriptor(l->dweightDesc, CUDNN_DATA_FLOAT, CUDNN_TENSOR_NCHW, l->n, l->c/l->groups, l->size, l->size); + cudnnSetFilter4dDescriptor(l->weightDesc, CUDNN_DATA_FLOAT, CUDNN_TENSOR_NCHW, l->n, l->c/l->groups, l->size, l->size); #if CUDNN_MAJOR >= 6 cudnnSetConvolution2dDescriptor(l->convDesc, l->pad, l->pad, l->stride, l->stride, 1, 1, CUDNN_CROSS_CORRELATION, CUDNN_DATA_FLOAT); #else cudnnSetConvolution2dDescriptor(l->convDesc, l->pad, l->pad, l->stride, l->stride, 1, 1, CUDNN_CROSS_CORRELATION); #endif + + #if CUDNN_MAJOR >= 7 + cudnnSetConvolutionGroupCount(l->convDesc, l->groups); + #else + if(l->groups > 1){ + error("CUDNN < 7 doesn't support groups, please upgrade!"); + } + #endif + cudnnGetConvolutionForwardAlgorithm(cudnn_handle(), l->srcTensorDesc, l->weightDesc, @@ -163,12 +173,13 @@ void cudnn_convolutional_setup(layer *l) #endif #endif -convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int binary, int xnor, int adam) +convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int groups, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int binary, int xnor, int adam) { int i; convolutional_layer l = {0}; l.type = CONVOLUTIONAL; + l.groups = groups; l.h = h; l.w = w; l.c = c; @@ -181,20 +192,20 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.pad = padding; l.batch_normalize = batch_normalize; - l.weights = calloc(c*n*size*size, sizeof(float)); - l.weight_updates = calloc(c*n*size*size, sizeof(float)); + l.weights = calloc(c/groups*n*size*size, sizeof(float)); + l.weight_updates = calloc(c/groups*n*size*size, sizeof(float)); l.biases = calloc(n, sizeof(float)); l.bias_updates = calloc(n, sizeof(float)); - l.nweights = c*n*size*size; + l.nweights = c/groups*n*size*size; l.nbiases = n; // float scale = 1./sqrt(size*size*c); - float scale = sqrt(2./(size*size*c)); + float scale = sqrt(2./(size*size*c/l.groups)); //scale = .02; //for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_uniform(-1, 1); - for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_normal(); + for(i = 0; i < l.nweights; ++i) l.weights[i] = scale*rand_normal(); int out_w = convolutional_out_width(l); int out_h = convolutional_out_height(l); l.out_h = out_h; @@ -210,12 +221,12 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.backward = backward_convolutional_layer; l.update = update_convolutional_layer; if(binary){ - l.binary_weights = calloc(c*n*size*size, sizeof(float)); - l.cweights = calloc(c*n*size*size, sizeof(char)); + l.binary_weights = calloc(l.nweights, sizeof(float)); + l.cweights = calloc(l.nweights, sizeof(char)); l.scales = calloc(n, sizeof(float)); } if(xnor){ - l.binary_weights = calloc(c*n*size*size, sizeof(float)); + l.binary_weights = calloc(l.nweights, sizeof(float)); l.binary_input = calloc(l.inputs*l.batch, sizeof(float)); } @@ -238,8 +249,8 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.x_norm = calloc(l.batch*l.outputs, sizeof(float)); } if(adam){ - l.m = calloc(c*n*size*size, sizeof(float)); - l.v = calloc(c*n*size*size, sizeof(float)); + l.m = calloc(l.nweights, sizeof(float)); + l.v = calloc(l.nweights, sizeof(float)); l.bias_m = calloc(n, sizeof(float)); l.scale_m = calloc(n, sizeof(float)); l.bias_v = calloc(n, sizeof(float)); @@ -253,16 +264,16 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int if(gpu_index >= 0){ if (adam) { - l.m_gpu = cuda_make_array(l.m, c*n*size*size); - l.v_gpu = cuda_make_array(l.v, c*n*size*size); + l.m_gpu = cuda_make_array(l.m, l.nweights); + l.v_gpu = cuda_make_array(l.v, l.nweights); l.bias_m_gpu = cuda_make_array(l.bias_m, n); l.bias_v_gpu = cuda_make_array(l.bias_v, n); l.scale_m_gpu = cuda_make_array(l.scale_m, n); l.scale_v_gpu = cuda_make_array(l.scale_v, n); } - l.weights_gpu = cuda_make_array(l.weights, c*n*size*size); - l.weight_updates_gpu = cuda_make_array(l.weight_updates, c*n*size*size); + l.weights_gpu = cuda_make_array(l.weights, l.nweights); + l.weight_updates_gpu = cuda_make_array(l.weight_updates, l.nweights); l.biases_gpu = cuda_make_array(l.biases, n); l.bias_updates_gpu = cuda_make_array(l.bias_updates, n); @@ -271,10 +282,10 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.output_gpu = cuda_make_array(l.output, l.batch*out_h*out_w*n); if(binary){ - l.binary_weights_gpu = cuda_make_array(l.weights, c*n*size*size); + l.binary_weights_gpu = cuda_make_array(l.weights, l.nweights); } if(xnor){ - l.binary_weights_gpu = cuda_make_array(l.weights, c*n*size*size); + l.binary_weights_gpu = cuda_make_array(l.weights, l.nweights); l.binary_input_gpu = cuda_make_array(0, l.inputs*l.batch); } @@ -320,8 +331,8 @@ void denormalize_convolutional_layer(convolutional_layer l) int i, j; for(i = 0; i < l.n; ++i){ float scale = l.scales[i]/sqrt(l.rolling_variance[i] + .00001); - for(j = 0; j < l.c*l.size*l.size; ++j){ - l.weights[i*l.c*l.size*l.size + j] *= scale; + for(j = 0; j < l.c/l.groups*l.size*l.size; ++j){ + l.weights[i*l.c/l.groups*l.size*l.size + j] *= scale; } l.biases[i] -= l.rolling_mean[i] * scale; l.scales[i] = 1; @@ -432,54 +443,50 @@ void backward_bias(float *bias_updates, float *delta, int batch, int n, int size void forward_convolutional_layer(convolutional_layer l, network net) { - int out_h = l.out_h; - int out_w = l.out_w; - int i; + int i, j; fill_cpu(l.outputs*l.batch, 0, l.output, 1); if(l.xnor){ - binarize_weights(l.weights, l.n, l.c*l.size*l.size, l.binary_weights); + binarize_weights(l.weights, l.n, l.c/l.groups*l.size*l.size, l.binary_weights); swap_binary(&l); binarize_cpu(net.input, l.c*l.h*l.w*l.batch, l.binary_input); net.input = l.binary_input; } - int m = l.n; - int k = l.size*l.size*l.c; - int n = out_h*out_w; - - - float *a = l.weights; - float *b = net.workspace; - float *c = l.output; - + int m = l.n/l.groups; + int k = l.size*l.size*l.c/l.groups; + int n = l.out_w*l.out_h; for(i = 0; i < l.batch; ++i){ - im2col_cpu(net.input, l.c, l.h, l.w, - l.size, l.stride, l.pad, b); - gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); - c += n*m; - net.input += l.c*l.h*l.w; + for(j = 0; j < l.groups; ++j){ + float *a = l.weights + j*l.nweights/l.groups; + float *b = net.workspace; + float *c = l.output + (i*l.groups + j)*n*m; + + im2col_cpu(net.input + (i*l.groups + j)*l.c/l.groups*l.h*l.w, + l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, b); + gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); + } } if(l.batch_normalize){ forward_batchnorm_layer(l, net); } else { - add_bias(l.output, l.biases, l.batch, l.n, out_h*out_w); + add_bias(l.output, l.biases, l.batch, l.n, l.out_h*l.out_w); } - activate_array(l.output, m*n*l.batch, l.activation); + activate_array(l.output, l.outputs*l.batch, l.activation); if(l.binary || l.xnor) swap_binary(&l); } void backward_convolutional_layer(convolutional_layer l, network net) { - int i; - int m = l.n; - int n = l.size*l.size*l.c; + int i, j; + int m = l.n/l.groups; + int n = l.size*l.size*l.c/l.groups; int k = l.out_w*l.out_h; - gradient_array(l.output, m*k*l.batch, l.activation, l.delta); + gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta); if(l.batch_normalize){ backward_batchnorm_layer(l, net); @@ -488,24 +495,27 @@ void backward_convolutional_layer(convolutional_layer l, network net) } for(i = 0; i < l.batch; ++i){ - float *a = l.delta + i*m*k; - float *b = net.workspace; - float *c = l.weight_updates; + for(j = 0; j < l.groups; ++j){ + float *a = l.delta + (i*l.groups + j)*m*k; + float *b = net.workspace; + float *c = l.weight_updates + j*l.nweights/l.groups; - float *im = net.input+i*l.c*l.h*l.w; + float *im = net.input+(i*l.groups + j)*l.c/l.groups*l.h*l.w; - im2col_cpu(im, l.c, l.h, l.w, - l.size, l.stride, l.pad, b); - gemm(0,1,m,n,k,1,a,k,b,k,1,c,n); + im2col_cpu(im, l.c/l.groups, l.h, l.w, + l.size, l.stride, l.pad, b); + gemm(0,1,m,n,k,1,a,k,b,k,1,c,n); - if(net.delta){ - a = l.weights; - b = l.delta + i*m*k; - c = net.workspace; + if(net.delta){ + a = l.weights + j*l.nweights/l.groups; + b = l.delta + (i*l.groups + j)*m*k; + c = net.workspace; - gemm(1,0,n,k,m,1,a,n,b,k,0,c,k); + gemm(1,0,n,k,m,1,a,n,b,k,0,c,k); - col2im_cpu(net.workspace, l.c, l.h, l.w, l.size, l.stride, l.pad, net.delta+i*l.c*l.h*l.w); + col2im_cpu(net.workspace, l.c/l.groups, l.h, l.w, l.size, l.stride, + l.pad, net.delta + (i*l.groups + j)*l.c/l.groups*l.h*l.w); + } } } } @@ -517,7 +527,6 @@ void update_convolutional_layer(convolutional_layer l, update_args a) float decay = a.decay; int batch = a.batch; - int size = l.size*l.size*l.c*l.n; axpy_cpu(l.n, learning_rate/batch, l.bias_updates, 1, l.biases, 1); scal_cpu(l.n, momentum, l.bias_updates, 1); @@ -526,9 +535,9 @@ void update_convolutional_layer(convolutional_layer l, update_args a) scal_cpu(l.n, momentum, l.scale_updates, 1); } - axpy_cpu(size, -decay*batch, l.weights, 1, l.weight_updates, 1); - axpy_cpu(size, learning_rate/batch, l.weight_updates, 1, l.weights, 1); - scal_cpu(size, momentum, l.weight_updates, 1); + axpy_cpu(l.nweights, -decay*batch, l.weights, 1, l.weight_updates, 1); + axpy_cpu(l.nweights, learning_rate/batch, l.weight_updates, 1, l.weights, 1); + scal_cpu(l.nweights, momentum, l.weight_updates, 1); } @@ -536,7 +545,7 @@ image get_convolutional_weight(convolutional_layer l, int i) { int h = l.size; int w = l.size; - int c = l.c; + int c = l.c/l.groups; return float_to_image(w,h,c,l.weights+i*h*w*c); } @@ -572,10 +581,10 @@ image *get_weights(convolutional_layer l) weights[i] = copy_image(get_convolutional_weight(l, i)); normalize_image(weights[i]); /* - char buff[256]; - sprintf(buff, "filter%d", i); - save_image(weights[i], buff); - */ + char buff[256]; + sprintf(buff, "filter%d", i); + save_image(weights[i], buff); + */ } //error("hey"); return weights; diff --git a/src/convolutional_layer.h b/src/convolutional_layer.h index d42b7423d29..6c261f5fc23 100644 --- a/src/convolutional_layer.h +++ b/src/convolutional_layer.h @@ -25,7 +25,7 @@ void cudnn_convolutional_setup(layer *l); #endif #endif -convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int binary, int xnor, int adam); +convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int groups, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int binary, int xnor, int adam); void resize_convolutional_layer(convolutional_layer *layer, int w, int h); void forward_convolutional_layer(const convolutional_layer layer, network net); void update_convolutional_layer(convolutional_layer layer, update_args a); diff --git a/src/crnn_layer.c b/src/crnn_layer.c index e0ff78a2288..7dd29f62b7a 100644 --- a/src/crnn_layer.c +++ b/src/crnn_layer.c @@ -48,17 +48,17 @@ layer make_crnn_layer(int batch, int h, int w, int c, int hidden_filters, int ou l.input_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.input_layer) = make_convolutional_layer(batch*steps, h, w, c, hidden_filters, 3, 1, 1, activation, batch_normalize, 0, 0, 0); + *(l.input_layer) = make_convolutional_layer(batch*steps, h, w, c, hidden_filters, 1, 3, 1, 1, activation, batch_normalize, 0, 0, 0); l.input_layer->batch = batch; l.self_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.self_layer) = make_convolutional_layer(batch*steps, h, w, hidden_filters, hidden_filters, 3, 1, 1, activation, batch_normalize, 0, 0, 0); + *(l.self_layer) = make_convolutional_layer(batch*steps, h, w, hidden_filters, hidden_filters, 1, 3, 1, 1, activation, batch_normalize, 0, 0, 0); l.self_layer->batch = batch; l.output_layer = malloc(sizeof(layer)); fprintf(stderr, "\t\t"); - *(l.output_layer) = make_convolutional_layer(batch*steps, h, w, hidden_filters, output_filters, 3, 1, 1, activation, batch_normalize, 0, 0, 0); + *(l.output_layer) = make_convolutional_layer(batch*steps, h, w, hidden_filters, output_filters, 1, 3, 1, 1, activation, batch_normalize, 0, 0, 0); l.output_layer->batch = batch; l.output = l.output_layer->output; diff --git a/src/network_kernels.cu b/src/network_kernels.cu index df859d70f26..e14c156d785 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -162,7 +162,7 @@ void merge_weights(layer l, layer base) { if (l.type == CONVOLUTIONAL) { axpy_cpu(l.n, 1, l.bias_updates, 1, base.biases, 1); - axpy_cpu(l.n*l.size*l.size*l.c, 1, l.weight_updates, 1, base.weights, 1); + axpy_cpu(l.nweights, 1, l.weight_updates, 1, base.weights, 1); if (l.scales) { axpy_cpu(l.n, 1, l.scale_updates, 1, base.scales, 1); } @@ -176,7 +176,7 @@ void scale_weights(layer l, float s) { if (l.type == CONVOLUTIONAL) { scal_cpu(l.n, s, l.biases, 1); - scal_cpu(l.n*l.size*l.size*l.c, s, l.weights, 1); + scal_cpu(l.nweights, s, l.weights, 1); if (l.scales) { scal_cpu(l.n, s, l.scales, 1); } @@ -191,7 +191,7 @@ void pull_weights(layer l) { if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ cuda_pull_array(l.biases_gpu, l.bias_updates, l.n); - cuda_pull_array(l.weights_gpu, l.weight_updates, l.n*l.size*l.size*l.c); + cuda_pull_array(l.weights_gpu, l.weight_updates, l.nweights); if(l.scales) cuda_pull_array(l.scales_gpu, l.scale_updates, l.n); } else if(l.type == CONNECTED){ cuda_pull_array(l.biases_gpu, l.bias_updates, l.outputs); @@ -203,7 +203,7 @@ void push_weights(layer l) { if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ cuda_push_array(l.biases_gpu, l.biases, l.n); - cuda_push_array(l.weights_gpu, l.weights, l.n*l.size*l.size*l.c); + cuda_push_array(l.weights_gpu, l.weights, l.nweights); if(l.scales) cuda_push_array(l.scales_gpu, l.scales, l.n); } else if(l.type == CONNECTED){ cuda_push_array(l.biases_gpu, l.biases, l.outputs); @@ -215,7 +215,7 @@ void distribute_weights(layer l, layer base) { if (l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL) { cuda_push_array(l.biases_gpu, base.biases, l.n); - cuda_push_array(l.weights_gpu, base.weights, l.n*l.size*l.size*l.c); + cuda_push_array(l.weights_gpu, base.weights, l.nweights); if (base.scales) cuda_push_array(l.scales_gpu, base.scales, l.n); } else if (l.type == CONNECTED) { cuda_push_array(l.biases_gpu, base.biases, l.outputs); @@ -230,7 +230,7 @@ void pull_updates(layer l) { if(l.type == CONVOLUTIONAL){ cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.n); - cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.n*l.size*l.size*l.c); + cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.nweights); if(l.scale_updates) cuda_pull_array(l.scale_updates_gpu, l.scale_updates, l.n); } else if(l.type == CONNECTED){ cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.outputs); @@ -242,7 +242,7 @@ void push_updates(layer l) { if(l.type == CONVOLUTIONAL){ cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.n); - cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.n*l.size*l.size*l.c); + cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.nweights); if(l.scale_updates) cuda_push_array(l.scale_updates_gpu, l.scale_updates, l.n); } else if(l.type == CONNECTED){ cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.outputs); @@ -263,7 +263,7 @@ void merge_updates(layer l, layer base) { if (l.type == CONVOLUTIONAL) { axpy_cpu(l.n, 1, l.bias_updates, 1, base.bias_updates, 1); - axpy_cpu(l.n*l.size*l.size*l.c, 1, l.weight_updates, 1, base.weight_updates, 1); + axpy_cpu(l.nweights, 1, l.weight_updates, 1, base.weight_updates, 1); if (l.scale_updates) { axpy_cpu(l.n, 1, l.scale_updates, 1, base.scale_updates, 1); } @@ -277,7 +277,7 @@ void distribute_updates(layer l, layer base) { if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ cuda_push_array(l.bias_updates_gpu, base.bias_updates, l.n); - cuda_push_array(l.weight_updates_gpu, base.weight_updates, l.n*l.size*l.size*l.c); + cuda_push_array(l.weight_updates_gpu, base.weight_updates, l.nweights); if(base.scale_updates) cuda_push_array(l.scale_updates_gpu, base.scale_updates, l.n); } else if(l.type == CONNECTED){ cuda_push_array(l.bias_updates_gpu, base.bias_updates, l.outputs); diff --git a/src/parser.c b/src/parser.c index 80bf2750aa9..3e414aecef2 100644 --- a/src/parser.c +++ b/src/parser.c @@ -173,6 +173,7 @@ convolutional_layer parse_convolutional(list *options, size_params params) int stride = option_find_int(options, "stride",1); int pad = option_find_int_quiet(options, "pad",0); int padding = option_find_int_quiet(options, "padding",0); + int groups = option_find_int_quiet(options, "groups", 1); if(pad) padding = size/2; char *activation_s = option_find_str(options, "activation", "logistic"); @@ -188,7 +189,7 @@ convolutional_layer parse_convolutional(list *options, size_params params) int binary = option_find_int_quiet(options, "binary", 0); int xnor = option_find_int_quiet(options, "xnor", 0); - convolutional_layer layer = make_convolutional_layer(batch,h,w,c,n,size,stride,padding,activation, batch_normalize, binary, xnor, params.net.adam); + convolutional_layer layer = make_convolutional_layer(batch,h,w,c,n,groups,size,stride,padding,activation, batch_normalize, binary, xnor, params.net.adam); layer.flipped = option_find_int_quiet(options, "flipped", 0); layer.dot = option_find_float_quiet(options, "dot", 0); @@ -841,7 +842,7 @@ void save_convolutional_weights(layer l, FILE *fp) pull_convolutional_layer(l); } #endif - int num = l.n*l.c*l.size*l.size; + int num = l.nweights; fwrite(l.biases, sizeof(float), l.n, fp); if (l.batch_normalize){ fwrite(l.scales, sizeof(float), l.n, fp); @@ -1041,7 +1042,7 @@ void load_convolutional_weights(layer l, FILE *fp) //load_convolutional_weights_binary(l, fp); //return; } - int num = l.n*l.c*l.size*l.size; + int num = l.nweights; fread(l.biases, sizeof(float), l.n, fp); if (l.batch_normalize && (!l.dontloadscales)){ fread(l.scales, sizeof(float), l.n, fp); From 532c6e1481e78ba0e27c56f4492a7e8d3cc36597 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 10 Oct 2017 13:35:28 -0700 Subject: [PATCH 052/118] hm...... --- examples/detector.c | 2 +- examples/rnn.c | 27 ++++++++++++++++++--------- include/darknet.h | 1 + src/demo.c | 21 ++++++--------------- src/image.c | 33 +++++++++++++++++++++++---------- src/region_layer.c | 8 ++++++++ src/utils.c | 28 ++++++++++++++++++++++++++++ 7 files changed, 85 insertions(+), 35 deletions(-) diff --git a/examples/detector.c b/examples/detector.c index 4709b898da9..b414546fb01 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -621,7 +621,7 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time); get_region_boxes(l, im.w, im.h, net.w, net.h, thresh, probs, boxes, masks, 0, 0, hier_thresh, 1); - if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); + if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); //else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, masks, names, alphabet, l.classes); if(outfile){ diff --git a/examples/rnn.c b/examples/rnn.c index 8169f510937..994efb3d025 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -7,6 +7,20 @@ typedef struct { float *y; } float_pair; +unsigned char **load_files(char *filename, int *n) +{ + list *paths = get_paths(filename); + *n = paths->size; + unsigned char **contents = calloc(*n, sizeof(char *)); + int i; + node *x = paths->front; + for(i = 0; i < *n; ++i){ + contents[i] = read_file((char *)x->val); + x = x->next; + } + return contents; +} + int *read_tokenized_data(char *filename, size_t *read) { size_t size = 512; @@ -86,6 +100,8 @@ float_pair get_seq2seq_data(char **source, char **dest, int n, int characters, s float *y = calloc(batch * steps * characters, sizeof(float)); for(i = 0; i < batch; ++i){ int index = rand()%n; + int slen = strlen(source[index]); + int dlen = strlen(dest[index]); for(j = 0; j < steps; ++j){ unsigned char curr = source[index][j]; unsigned char next = dest[index][j]; @@ -147,15 +163,8 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, if(tokenized){ tokens = read_tokenized_data(filename, &size); } else { - FILE *fp = fopen(filename, "rb"); - - fseek(fp, 0, SEEK_END); - size = ftell(fp); - fseek(fp, 0, SEEK_SET); - - text = calloc(size+1, sizeof(char)); - fread(text, 1, size, fp); - fclose(fp); + text = read_file(filename); + size = strlen((const char*)text); } char *backup_directory = "/home/pjreddie/backup/"; diff --git a/include/darknet.h b/include/darknet.h index 336ed6f685e..0b6eeb06e8c 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -574,6 +574,7 @@ typedef struct list{ pthread_t load_data(load_args args); list *read_data_cfg(char *filename); list *read_cfg(char *filename); +unsigned char *read_file(char *filename); void forward_network(network net); void backward_network(network net); diff --git a/src/demo.c b/src/demo.c index 28a6ddc677a..c8ff8cbcc2c 100644 --- a/src/demo.c +++ b/src/demo.c @@ -38,15 +38,6 @@ static int demo_done = 0; static float *avg; double demo_time; -double get_wall_time() -{ - struct timeval time; - if (gettimeofday(&time,NULL)){ - return 0; - } - return (double)time.tv_sec + (double)time.tv_usec * .000001; -} - void *detect_in_thread(void *ptr) { running = 1; @@ -194,15 +185,15 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch } } - demo_time = get_wall_time(); + demo_time = what_time_is_it_now(); while(!demo_done){ buff_index = (buff_index + 1) %3; if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); if(!prefix){ - fps = 1./(get_wall_time() - demo_time); - demo_time = get_wall_time(); + fps = 1./(what_time_is_it_now() - demo_time); + demo_time = what_time_is_it_now(); display_in_thread(0); }else{ char name[256]; @@ -282,15 +273,15 @@ void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float th } } - demo_time = get_wall_time(); + demo_time = what_time_is_it_now(); while(!demo_done){ buff_index = (buff_index + 1) %3; if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); if(!prefix){ - fps = 1./(get_wall_time() - demo_time); - demo_time = get_wall_time(); + fps = 1./(what_time_is_it_now() - demo_time); + demo_time = what_time_is_it_now(); display_in_thread(0); }else{ char name[256]; diff --git a/src/image.c b/src/image.c index fc8d08d1564..ac1b6296924 100644 --- a/src/image.c +++ b/src/image.c @@ -237,21 +237,34 @@ image **load_alphabet() void draw_detections(image im, int num, float thresh, box *boxes, float **probs, float **masks, char **names, image **alphabet, int classes) { - int i; + int i,j; for(i = 0; i < num; ++i){ - int class = max_index(probs[i], classes); - float prob = probs[i][class]; - if(prob > thresh){ + char labelstr[4096] = {0}; + int class = -1; + for(j = 0; j < classes; ++j){ + if (probs[i][j] > thresh){ + if (class < 0) { + strcat(labelstr, names[j]); + class = j; + } else { + strcat(labelstr, ", "); + strcat(labelstr, names[j]); + } + printf("%s: %.0f%%\n", names[j], probs[i][j]*100); + } + } + if(class >= 0){ int width = im.h * .006; - if(0){ - width = pow(prob, 1./2.)*10+1; - alphabet = 0; - } + /* + if(0){ + width = pow(prob, 1./2.)*10+1; + alphabet = 0; + } + */ //printf("%d %s: %.0f%%\n", i, names[class], prob*100); - printf("%s: %.0f%%\n", names[class], prob*100); int offset = class*123457 % classes; float red = get_color(2,offset,classes); float green = get_color(1,offset,classes); @@ -277,7 +290,7 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, draw_box_width(im, left, top, right, bot, width, red, green, blue); if (alphabet) { - image label = get_label(alphabet, names[class], (im.h*.03)/10); + image label = get_label(alphabet, labelstr, (im.h*.03)/10); draw_label(im, top + width, left, label, rgb); free_image(label); } diff --git a/src/region_layer.c b/src/region_layer.c index ba4cc336676..f6f4828c98f 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -127,6 +127,10 @@ void delta_region_class(float *output, float *delta, int index, int class, int c } *avg_cat += pred; } else { + if (delta[index]){ + delta[index + stride*class] = scale * (1 - output[index + stride*class]); + return; + } for(n = 0; n < classes; ++n){ delta[index + stride*n] = scale * (((n == class)?1 : 0) - output[index + stride*n]); if(n == class) *avg_cat += output[index + stride*n]; @@ -163,6 +167,8 @@ void forward_region_layer(const layer l, network net) activate_array(l.output + index, 2*l.w*l.h, LOGISTIC); index = entry_index(l, b, n*l.w*l.h, l.coords); if(!l.background) activate_array(l.output + index, l.w*l.h, LOGISTIC); + index = entry_index(l, b, n*l.w*l.h, l.coords + 1); + if(!l.softmax && !l.softmax_tree) activate_array(l.output + index, l.classes*l.w*l.h, LOGISTIC); } } if (l.softmax_tree){ @@ -466,6 +472,8 @@ void forward_region_layer_gpu(const layer l, network net) } index = entry_index(l, b, n*l.w*l.h, l.coords); if(!l.background) activate_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC); + index = entry_index(l, b, n*l.w*l.h, l.coords + 1); + if(!l.softmax && !l.softmax_tree) activate_array_gpu(l.output_gpu + index, l.classes*l.w*l.h, LOGISTIC); } } if (l.softmax_tree){ diff --git a/src/utils.c b/src/utils.c index 9c06e1a3dae..b469ec55b42 100644 --- a/src/utils.c +++ b/src/utils.c @@ -10,6 +10,19 @@ #include "utils.h" + +/* +// old timing. is it better? who knows!! +double get_wall_time() +{ + struct timeval time; + if (gettimeofday(&time,NULL)){ + return 0; + } + return (double)time.tv_sec + (double)time.tv_usec * .000001; +} +*/ + double what_time_is_it_now() { struct timespec now; @@ -225,6 +238,21 @@ void error(const char *s) exit(-1); } +unsigned char *read_file(char *filename) +{ + FILE *fp = fopen(filename, "rb"); + size_t size; + + fseek(fp, 0, SEEK_END); + size = ftell(fp); + fseek(fp, 0, SEEK_SET); + + unsigned char *text = calloc(size+1, sizeof(char)); + fread(text, 1, size, fp); + fclose(fp); + return text; +} + void malloc_error() { fprintf(stderr, "Malloc error\n"); From cd5d393b46b59dc72a5150436e70fa91a2918b2d Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 17 Oct 2017 11:41:34 -0700 Subject: [PATCH 053/118] it's raining really hard outside :-( :rain: :storm: :cloud: --- Makefile | 4 +- cfg/darknet.cfg | 2 +- examples/art.c | 9 +- examples/captcha.c | 51 ++- examples/cifar.c | 58 ++-- examples/classifier.c | 331 +++++++------------- examples/coco.c | 70 ++--- examples/darknet.c | 168 ++++------ examples/detector.c | 96 +++--- examples/go.c | 88 +++--- examples/lsd.c | 368 +++++++++++----------- examples/nightmare.c | 46 +-- examples/regressor.c | 64 ++-- examples/rnn.c | 73 ++--- examples/segmenter.c | 77 ++--- examples/super.c | 27 +- examples/tag.c | 51 ++- examples/yolo.c | 70 ++--- include/darknet.h | 70 +++-- python/darknet.py | 6 +- src/data.c | 21 ++ src/demo.c | 33 +- src/network.c | 683 +++++++++++++++++++++++++++++++---------- src/network.h | 16 +- src/network_kernels.cu | 422 ------------------------- src/parser.c | 103 ++++--- src/region_layer.c | 8 +- 27 files changed, 1343 insertions(+), 1672 deletions(-) delete mode 100644 src/network_kernels.cu diff --git a/Makefile b/Makefile index b61f1c60b57..5f6f6e2d611 100644 --- a/Makefile +++ b/Makefile @@ -58,10 +58,10 @@ LDFLAGS+= -lcudnn endif OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o -EXECOBJA=captcha.o lsd.o super.o voxel.o art.o tag.o cifar.o go.o rnn.o rnn_vid.o compare.o segmenter.o regressor.o classifier.o coco.o dice.o yolo.o detector.o writing.o nightmare.o swag.o darknet.o +EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o attention.o darknet.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ -OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o network_kernels.o avgpool_layer_kernels.o +OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o avgpool_layer_kernels.o endif EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA)) diff --git a/cfg/darknet.cfg b/cfg/darknet.cfg index a088f5d3011..ccb4629ba9b 100644 --- a/cfg/darknet.cfg +++ b/cfg/darknet.cfg @@ -1,6 +1,6 @@ [net] # Train -batch=128 +batch=1 subdivisions=1 # Test # batch=1 diff --git a/examples/art.c b/examples/art.c index 3f03f79f722..7d58c5d9c32 100644 --- a/examples/art.c +++ b/examples/art.c @@ -5,11 +5,8 @@ void demo_art(char *cfgfile, char *weightfile, int cam_index) { #ifdef OPENCV - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); CvCapture * cap; @@ -26,7 +23,7 @@ void demo_art(char *cfgfile, char *weightfile, int cam_index) while(1){ image in = get_image_from_stream(cap); - image in_s = resize_image(in, net.w, net.h); + image in_s = resize_image(in, net->w, net->h); show_image(in, window); float *p = network_predict(net, in_s.data); diff --git a/examples/captcha.c b/examples/captcha.c index fd4cb5a5e9d..41d6d07c308 100644 --- a/examples/captcha.c +++ b/examples/captcha.c @@ -30,13 +30,10 @@ void train_captcha(char *cfgfile, char *weightfile) float avg_loss = -1; char *base = basecfg(cfgfile); printf("%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, 0); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); int imgs = 1024; - int i = *net.seen/imgs; + int i = *net->seen/imgs; int solved = 1; list *plist; char **labels = get_labels("/data/captcha/reimgs.labels.list"); @@ -53,8 +50,8 @@ void train_captcha(char *cfgfile, char *weightfile) data buffer; load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.paths = paths; args.classes = 26; args.n = imgs; @@ -83,7 +80,7 @@ void train_captcha(char *cfgfile, char *weightfile) float loss = train_network(net, train); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d: %f, %f avg, %lf seconds, %ld images\n", i, loss, avg_loss, sec(clock()-time), *net.seen); + printf("%d: %f, %f avg, %lf seconds, %ld images\n", i, loss, avg_loss, sec(clock()-time), *net->seen); free_data(train); if(i%100==0){ char buff[256]; @@ -95,11 +92,8 @@ void train_captcha(char *cfgfile, char *weightfile) void test_captcha(char *cfgfile, char *weightfile, char *filename) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); int i = 0; char **names = get_labels("/data/captcha/reimgs.labels.list"); @@ -116,7 +110,7 @@ void test_captcha(char *cfgfile, char *weightfile, char *filename) if(!input) return; strtok(input, "\n"); } - image im = load_image_color(input, net.w, net.h); + image im = load_image_color(input, net->w, net->h); float *X = im.data; float *predictions = network_predict(net, X); top_predictions(net, 26, indexes); @@ -136,21 +130,18 @@ void test_captcha(char *cfgfile, char *weightfile, char *filename) void valid_captcha(char *cfgfile, char *weightfile, char *filename) { char **labels = get_labels("/data/captcha/reimgs.labels.list"); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); list *plist = get_paths("/data/captcha/reimgs.fg.list"); char **paths = (char **)list_to_array(plist); int N = plist->size; - int outputs = net.outputs; + int outputs = net->outputs; - set_batch_network(&net, 1); + set_batch_network(net, 1); srand(2222222); int i, j; for(i = 0; i < N; ++i){ if (i%100 == 0) fprintf(stderr, "%d\n", i); - image im = load_image_color(paths[i], net.w, net.h); + image im = load_image_color(paths[i], net->w, net->h); float *X = im.data; float *predictions = network_predict(net, X); //printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); @@ -185,9 +176,9 @@ void valid_captcha(char *cfgfile, char *weightfile, char *filename) if(weightfile){ load_weights(&net, weightfile); } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); int imgs = 1024; - int i = net.seen/imgs; + int i = net->seen/imgs; list *plist = get_paths("/data/captcha/train.auto5"); char **paths = (char **)list_to_array(plist); printf("%d\n", plist->size); @@ -201,10 +192,10 @@ void valid_captcha(char *cfgfile, char *weightfile, char *filename) printf("Loaded: %lf seconds\n", sec(clock()-time)); time=clock(); float loss = train_network(net, train); - net.seen += imgs; + net->seen += imgs; if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), net.seen); + printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), net->seen); free_data(train); if(i%10==0){ char buff[256]; @@ -251,9 +242,9 @@ network net = parse_network_cfg(cfgfile); if(weightfile){ load_weights(&net, weightfile); } -printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); +printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); int imgs = 1024; -int i = net.seen/imgs; +int i = net->seen/imgs; list *plist = get_paths("/data/captcha/encode.list"); char **paths = (char **)list_to_array(plist); printf("%d\n", plist->size); @@ -266,10 +257,10 @@ while(1){ printf("Loaded: %lf seconds\n", sec(clock()-time)); time=clock(); float loss = train_network(net, train); - net.seen += imgs; + net->seen += imgs; if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), net.seen); + printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), net->seen); free_matrix(train.X); if(i%100==0){ char buff[256]; diff --git a/examples/cifar.c b/examples/cifar.c index fd01e601bce..d57d7fdc09e 100644 --- a/examples/cifar.c +++ b/examples/cifar.c @@ -6,28 +6,25 @@ void train_cifar(char *cfgfile, char *weightfile) float avg_loss = -1; char *base = basecfg(cfgfile); printf("%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, 0); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); char *backup_directory = "/home/pjreddie/backup/"; int classes = 10; int N = 50000; char **labels = get_labels("data/cifar/labels.txt"); - int epoch = (*net.seen)/N; + int epoch = (*net->seen)/N; data train = load_all_cifar10(); - while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ clock_t time=clock(); float loss = train_network_sgd(net, train, 1); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.95 + loss*.05; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); - if(*net.seen/N > epoch){ - epoch = *net.seen/N; + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen); + if(*net->seen/N > epoch){ + epoch = *net->seen/N; char buff[256]; sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); save_weights(net, buff); @@ -54,18 +51,15 @@ void train_cifar_distill(char *cfgfile, char *weightfile) float avg_loss = -1; char *base = basecfg(cfgfile); printf("%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, 0); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); char *backup_directory = "/home/pjreddie/backup/"; int classes = 10; int N = 50000; char **labels = get_labels("data/cifar/labels.txt"); - int epoch = (*net.seen)/N; + int epoch = (*net->seen)/N; data train = load_all_cifar10(); matrix soft = csv_to_matrix("results/ensemble.csv"); @@ -75,15 +69,15 @@ void train_cifar_distill(char *cfgfile, char *weightfile) scale_matrix(train.y, 1. - weight); matrix_add_matrix(soft, train.y); - while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ clock_t time=clock(); float loss = train_network_sgd(net, train, 1); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.95 + loss*.05; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); - if(*net.seen/N > epoch){ - epoch = *net.seen/N; + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen); + if(*net->seen/N > epoch){ + epoch = *net->seen/N; char buff[256]; sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); save_weights(net, buff); @@ -106,11 +100,8 @@ void train_cifar_distill(char *cfgfile, char *weightfile) void test_cifar_multi(char *filename, char *weightfile) { - network net = parse_network_cfg(filename); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); srand(time(0)); float avg_acc = 0; @@ -138,10 +129,7 @@ void test_cifar_multi(char *filename, char *weightfile) void test_cifar(char *filename, char *weightfile) { - network net = parse_network_cfg(filename); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(filename, weightfile, 0); srand(time(0)); clock_t time; @@ -182,10 +170,7 @@ char *labels[] = {"airplane","automobile","bird","cat","deer","dog","frog","hors void test_cifar_csv(char *filename, char *weightfile) { - network net = parse_network_cfg(filename); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(filename, weightfile, 0); srand(time(0)); data test = load_cifar10_data("data/cifar/cifar-10-batches-bin/test_batch.bin"); @@ -207,12 +192,9 @@ void test_cifar_csv(char *filename, char *weightfile) free_data(test); } -void test_cifar_csvtrain(char *filename, char *weightfile) +void test_cifar_csvtrain(char *cfg, char *weights) { - network net = parse_network_cfg(filename); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfg, weights, 0); srand(time(0)); data test = load_all_cifar10(); diff --git a/examples/classifier.c b/examples/classifier.c index 20202c8c21d..ad80e5f7ba6 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -23,7 +23,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, char *base = basecfg(cfgfile); printf("%s\n", base); printf("%d\n", ngpus); - network *nets = calloc(ngpus, sizeof(network)); + network **nets = calloc(ngpus, sizeof(network*)); srand(time(0)); int seed = rand(); @@ -33,14 +33,14 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, cuda_set_device(gpus[i]); #endif nets[i] = load_network(cfgfile, weightfile, clear); - nets[i].learning_rate *= ngpus; + nets[i]->learning_rate *= ngpus; } srand(time(0)); - network net = nets[0]; + network *net = nets[0]; - int imgs = net.batch * net.subdivisions * ngpus; + int imgs = net->batch * net->subdivisions * ngpus; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); list *options = read_data_cfg(datacfg); char *backup_directory = option_find_str(options, "backup", "/backup/"); @@ -56,19 +56,20 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, double time; load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.threads = 32; - args.hierarchy = net.hierarchy; - - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - args.size = net.w; + args.hierarchy = net->hierarchy; + + args.min = net->min_ratio*net->w; + args.max = net->max_ratio*net->w; + printf("%d %d\n", args.min, args.max); + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; + args.size = net->w; args.paths = paths; args.classes = classes; @@ -83,8 +84,32 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, args.d = &buffer; load_thread = load_data(args); - int epoch = (*net.seen)/N; - while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + int count = 0; + int epoch = (*net->seen)/N; + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ + if(net->random && count++%40 == 0){ + printf("Resizing\n"); + int dim = (rand() % 11 + 4) * 32; + //if (get_current_batch(net)+200 > net->max_batches) dim = 608; + //int dim = (rand() % 4 + 16) * 32; + printf("%d\n", dim); + args.w = dim; + args.h = dim; + args.size = dim; + args.min = net->min_ratio*dim; + args.max = net->max_ratio*dim; + printf("%d %d\n", args.min, args.max); + + pthread_join(load_thread, 0); + train = buffer; + free_data(train); + load_thread = load_data(args); + + for(i = 0; i < ngpus; ++i){ + resize_network(nets[i], dim, dim); + } + net = nets[0]; + } time = what_time_is_it_now(); pthread_join(load_thread, 0); @@ -106,10 +131,10 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #endif if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen); free_data(train); - if(*net.seen/N > epoch){ - epoch = *net.seen/N; + if(*net->seen/N > epoch){ + epoch = *net->seen/N; char buff[256]; sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); save_weights(net, buff); @@ -132,124 +157,10 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, free(base); } - -/* - void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int clear) - { - srand(time(0)); - float avg_loss = -1; - char *base = basecfg(cfgfile); - printf("%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - if(clear) *net.seen = 0; - - int imgs = net.batch * net.subdivisions; - - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - list *options = read_data_cfg(datacfg); - - char *backup_directory = option_find_str(options, "backup", "/backup/"); - char *label_list = option_find_str(options, "labels", "data/labels.list"); - char *train_list = option_find_str(options, "train", "data/train.list"); - int classes = option_find_int(options, "classes", 2); - - char **labels = get_labels(label_list); - list *plist = get_paths(train_list); - char **paths = (char **)list_to_array(plist); - printf("%d\n", plist->size); - int N = plist->size; - clock_t time; - - load_args args = {0}; - args.w = net.w; - args.h = net.h; - args.threads = 8; - - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - args.size = net.w; - args.hierarchy = net.hierarchy; - - args.paths = paths; - args.classes = classes; - args.n = imgs; - args.m = N; - args.labels = labels; - args.type = CLASSIFICATION_DATA; - - data train; - data buffer; - pthread_t load_thread; - args.d = &buffer; - load_thread = load_data(args); - - int epoch = (*net.seen)/N; - while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ - time=clock(); - - pthread_join(load_thread, 0); - train = buffer; - load_thread = load_data(args); - - printf("Loaded: %lf seconds\n", sec(clock()-time)); - time=clock(); - -#ifdef OPENCV -if(0){ -int u; -for(u = 0; u < imgs; ++u){ - image im = float_to_image(net.w, net.h, 3, train.X.vals[u]); - show_image(im, "loaded"); - cvWaitKey(0); -} -} -#endif - -float loss = train_network(net, train); -free_data(train); - -if(avg_loss == -1) avg_loss = loss; -avg_loss = avg_loss*.9 + loss*.1; -printf("%d, %.3f: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); -if(*net.seen/N > epoch){ - epoch = *net.seen/N; - char buff[256]; - sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); - save_weights(net, buff); -} -if(get_current_batch(net)%100 == 0){ - char buff[256]; - sprintf(buff, "%s/%s.backup",backup_directory,base); - save_weights(net, buff); -} -} -char buff[256]; -sprintf(buff, "%s/%s.weights", backup_directory, base); -save_weights(net, buff); - -free_network(net); -free_ptrs((void**)labels, classes); -free_ptrs((void**)paths, plist->size); -free_list(plist); -free(base); -} -*/ - void validate_classifier_crop(char *datacfg, char *filename, char *weightfile) { int i = 0; - network net = parse_network_cfg(filename); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(filename, weightfile, 0); srand(time(0)); list *options = read_data_cfg(datacfg); @@ -275,8 +186,8 @@ void validate_classifier_crop(char *datacfg, char *filename, char *weightfile) data val, buffer; load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.paths = paths; args.classes = classes; @@ -313,11 +224,8 @@ void validate_classifier_crop(char *datacfg, char *filename, char *weightfile) void validate_classifier_10(char *datacfg, char *filename, char *weightfile) { int i, j; - network net = parse_network_cfg(filename); - set_batch_network(&net, 1); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); srand(time(0)); list *options = read_data_cfg(datacfg); @@ -347,8 +255,8 @@ void validate_classifier_10(char *datacfg, char *filename, char *weightfile) break; } } - int w = net.w; - int h = net.h; + int w = net->w; + int h = net->h; int shift = 32; image im = load_image_color(paths[i], w+shift, h+shift); image images[10]; @@ -366,7 +274,7 @@ void validate_classifier_10(char *datacfg, char *filename, char *weightfile) float *pred = calloc(classes, sizeof(float)); for(j = 0; j < 10; ++j){ float *p = network_predict(net, images[j].data); - if(net.hierarchy) hierarchy_predictions(p, net.outputs, net.hierarchy, 1, 1); + if(net->hierarchy) hierarchy_predictions(p, net->outputs, net->hierarchy, 1, 1); axpy_cpu(classes, 1, p, 1, pred, 1); free_image(images[j]); } @@ -385,11 +293,8 @@ void validate_classifier_10(char *datacfg, char *filename, char *weightfile) void validate_classifier_full(char *datacfg, char *filename, char *weightfile) { int i, j; - network net = parse_network_cfg(filename); - set_batch_network(&net, 1); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); srand(time(0)); list *options = read_data_cfg(datacfg); @@ -410,7 +315,7 @@ void validate_classifier_full(char *datacfg, char *filename, char *weightfile) float avg_topk = 0; int *indexes = calloc(topk, sizeof(int)); - int size = net.w; + int size = net->w; for(i = 0; i < m; ++i){ int class = -1; char *path = paths[i]; @@ -422,12 +327,12 @@ void validate_classifier_full(char *datacfg, char *filename, char *weightfile) } image im = load_image_color(paths[i], 0, 0); image resized = resize_min(im, size); - resize_network(&net, resized.w, resized.h); + resize_network(net, resized.w, resized.h); //show_image(im, "orig"); //show_image(crop, "cropped"); //cvWaitKey(0); float *pred = network_predict(net, resized.data); - if(net.hierarchy) hierarchy_predictions(pred, net.outputs, net.hierarchy, 1, 1); + if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 1, 1); free_image(im); free_image(resized); @@ -446,18 +351,15 @@ void validate_classifier_full(char *datacfg, char *filename, char *weightfile) void validate_classifier_single(char *datacfg, char *filename, char *weightfile) { int i, j; - network net = parse_network_cfg(filename); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); srand(time(0)); list *options = read_data_cfg(datacfg); char *label_list = option_find_str(options, "labels", "data/labels.list"); char *leaf_list = option_find_str(options, "leaves", 0); - if(leaf_list) change_leaves(net.hierarchy, leaf_list); + if(leaf_list) change_leaves(net->hierarchy, leaf_list); char *valid_list = option_find_str(options, "valid", "data/train.list"); int classes = option_find_int(options, "classes", 2); int topk = option_find_int(options, "top", 1); @@ -483,13 +385,13 @@ void validate_classifier_single(char *datacfg, char *filename, char *weightfile) } } image im = load_image_color(paths[i], 0, 0); - image resized = resize_min(im, net.w); - image crop = crop_image(resized, (resized.w - net.w)/2, (resized.h - net.h)/2, net.w, net.h); + image resized = resize_min(im, net->w); + image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h); //show_image(im, "orig"); //show_image(crop, "cropped"); //cvWaitKey(0); float *pred = network_predict(net, crop.data); - if(net.hierarchy) hierarchy_predictions(pred, net.outputs, net.hierarchy, 1, 1); + if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 1, 1); if(resized.data != im.data) free_image(resized); free_image(im); @@ -505,14 +407,11 @@ void validate_classifier_single(char *datacfg, char *filename, char *weightfile) } } -void validate_classifier_multi(char *datacfg, char *filename, char *weightfile) +void validate_classifier_multi(char *datacfg, char *cfg, char *weights) { int i, j; - network net = parse_network_cfg(filename); - set_batch_network(&net, 1); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); srand(time(0)); list *options = read_data_cfg(datacfg); @@ -524,7 +423,8 @@ void validate_classifier_multi(char *datacfg, char *filename, char *weightfile) char **labels = get_labels(label_list); list *plist = get_paths(valid_list); - int scales[] = {224, 288, 320, 352, 384}; + //int scales[] = {224, 288, 320, 352, 384}; + int scales[] = {224, 256, 288, 320}; int nscales = sizeof(scales)/sizeof(scales[0]); char **paths = (char **)list_to_array(plist); @@ -548,9 +448,9 @@ void validate_classifier_multi(char *datacfg, char *filename, char *weightfile) image im = load_image_color(paths[i], 0, 0); for(j = 0; j < nscales; ++j){ image r = resize_min(im, scales[j]); - resize_network(&net, r.w, r.h); + resize_network(net, r.w, r.h); float *p = network_predict(net, r.data); - if(net.hierarchy) hierarchy_predictions(p, net.outputs, net.hierarchy, 1 , 1); + if(net->hierarchy) hierarchy_predictions(p, net->outputs, net->hierarchy, 1 , 1); axpy_cpu(classes, 1, p, 1, pred, 1); flip_image(r); p = network_predict(net, r.data); @@ -571,11 +471,8 @@ void validate_classifier_multi(char *datacfg, char *filename, char *weightfile) void try_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int layer_num) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); list *options = read_data_cfg(datacfg); @@ -616,7 +513,7 @@ void try_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filena time=clock(); float *predictions = network_predict(net, X); - layer l = net.layers[layer_num]; + layer l = net->layers[layer_num]; for(i = 0; i < l.c; ++i){ if(l.rolling_mean) printf("%f %f %f\n", l.rolling_mean[i], l.rolling_variance[i], l.scales[i]); } @@ -652,11 +549,8 @@ void try_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filena void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); list *options = read_data_cfg(datacfg); @@ -682,19 +576,19 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi strtok(input, "\n"); } image im = load_image_color(input, 0, 0); - image r = letterbox_image(im, net.w, net.h); - //resize_network(&net, r.w, r.h); + image r = letterbox_image(im, net->w, net->h); + //resize_network(net, r.w, r.h); //printf("%d %d\n", r.w, r.h); float *X = r.data; time=clock(); float *predictions = network_predict(net, X); - if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 1, 1); - top_k(predictions, net.outputs, top, indexes); + if(net->hierarchy) hierarchy_predictions(predictions, net->outputs, net->hierarchy, 1, 1); + top_k(predictions, net->outputs, top, indexes); fprintf(stderr, "%s: Predicted in %f seconds.\n", input, sec(clock()-time)); for(i = 0; i < top; ++i){ int index = indexes[i]; - //if(net.hierarchy) printf("%d, %s: %f, parent: %s \n",index, names[index], predictions[index], (net.hierarchy->parent[index] >= 0) ? names[net.hierarchy->parent[index]] : "Root"); + //if(net->hierarchy) printf("%d, %s: %f, parent: %s \n",index, names[index], predictions[index], (net->hierarchy->parent[index] >= 0) ? names[net->hierarchy->parent[index]] : "Root"); //else printf("%s: %f\n",names[index], predictions[index]); printf("%5.2f%%: %s\n", predictions[index]*100, names[index]); } @@ -708,11 +602,8 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi void label_classifier(char *datacfg, char *filename, char *weightfile) { int i; - network net = parse_network_cfg(filename); - set_batch_network(&net, 1); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); srand(time(0)); list *options = read_data_cfg(datacfg); @@ -730,8 +621,8 @@ void label_classifier(char *datacfg, char *filename, char *weightfile) for(i = 0; i < m; ++i){ image im = load_image_color(paths[i], 0, 0); - image resized = resize_min(im, net.w); - image crop = crop_image(resized, (resized.w - net.w)/2, (resized.h - net.h)/2, net.w, net.h); + image resized = resize_min(im, net->w); + image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h); float *pred = network_predict(net, crop.data); if(resized.data != im.data) free_image(resized); @@ -747,10 +638,7 @@ void label_classifier(char *datacfg, char *filename, char *weightfile) void test_classifier(char *datacfg, char *cfgfile, char *weightfile, int target_layer) { int curr = 0; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); srand(time(0)); list *options = read_data_cfg(datacfg); @@ -769,18 +657,18 @@ void test_classifier(char *datacfg, char *cfgfile, char *weightfile, int target_ data val, buffer; load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.paths = paths; args.classes = classes; - args.n = net.batch; + args.n = net->batch; args.m = 0; args.labels = 0; args.d = &buffer; args.type = OLD_CLASSIFICATION_DATA; pthread_t load_thread = load_data_in_thread(args); - for(curr = net.batch; curr < m; curr += net.batch){ + for(curr = net->batch; curr < m; curr += net->batch){ time=clock(); pthread_join(load_thread, 0); @@ -788,7 +676,7 @@ void test_classifier(char *datacfg, char *cfgfile, char *weightfile, int target_ if(curr < m){ args.paths = paths + curr; - if (curr + net.batch > m) args.n = m - curr; + if (curr + net->batch > m) args.n = m - curr; load_thread = load_data_in_thread(args); } fprintf(stderr, "Loaded: %d images in %lf seconds\n", val.X.rows, sec(clock()-time)); @@ -798,11 +686,11 @@ void test_classifier(char *datacfg, char *cfgfile, char *weightfile, int target_ int i, j; if (target_layer >= 0){ - //layer l = net.layers[target_layer]; + //layer l = net->layers[target_layer]; } for(i = 0; i < pred.rows; ++i){ - printf("%s", paths[curr-net.batch+i]); + printf("%s", paths[curr-net->batch+i]); for(j = 0; j < pred.cols; ++j){ printf("\t%g", pred.vals[i][j]); } @@ -824,11 +712,8 @@ void threat_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_i float roll = .2; printf("Classifier Demo\n"); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); list *options = read_data_cfg(datacfg); srand(2222222); @@ -862,7 +747,7 @@ void threat_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_i image in = get_image_from_stream(cap); if(!in.data) break; - image in_s = resize_image(in, net.w, net.h); + image in_s = resize_image(in, net->w, net->h); image out = in; int x1 = out.w / 20; @@ -956,11 +841,8 @@ void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_inde int bad_cats[] = {218, 539, 540, 1213, 1501, 1742, 1911, 2415, 4348, 19223, 368, 369, 370, 1133, 1200, 1306, 2122, 2301, 2537, 2823, 3179, 3596, 3639, 4489, 5107, 5140, 5289, 6240, 6631, 6762, 7048, 7171, 7969, 7984, 7989, 8824, 8927, 9915, 10270, 10448, 13401, 15205, 18358, 18894, 18895, 19249, 19697}; printf("Classifier Demo\n"); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); list *options = read_data_cfg(datacfg); srand(2222222); @@ -990,7 +872,7 @@ void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_inde gettimeofday(&tval_before, NULL); image in = get_image_from_stream(cap); - image in_s = resize_image(in, net.w, net.h); + image in_s = resize_image(in, net->w, net->h); show_image(in, "Threat Detection"); float *predictions = network_predict(net, in_s.data); @@ -1033,11 +915,8 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind { #ifdef OPENCV printf("Classifier Demo\n"); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); list *options = read_data_cfg(datacfg); srand(2222222); @@ -1067,11 +946,11 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind gettimeofday(&tval_before, NULL); image in = get_image_from_stream(cap); - image in_s = resize_image(in, net.w, net.h); + image in_s = resize_image(in, net->w, net->h); show_image(in, "Classifier"); float *predictions = network_predict(net, in_s.data); - if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 1, 1); + if(net->hierarchy) hierarchy_predictions(predictions, net->outputs, net->hierarchy, 1, 1); top_predictions(net, top, indexes); printf("\033[2J"); diff --git a/examples/coco.c b/examples/coco.c index 32abcc2f5f2..77e04bbf289 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -17,17 +17,14 @@ void train_coco(char *cfgfile, char *weightfile) char *base = basecfg(cfgfile); printf("%s\n", base); float avg_loss = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - int imgs = net.batch*net.subdivisions; - int i = *net.seen/imgs; + network *net = load_network(cfgfile, weightfile, 0); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + int imgs = net->batch*net->subdivisions; + int i = *net->seen/imgs; data train, buffer; - layer l = net.layers[net.n - 1]; + layer l = net->layers[net->n - 1]; int side = l.side; int classes = l.classes; @@ -38,8 +35,8 @@ void train_coco(char *cfgfile, char *weightfile) char **paths = (char **)list_to_array(plist); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.paths = paths; args.n = imgs; args.m = plist->size; @@ -49,15 +46,15 @@ void train_coco(char *cfgfile, char *weightfile) args.d = &buffer; args.type = REGION_DATA; - args.angle = net.angle; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; + args.angle = net->angle; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; pthread_t load_thread = load_data_in_thread(args); clock_t time; //while(i*imgs < N*120){ - while(get_current_batch(net) < net.max_batches){ + while(get_current_batch(net) < net->max_batches){ i += 1; time=clock(); pthread_join(load_thread, 0); @@ -67,7 +64,7 @@ void train_coco(char *cfgfile, char *weightfile) printf("Loaded: %lf seconds\n", sec(clock()-time)); /* - image im = float_to_image(net.w, net.h, 3, train.X.vals[113]); + image im = float_to_image(net->w, net->h, 3, train.X.vals[113]); image copy = copy_image(im); draw_coco(copy, train.y.vals[113], 7, "truth"); cvWaitKey(0); @@ -128,14 +125,11 @@ int get_coco_image_id(char *filename) return atoi(p+1); } -void validate_coco(char *cfgfile, char *weightfile) +void validate_coco(char *cfg, char *weights) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); srand(time(0)); char *base = "results/"; @@ -144,7 +138,7 @@ void validate_coco(char *cfgfile, char *weightfile) //list *plist = get_paths("/home/pjreddie/data/voc/test/2007_test.txt"); char **paths = (char **)list_to_array(plist); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; int classes = l.classes; int side = l.side; @@ -174,8 +168,8 @@ void validate_coco(char *cfgfile, char *weightfile) pthread_t *thr = calloc(nthreads, sizeof(pthread_t)); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.type = IMAGE_DATA; for(t = 0; t < nthreads; ++t){ @@ -221,19 +215,16 @@ void validate_coco(char *cfgfile, char *weightfile) void validate_coco_recall(char *cfgfile, char *weightfile) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); srand(time(0)); char *base = "results/comp4_det_test_"; list *plist = get_paths("/home/pjreddie/data/voc/test/2007_test.txt"); char **paths = (char **)list_to_array(plist); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; int classes = l.classes; int side = l.side; @@ -264,7 +255,7 @@ void validate_coco_recall(char *cfgfile, char *weightfile) for(i = 0; i < m; ++i){ char *path = paths[i]; image orig = load_image_color(path, 0, 0); - image sized = resize_image(orig, net.w, net.h); + image sized = resize_image(orig, net->w, net->h); char *id = basecfg(path); network_predict(net, sized.data); get_detection_boxes(l, 1, 1, thresh, probs, boxes, 1); @@ -309,12 +300,9 @@ void validate_coco_recall(char *cfgfile, char *weightfile) void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) { image **alphabet = load_alphabet(); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - layer l = net.layers[net.n-1]; - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + layer l = net->layers[net->n-1]; + set_batch_network(net, 1); srand(2222222); float nms = .4; clock_t time; @@ -335,7 +323,7 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) strtok(input, "\n"); } image im = load_image_color(input,0,0); - image sized = resize_image(im, net.w, net.h); + image sized = resize_image(im, net->w, net->h); float *X = sized.data; time=clock(); network_predict(net, X); diff --git a/examples/darknet.c b/examples/darknet.c index 4f6e54affd1..c67f20a1090 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -6,20 +6,15 @@ extern void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top); extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen); -extern void run_voxel(int argc, char **argv); extern void run_yolo(int argc, char **argv); extern void run_detector(int argc, char **argv); extern void run_coco(int argc, char **argv); -extern void run_writing(int argc, char **argv); extern void run_captcha(int argc, char **argv); extern void run_nightmare(int argc, char **argv); -extern void run_dice(int argc, char **argv); -extern void run_compare(int argc, char **argv); extern void run_classifier(int argc, char **argv); extern void run_regressor(int argc, char **argv); extern void run_segmenter(int argc, char **argv); extern void run_char_rnn(int argc, char **argv); -extern void run_vid_rnn(int argc, char **argv); extern void run_tag(int argc, char **argv); extern void run_cifar(int argc, char **argv); extern void run_go(int argc, char **argv); @@ -32,20 +27,20 @@ void average(int argc, char *argv[]) char *cfgfile = argv[2]; char *outfile = argv[3]; gpu_index = -1; - network net = parse_network_cfg(cfgfile); - network sum = parse_network_cfg(cfgfile); + network *net = parse_network_cfg(cfgfile); + network *sum = parse_network_cfg(cfgfile); char *weightfile = argv[4]; - load_weights(&sum, weightfile); + load_weights(sum, weightfile); int i, j; int n = argc - 5; for(i = 0; i < n; ++i){ weightfile = argv[i+5]; - load_weights(&net, weightfile); - for(j = 0; j < net.n; ++j){ - layer l = net.layers[j]; - layer out = sum.layers[j]; + load_weights(net, weightfile); + for(j = 0; j < net->n; ++j){ + layer l = net->layers[j]; + layer out = sum->layers[j]; if(l.type == CONVOLUTIONAL){ int num = l.n*l.c*l.size*l.size; axpy_cpu(l.n, 1, l.biases, 1, out.biases, 1); @@ -63,8 +58,8 @@ void average(int argc, char *argv[]) } } n = n+1; - for(j = 0; j < net.n; ++j){ - layer l = sum.layers[j]; + for(j = 0; j < net->n; ++j){ + layer l = sum->layers[j]; if(l.type == CONVOLUTIONAL){ int num = l.n*l.c*l.size*l.size; scal_cpu(l.n, 1./n, l.biases, 1); @@ -83,12 +78,12 @@ void average(int argc, char *argv[]) save_weights(sum, outfile); } -long numops(network net) +long numops(network *net) { int i; long ops = 0; - for(i = 0; i < net.n; ++i){ - layer l = net.layers[i]; + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; if(l.type == CONVOLUTIONAL){ ops += 2l * l.n * l.size*l.size*l.c/l.groups * l.out_h*l.out_w; } else if(l.type == CONNECTED){ @@ -121,11 +116,11 @@ long numops(network net) void speed(char *cfgfile, int tics) { if (tics == 0) tics = 1000; - network net = parse_network_cfg(cfgfile); - set_batch_network(&net, 1); + network *net = parse_network_cfg(cfgfile); + set_batch_network(net, 1); int i; double time=what_time_is_it_now(); - image im = make_image(net.w, net.h, net.c*net.batch); + image im = make_image(net->w, net->h, net->c*net->batch); for(i = 0; i < tics; ++i){ network_predict(net, im.data); } @@ -141,7 +136,7 @@ void speed(char *cfgfile, int tics) void operations(char *cfgfile) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); + network *net = parse_network_cfg(cfgfile); long ops = numops(net); printf("Floating Point Operations: %ld\n", ops); printf("Floating Point Operations: %.2f Bn\n", (float)ops/1000000000.); @@ -150,63 +145,56 @@ void operations(char *cfgfile) void oneoff(char *cfgfile, char *weightfile, char *outfile) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); - int oldn = net.layers[net.n - 2].n; - int c = net.layers[net.n - 2].c; - scal_cpu(oldn*c, .1, net.layers[net.n - 2].weights, 1); - scal_cpu(oldn, 0, net.layers[net.n - 2].biases, 1); - net.layers[net.n - 2].n = 11921; - net.layers[net.n - 2].biases += 5; - net.layers[net.n - 2].weights += 5*c; + network *net = parse_network_cfg(cfgfile); + int oldn = net->layers[net->n - 2].n; + int c = net->layers[net->n - 2].c; + scal_cpu(oldn*c, .1, net->layers[net->n - 2].weights, 1); + scal_cpu(oldn, 0, net->layers[net->n - 2].biases, 1); + net->layers[net->n - 2].n = 11921; + net->layers[net->n - 2].biases += 5; + net->layers[net->n - 2].weights += 5*c; if(weightfile){ - load_weights(&net, weightfile); + load_weights(net, weightfile); } - net.layers[net.n - 2].biases -= 5; - net.layers[net.n - 2].weights -= 5*c; - net.layers[net.n - 2].n = oldn; + net->layers[net->n - 2].biases -= 5; + net->layers[net->n - 2].weights -= 5*c; + net->layers[net->n - 2].n = oldn; printf("%d\n", oldn); - layer l = net.layers[net.n - 2]; + layer l = net->layers[net->n - 2]; copy_cpu(l.n/3, l.biases, 1, l.biases + l.n/3, 1); copy_cpu(l.n/3, l.biases, 1, l.biases + 2*l.n/3, 1); copy_cpu(l.n/3*l.c, l.weights, 1, l.weights + l.n/3*l.c, 1); copy_cpu(l.n/3*l.c, l.weights, 1, l.weights + 2*l.n/3*l.c, 1); - *net.seen = 0; + *net->seen = 0; save_weights(net, outfile); } void oneoff2(char *cfgfile, char *weightfile, char *outfile, int l) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); + network *net = parse_network_cfg(cfgfile); if(weightfile){ - load_weights_upto(&net, weightfile, 0, net.n); - load_weights_upto(&net, weightfile, l, net.n); + load_weights_upto(net, weightfile, 0, net->n); + load_weights_upto(net, weightfile, l, net->n); } - *net.seen = 0; - save_weights_upto(net, outfile, net.n); + *net->seen = 0; + save_weights_upto(net, outfile, net->n); } void partial(char *cfgfile, char *weightfile, char *outfile, int max) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights_upto(&net, weightfile, 0, max); - } - *net.seen = 0; + network *net = load_network(cfgfile, weightfile, 1); save_weights_upto(net, outfile, max); } void rescale_net(char *cfgfile, char *weightfile, char *outfile) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); int i; - for(i = 0; i < net.n; ++i){ - layer l = net.layers[i]; + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; if(l.type == CONVOLUTIONAL){ rescale_weights(l, 2, -.5); break; @@ -218,13 +206,10 @@ void rescale_net(char *cfgfile, char *weightfile, char *outfile) void rgbgr_net(char *cfgfile, char *weightfile, char *outfile) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); int i; - for(i = 0; i < net.n; ++i){ - layer l = net.layers[i]; + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; if(l.type == CONVOLUTIONAL){ rgbgr_weights(l); break; @@ -236,13 +221,10 @@ void rgbgr_net(char *cfgfile, char *weightfile, char *outfile) void reset_normalize_net(char *cfgfile, char *weightfile, char *outfile) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); - if (weightfile) { - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); int i; - for (i = 0; i < net.n; ++i) { - layer l = net.layers[i]; + for (i = 0; i < net->n; ++i) { + layer l = net->layers[i]; if (l.type == CONVOLUTIONAL && l.batch_normalize) { denormalize_convolutional_layer(l); } @@ -277,18 +259,15 @@ layer normalize_layer(layer l, int n) void normalize_net(char *cfgfile, char *weightfile, char *outfile) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); int i; - for(i = 0; i < net.n; ++i){ - layer l = net.layers[i]; + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; if(l.type == CONVOLUTIONAL && !l.batch_normalize){ - net.layers[i] = normalize_layer(l, l.n); + net->layers[i] = normalize_layer(l, l.n); } if (l.type == CONNECTED && !l.batch_normalize) { - net.layers[i] = normalize_layer(l, l.outputs); + net->layers[i] = normalize_layer(l, l.outputs); } if (l.type == GRU && l.batch_normalize) { *l.input_z_layer = normalize_layer(*l.input_z_layer, l.input_z_layer->outputs); @@ -297,7 +276,7 @@ void normalize_net(char *cfgfile, char *weightfile, char *outfile) *l.state_z_layer = normalize_layer(*l.state_z_layer, l.state_z_layer->outputs); *l.state_r_layer = normalize_layer(*l.state_r_layer, l.state_r_layer->outputs); *l.state_h_layer = normalize_layer(*l.state_h_layer, l.state_h_layer->outputs); - net.layers[i].batch_normalize=1; + net->layers[i].batch_normalize=1; } } save_weights(net, outfile); @@ -306,13 +285,10 @@ void normalize_net(char *cfgfile, char *weightfile, char *outfile) void statistics_net(char *cfgfile, char *weightfile) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); - if (weightfile) { - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); int i; - for (i = 0; i < net.n; ++i) { - layer l = net.layers[i]; + for (i = 0; i < net->n; ++i) { + layer l = net->layers[i]; if (l.type == CONNECTED && l.batch_normalize) { printf("Connected Layer %d\n", i); statistics_connected_layer(l); @@ -339,20 +315,17 @@ void statistics_net(char *cfgfile, char *weightfile) void denormalize_net(char *cfgfile, char *weightfile, char *outfile) { gpu_index = -1; - network net = parse_network_cfg(cfgfile); - if (weightfile) { - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); int i; - for (i = 0; i < net.n; ++i) { - layer l = net.layers[i]; + for (i = 0; i < net->n; ++i) { + layer l = net->layers[i]; if ((l.type == DECONVOLUTIONAL || l.type == CONVOLUTIONAL) && l.batch_normalize) { denormalize_convolutional_layer(l); - net.layers[i].batch_normalize=0; + net->layers[i].batch_normalize=0; } if (l.type == CONNECTED && l.batch_normalize) { denormalize_connected_layer(l); - net.layers[i].batch_normalize=0; + net->layers[i].batch_normalize=0; } if (l.type == GRU && l.batch_normalize) { denormalize_connected_layer(*l.input_z_layer); @@ -367,7 +340,7 @@ void denormalize_net(char *cfgfile, char *weightfile, char *outfile) l.state_z_layer->batch_normalize = 0; l.state_r_layer->batch_normalize = 0; l.state_h_layer->batch_normalize = 0; - net.layers[i].batch_normalize=0; + net->layers[i].batch_normalize=0; } } save_weights(net, outfile); @@ -375,9 +348,9 @@ void denormalize_net(char *cfgfile, char *weightfile, char *outfile) void mkimg(char *cfgfile, char *weightfile, int h, int w, int num, char *prefix) { - network net = load_network(cfgfile, weightfile, 0); - image *ims = get_weights(net.layers[0]); - int n = net.layers[0].n; + network *net = load_network(cfgfile, weightfile, 0); + image *ims = get_weights(net->layers[0]); + int n = net->layers[0].n; int z; for(z = 0; z < num; ++z){ image im = make_image(h, w, 3); @@ -401,10 +374,7 @@ void mkimg(char *cfgfile, char *weightfile, int h, int w, int num, char *prefix) void visualize(char *cfgfile, char *weightfile) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, 0); visualize_network(net); #ifdef OPENCV cvWaitKey(0); @@ -437,8 +407,6 @@ int main(int argc, char **argv) average(argc, argv); } else if (0 == strcmp(argv[1], "yolo")){ run_yolo(argc, argv); - } else if (0 == strcmp(argv[1], "voxel")){ - run_voxel(argc, argv); } else if (0 == strcmp(argv[1], "super")){ run_super(argc, argv); } else if (0 == strcmp(argv[1], "lsd")){ @@ -457,8 +425,6 @@ int main(int argc, char **argv) run_go(argc, argv); } else if (0 == strcmp(argv[1], "rnn")){ run_char_rnn(argc, argv); - } else if (0 == strcmp(argv[1], "vid")){ - run_vid_rnn(argc, argv); } else if (0 == strcmp(argv[1], "coco")){ run_coco(argc, argv); } else if (0 == strcmp(argv[1], "classify")){ @@ -473,12 +439,6 @@ int main(int argc, char **argv) run_art(argc, argv); } else if (0 == strcmp(argv[1], "tag")){ run_tag(argc, argv); - } else if (0 == strcmp(argv[1], "compare")){ - run_compare(argc, argv); - } else if (0 == strcmp(argv[1], "dice")){ - run_dice(argc, argv); - } else if (0 == strcmp(argv[1], "writing")){ - run_writing(argc, argv); } else if (0 == strcmp(argv[1], "3d")){ composite_3d(argv[2], argv[3], argv[4], (argc > 5) ? atof(argv[5]) : 0); } else if (0 == strcmp(argv[1], "test")){ diff --git a/examples/detector.c b/examples/detector.c index b414546fb01..ed6815d5d21 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -12,7 +12,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i char *base = basecfg(cfgfile); printf("%s\n", base); float avg_loss = -1; - network *nets = calloc(ngpus, sizeof(network)); + network **nets = calloc(ngpus, sizeof(network)); srand(time(0)); int seed = rand(); @@ -23,16 +23,16 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i cuda_set_device(gpus[i]); #endif nets[i] = load_network(cfgfile, weightfile, clear); - nets[i].learning_rate *= ngpus; + nets[i]->learning_rate *= ngpus; } srand(time(0)); - network net = nets[0]; + network *net = nets[0]; - int imgs = net.batch * net.subdivisions * ngpus; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + int imgs = net->batch * net->subdivisions * ngpus; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); data train, buffer; - layer l = net.layers[net.n - 1]; + layer l = net->layers[net->n - 1]; int classes = l.classes; float jitter = l.jitter; @@ -58,11 +58,11 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i double time; int count = 0; //while(i*imgs < N*120){ - while(get_current_batch(net) < net.max_batches){ + while(get_current_batch(net) < net->max_batches){ if(l.random && count++%10 == 0){ printf("Resizing\n"); int dim = (rand() % 10 + 10) * 32; - if (get_current_batch(net)+200 > net.max_batches) dim = 608; + if (get_current_batch(net)+200 > net->max_batches) dim = 608; //int dim = (rand() % 4 + 16) * 32; printf("%d\n", dim); args.w = dim; @@ -74,7 +74,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i load_thread = load_data(args); for(i = 0; i < ngpus; ++i){ - resize_network(nets + i, dim, dim); + resize_network(nets[i], dim, dim); } net = nets[0]; } @@ -94,7 +94,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i /* int zz; for(zz = 0; zz < train.X.cols; ++zz){ - image im = float_to_image(net.w, net.h, 3, train.X.vals[zz]); + image im = float_to_image(net->w, net->h, 3, train.X.vals[zz]); int k; for(k = 0; k < l.max_boxes; ++k){ box b = float_to_box(train.y.vals[zz] + k*5, 1); @@ -239,18 +239,15 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char int *map = 0; if (mapf) map = read_map(mapf); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 2); - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 2); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); srand(time(0)); list *plist = get_paths(valid_images); char **paths = (char **)list_to_array(plist); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; int classes = l.classes; char buff[1024]; @@ -299,11 +296,11 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char image *buf_resized = calloc(nthreads, sizeof(image)); pthread_t *thr = calloc(nthreads, sizeof(pthread_t)); - image input = make_image(net.w, net.h, net.c*2); + image input = make_image(net->w, net->h, net->c*2); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; //args.type = IMAGE_DATA; args.type = LETTERBOX_DATA; @@ -330,14 +327,14 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char for(t = 0; t < nthreads && i+t-nthreads < m; ++t){ char *path = paths[i+t-nthreads]; char *id = basecfg(path); - copy_cpu(net.w*net.h*net.c, val_resized[t].data, 1, input.data, 1); + copy_cpu(net->w*net->h*net->c, val_resized[t].data, 1, input.data, 1); flip_image(val_resized[t]); - copy_cpu(net.w*net.h*net.c, val_resized[t].data, 1, input.data + net.w*net.h*net.c, 1); + copy_cpu(net->w*net->h*net->c, val_resized[t].data, 1, input.data + net->w*net->h*net->c, 1); network_predict(net, input.data); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, 0, map, .5, 0); + get_region_boxes(l, w, h, net->w, net->h, thresh, probs, boxes, 0, 0, map, .5, 0); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -375,18 +372,15 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out int *map = 0; if (mapf) map = read_map(mapf); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); srand(time(0)); list *plist = get_paths(valid_images); char **paths = (char **)list_to_array(plist); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; int classes = l.classes; char buff[1024]; @@ -436,8 +430,8 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out pthread_t *thr = calloc(nthreads, sizeof(pthread_t)); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; //args.type = IMAGE_DATA; args.type = LETTERBOX_DATA; @@ -468,7 +462,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out network_predict(net, X); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, net.w, net.h, thresh, probs, boxes, 0, 0, map, .5, 0); + get_region_boxes(l, w, h, net->w, net->h, thresh, probs, boxes, 0, 0, map, .5, 0); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); if (coco){ print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); @@ -495,18 +489,15 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out void validate_detector_recall(char *cfgfile, char *weightfile) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); srand(time(0)); list *plist = get_paths("data/coco_val_5k.list"); char **paths = (char **)list_to_array(plist); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; int classes = l.classes; int j, k; @@ -529,10 +520,10 @@ void validate_detector_recall(char *cfgfile, char *weightfile) for(i = 0; i < m; ++i){ char *path = paths[i]; image orig = load_image_color(path, 0, 0); - image sized = resize_image(orig, net.w, net.h); + image sized = resize_image(orig, net->w, net->h); char *id = basecfg(path); network_predict(net, sized.data); - get_region_boxes(l, sized.w, sized.h, net.w, net.h, thresh, probs, boxes, 0, 1, 0, .5, 1); + get_region_boxes(l, sized.w, sized.h, net->w, net->h, thresh, probs, boxes, 0, 1, 0, .5, 1); if (nms) do_nms(boxes, probs, l.w*l.h*l.n, 1, nms); char labelpath[4096]; @@ -578,11 +569,8 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam char **names = get_labels(name_list); image **alphabet = load_alphabet(); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); double time; char buff[256]; @@ -600,12 +588,12 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam strtok(input, "\n"); } image im = load_image_color(input,0,0); - image sized = letterbox_image(im, net.w, net.h); - //image sized = resize_image(im, net.w, net.h); - //image sized2 = resize_max(im, net.w); - //image sized = crop_image(sized2, -((net.w - sized2.w)/2), -((net.h - sized2.h)/2), net.w, net.h); - //resize_network(&net, sized.w, sized.h); - layer l = net.layers[net.n-1]; + image sized = letterbox_image(im, net->w, net->h); + //image sized = resize_image(im, net->w, net->h); + //image sized2 = resize_max(im, net->w); + //image sized = crop_image(sized2, -((net->w - sized2.w)/2), -((net->h - sized2.h)/2), net->w, net->h); + //resize_network(net, sized.w, sized.h); + layer l = net->layers[net->n-1]; box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); @@ -620,7 +608,7 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam time=what_time_is_it_now(); network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time); - get_region_boxes(l, im.w, im.h, net.w, net.h, thresh, probs, boxes, masks, 0, 0, hier_thresh, 1); + get_region_boxes(l, im.w, im.h, net->w, net->h, thresh, probs, boxes, masks, 0, 0, hier_thresh, 1); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); //else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, masks, names, alphabet, l.classes); diff --git a/examples/go.c b/examples/go.c index 7f4a250d0ac..f99eebb58b9 100644 --- a/examples/go.c +++ b/examples/go.c @@ -124,7 +124,7 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng char *base = basecfg(cfgfile); printf("%s\n", base); printf("%d\n", ngpus); - network *nets = calloc(ngpus, sizeof(network)); + network **nets = calloc(ngpus, sizeof(network*)); srand(time(0)); int seed = rand(); @@ -134,10 +134,10 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng cuda_set_device(gpus[i]); #endif nets[i] = load_network(cfgfile, weightfile, clear); - nets[i].learning_rate *= ngpus; + nets[i]->learning_rate *= ngpus; } - network net = nets[0]; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = nets[0]; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); char *backup_directory = "/home/pjreddie/backup/"; @@ -147,11 +147,11 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng int N = m.n; printf("Moves: %d\n", N); - int epoch = (*net.seen)/N; - while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + int epoch = (*net->seen)/N; + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ clock_t time=clock(); - data train = random_go_moves(m, net.batch*net.subdivisions*ngpus); + data train = random_go_moves(m, net->batch*net->subdivisions*ngpus); printf("Loaded: %lf seconds\n", sec(clock()-time)); time=clock(); @@ -169,9 +169,9 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.95 + loss*.05; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); - if(*net.seen/N > epoch){ - epoch = *net.seen/N; + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen); + if(*net->seen/N > epoch){ + epoch = *net->seen/N; char buff[256]; sprintf(buff, "%s/%s_%d.weights", backup_directory,base, epoch); save_weights(net, buff); @@ -281,7 +281,7 @@ void flip_board(float *board) } } -void predict_move(network net, float *board, float *move, int multi) +void predict_move(network *net, float *board, float *move, int multi) { float *output = network_predict(net, board); copy_cpu(19*19+1, output, 1, move, 1); @@ -370,7 +370,7 @@ int legal_go(float *b, char *ko, int p, int r, int c) return 1; } -int generate_move(network net, int player, float *board, int multi, float thresh, float temp, char *ko, int print) +int generate_move(network *net, int player, float *board, int multi, float thresh, float temp, char *ko, int print) { int i, j; int empty = 1; @@ -383,7 +383,7 @@ int generate_move(network net, int player, float *board, int multi, float thresh if(empty) { return 72; } - for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp; + for(i = 0; i < net->n; ++i) net->layers[i].temperature = temp; float move[362]; if (player < 0) flip_board(board); @@ -439,12 +439,9 @@ void valid_go(char *cfgfile, char *weightfile, int multi, char *filename) srand(time(0)); char *base = basecfg(cfgfile); printf("%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); float *board = calloc(19*19, sizeof(float)); float *move = calloc(19*19+1, sizeof(float)); @@ -486,12 +483,9 @@ int print_game(float *board, FILE *fp) void engine_go(char *filename, char *weightfile, int multi) { - network net = parse_network_cfg(filename); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); srand(time(0)); - set_batch_network(&net, 1); float *board = calloc(19*19, sizeof(float)); char *one = calloc(91, sizeof(char)); char *two = calloc(91, sizeof(char)); @@ -679,12 +673,9 @@ void engine_go(char *filename, char *weightfile, int multi) void test_go(char *cfg, char *weights, int multi) { - network net = parse_network_cfg(cfg); - if(weights){ - load_weights(&net, weights); - } + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); srand(time(0)); - set_batch_network(&net, 1); float *board = calloc(19*19, sizeof(float)); float *move = calloc(19*19+1, sizeof(float)); int color = 1; @@ -785,23 +776,24 @@ float score_game(float *board) void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) { - network net = parse_network_cfg(filename); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); - network net2 = net; - if(f2){ + network *net2; + if (f2) { net2 = parse_network_cfg(f2); if(w2){ - load_weights(&net2, w2); + load_weights(net2, w2); } + } else { + net2 = calloc(1, sizeof(network)); + *net2 = *net; } srand(time(0)); char boards[600][93]; int count = 0; - set_batch_network(&net, 1); - set_batch_network(&net2, 1); + set_batch_network(net, 1); + set_batch_network(net2, 1); float *board = calloc(19*19, sizeof(float)); char *one = calloc(91, sizeof(char)); char *two = calloc(91, sizeof(char)); @@ -819,15 +811,15 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) fprintf(stderr, "Total: %d, Player 1: %f, Player 2: %f\n", total, (float)p1/total, (float)p2/total); sleep(1); /* - int i = (score > 0)? 0 : 1; - int j; - for(; i < count; i += 2){ - for(j = 0; j < 93; ++j){ - printf("%c", boards[i][j]); - } - printf("\n"); - } - */ + int i = (score > 0)? 0 : 1; + int j; + for(; i < count; i += 2){ + for(j = 0; j < 93; ++j){ + printf("%c", boards[i][j]); + } + printf("\n"); + } + */ memset(board, 0, 19*19*sizeof(float)); player = 1; done = 0; @@ -837,7 +829,7 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) } print_board(stderr, board, 1, 0); //sleep(1); - network use = ((total%2==0) == (player==1)) ? net : net2; + network *use = ((total%2==0) == (player==1)) ? net : net2; int index = generate_move(use, player, board, multi, .4, 1, two, 0); if(index < 0){ done = 1; diff --git a/examples/lsd.c b/examples/lsd.c index 8f5a1a1c13b..c5977483684 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -16,9 +16,9 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg char *gbase = basecfg(gcfg); char *abase = basecfg(acfg); - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet.learning_rate, gnet.momentum, gnet.decay); - int imgs = gnet.batch*gnet.subdivisions; - int i = *gnet.seen/imgs; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay); + int imgs = gnet->batch*gnet->subdivisions; + int i = *gnet->seen/imgs; data train, tbuffer; data style, sbuffer; @@ -55,27 +55,27 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg float aloss_avg = -1; float floss_avg = -1; - fnet.train=1; - int x_size = fnet.inputs*fnet.batch; - int y_size = fnet.truths*fnet.batch; + fnet->train=1; + int x_size = fnet->inputs*fnet->batch; + int y_size = fnet->truths*fnet->batch; float *X = calloc(x_size, sizeof(float)); float *y = calloc(y_size, sizeof(float)); - int ax_size = anet.inputs*anet.batch; - int ay_size = anet.truths*anet.batch; - fill_gpu(ay_size, .9, anet.truth_gpu, 1); - anet.delta_gpu = cuda_make_array(0, ax_size); - anet.train = 1; + int ax_size = anet->inputs*anet->batch; + int ay_size = anet->truths*anet->batch; + fill_gpu(ay_size, .9, anet->truth_gpu, 1); + anet->delta_gpu = cuda_make_array(0, ax_size); + anet->train = 1; - int gx_size = gnet.inputs*gnet.batch; - int gy_size = gnet.truths*gnet.batch; + int gx_size = gnet->inputs*gnet->batch; + int gy_size = gnet->truths*gnet->batch; gstate.input = cuda_make_array(0, gx_size); gstate.truth = 0; gstate.delta = 0; gstate.train = 1; - while (get_current_batch(gnet) < gnet.max_batches) { + while (get_current_batch(gnet) < gnet->max_batches) { i += 1; time=clock(); pthread_join(tload_thread, 0); @@ -92,20 +92,20 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg int j, k; float floss = 0; - for(j = 0; j < fnet.subdivisions; ++j){ - layer imlayer = gnet.layers[gnet.n - 1]; - get_next_batch(train, fnet.batch, j*fnet.batch, X, y); + for(j = 0; j < fnet->subdivisions; ++j){ + layer imlayer = gnet->layers[gnet->n - 1]; + get_next_batch(train, fnet->batch, j*fnet->batch, X, y); cuda_push_array(fstate.input, X, x_size); cuda_push_array(gstate.input, X, gx_size); - *gnet.seen += gnet.batch; + *gnet->seen += gnet->batch; forward_network_gpu(fnet, fstate); - float *feats = fnet.layers[fnet.n - 2].output_gpu; + float *feats = fnet->layers[fnet->n - 2].output_gpu; copy_gpu(y_size, feats, 1, fstate.truth, 1); forward_network_gpu(gnet, gstate); - float *gen = gnet.layers[gnet.n-1].output_gpu; + float *gen = gnet->layers[gnet->n-1].output_gpu; copy_gpu(x_size, gen, 1, fstate.input, 1); fill_gpu(x_size, 0, fstate.delta, 1); @@ -135,11 +135,11 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg backward_network_gpu(gnet, gstate); - floss += get_network_cost(fnet) /(fnet.subdivisions*fnet.batch); + floss += get_network_cost(fnet) /(fnet->subdivisions*fnet->batch); cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); - for(k = 0; k < gnet.batch; ++k){ - int index = j*gnet.batch + k; + for(k = 0; k < gnet->batch; ++k){ + int index = j*gnet->batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); generated.y.vals[index][0] = .1; style.y.vals[index][0] = .9; @@ -148,7 +148,7 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg */ /* - image sim = float_to_image(anet.w, anet.h, anet.c, style.X.vals[j]); + image sim = float_to_image(anet->w, anet->h, anet->c, style.X.vals[j]); show_image(sim, "style"); cvWaitKey(0); */ @@ -208,16 +208,16 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear int i, j, k; layer imlayer = {0}; - for (i = 0; i < net.n; ++i) { - if (net.layers[i].out_c == 3) { - imlayer = net.layers[i]; + for (i = 0; i < net->n; ++i) { + if (net->layers[i].out_c == 3) { + imlayer = net->layers[i]; break; } } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - int imgs = net.batch*net.subdivisions; - i = *net.seen/imgs; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + int imgs = net->batch*net->subdivisions; + i = *net->seen/imgs; data train, buffer; @@ -226,21 +226,21 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear char **paths = (char **)list_to_array(plist); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.paths = paths; args.n = imgs; args.m = plist->size; args.d = &buffer; - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - args.size = net.w; + args.min = net->min_crop; + args.max = net->max_crop; + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; + args.size = net->w; args.type = CLASSIFICATION_DATA; args.classes = 1; char *ls[1] = {"coco"}; @@ -252,7 +252,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear network_state gstate = {0}; gstate.index = 0; gstate.net = net; - int x_size = get_network_input_size(net)*net.batch; + int x_size = get_network_input_size(net)*net->batch; int y_size = x_size; gstate.input = cuda_make_array(0, x_size); gstate.truth = cuda_make_array(0, y_size); @@ -265,7 +265,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear network_state astate = {0}; astate.index = 0; astate.net = anet; - int ay_size = get_network_output_size(anet)*anet.batch; + int ay_size = get_network_output_size(anet)*anet->batch; astate.input = 0; astate.truth = 0; astate.delta = 0; @@ -280,7 +280,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear //data generated = copy_data(train); - while (get_current_batch(net) < net.max_batches) { + while (get_current_batch(net) < net->max_batches) { i += 1; time=clock(); pthread_join(load_thread, 0); @@ -291,31 +291,31 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear data gray = copy_data(train); for(j = 0; j < imgs; ++j){ - image gim = float_to_image(net.w, net.h, net.c, gray.X.vals[j]); + image gim = float_to_image(net->w, net->h, net->c, gray.X.vals[j]); grayscale_image_3c(gim); train.y.vals[j][0] = .9; - image yim = float_to_image(net.w, net.h, net.c, train.X.vals[j]); + image yim = float_to_image(net->w, net->h, net->c, train.X.vals[j]); //rgb_to_yuv(yim); } time=clock(); float gloss = 0; - for(j = 0; j < net.subdivisions; ++j){ - get_next_batch(train, net.batch, j*net.batch, pixs, y); - get_next_batch(gray, net.batch, j*net.batch, graypixs, y); + for(j = 0; j < net->subdivisions; ++j){ + get_next_batch(train, net->batch, j*net->batch, pixs, y); + get_next_batch(gray, net->batch, j*net->batch, graypixs, y); cuda_push_array(gstate.input, graypixs, x_size); cuda_push_array(gstate.truth, pixs, y_size); */ /* - image origi = float_to_image(net.w, net.h, 3, pixs); - image grayi = float_to_image(net.w, net.h, 3, graypixs); + image origi = float_to_image(net->w, net->h, 3, pixs); + image grayi = float_to_image(net->w, net->h, 3, graypixs); show_image(grayi, "gray"); show_image(origi, "orig"); cvWaitKey(0); */ /* - *net.seen += net.batch; + *net->seen += net->batch; forward_network_gpu(net, gstate); fill_gpu(imlayer.outputs, 0, imerror, 1); @@ -325,22 +325,22 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear forward_network_gpu(anet, astate); backward_network_gpu(anet, astate); - scal_gpu(imlayer.outputs, .1, net.layers[net.n-1].delta_gpu, 1); + scal_gpu(imlayer.outputs, .1, net->layers[net->n-1].delta_gpu, 1); backward_network_gpu(net, gstate); scal_gpu(imlayer.outputs, 1000, imerror, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); - printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs)); + printf("features %f\n", cuda_mag_array(net->layers[net->n-1].delta_gpu, imlayer.outputs)); axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); - gloss += get_network_cost(net) /(net.subdivisions*net.batch); + gloss += get_network_cost(net) /(net->subdivisions*net->batch); cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); - for(k = 0; k < net.batch; ++k){ - int index = j*net.batch + k; + for(k = 0; k < net->batch; ++k){ + int index = j*net->batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1); gray.y.vals[index][0] = .1; } @@ -385,11 +385,8 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear void test_dcgan(char *cfgfile, char *weightfile) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); clock_t time; @@ -397,8 +394,8 @@ void test_dcgan(char *cfgfile, char *weightfile) char *input = buff; int i, imlayer = 0; - for (i = 0; i < net.n; ++i) { - if (net.layers[i].out_c == 3) { + for (i = 0; i < net->n; ++i) { + if (net->layers[i].out_c == 3) { imlayer = i; printf("%d\n", i); break; @@ -406,7 +403,7 @@ void test_dcgan(char *cfgfile, char *weightfile) } while(1){ - image im = make_image(net.w, net.h, net.c); + image im = make_image(net->w, net->h, net->c); int i; for(i = 0; i < im.w*im.h*im.c; ++i){ im.data[i] = rand_normal(); @@ -449,23 +446,23 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, char *base = basecfg(cfg); char *abase = basecfg(acfg); printf("%s\n", base); - network gnet = load_network(cfg, weight, clear); - network anet = load_network(acfg, aweight, clear); - //float orig_rate = anet.learning_rate; + network *gnet = load_network(cfg, weight, clear); + network *anet = load_network(acfg, aweight, clear); + //float orig_rate = anet->learning_rate; int start = 0; int i, j, k; layer imlayer = {0}; - for (i = 0; i < gnet.n; ++i) { - if (gnet.layers[i].out_c == 3) { - imlayer = gnet.layers[i]; + for (i = 0; i < gnet->n; ++i) { + if (gnet->layers[i].out_c == 3) { + imlayer = gnet->layers[i]; break; } } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet.learning_rate, gnet.momentum, gnet.decay); - int imgs = gnet.batch*gnet.subdivisions; - i = *gnet.seen/imgs; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay); + int imgs = gnet->batch*gnet->subdivisions; + i = *gnet->seen/imgs; data train, buffer; @@ -487,20 +484,20 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, pthread_t load_thread = load_data_in_thread(args); clock_t time; - gnet.train = 1; - anet.train = 1; + gnet->train = 1; + anet->train = 1; - int x_size = gnet.inputs*gnet.batch; - int y_size = gnet.truths*gnet.batch; + int x_size = gnet->inputs*gnet->batch; + int y_size = gnet->truths*gnet->batch; float *imerror = cuda_make_array(0, y_size); - //int ay_size = anet.truths*anet.batch; + //int ay_size = anet->truths*anet->batch; float aloss_avg = -1; //data generated = copy_data(train); - while (get_current_batch(gnet) < gnet.max_batches) { + while (get_current_batch(gnet) < gnet->max_batches) { start += 1; i += 1; time=clock(); @@ -521,41 +518,41 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, } time=clock(); - for(j = 0; j < gnet.subdivisions; ++j){ - get_next_batch(train, gnet.batch, j*gnet.batch, gnet.truth, 0); + for(j = 0; j < gnet->subdivisions; ++j){ + get_next_batch(train, gnet->batch, j*gnet->batch, gnet->truth, 0); int z; for(z = 0; z < x_size; ++z){ - gnet.input[z] = rand_normal(); + gnet->input[z] = rand_normal(); } - cuda_push_array(gnet.input_gpu, gnet.input, x_size); - cuda_push_array(gnet.truth_gpu, gnet.truth, y_size); - *gnet.seen += gnet.batch; + cuda_push_array(gnet->input_gpu, gnet->input, x_size); + cuda_push_array(gnet->truth_gpu, gnet->truth, y_size); + *gnet->seen += gnet->batch; forward_network_gpu(gnet); fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); - fill_gpu(anet.truths*anet.batch, .95, anet.truth_gpu, 1); - copy_gpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1); - anet.delta_gpu = imerror; + fill_gpu(anet->truths*anet->batch, .95, anet->truth_gpu, 1); + copy_gpu(anet->inputs*anet->batch, imlayer.output_gpu, 1, anet->input_gpu, 1); + anet->delta_gpu = imerror; forward_network_gpu(anet); backward_network_gpu(anet); - float genaloss = *anet.cost / anet.batch; + float genaloss = *anet->cost / anet->batch; printf("%f\n", genaloss); scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); - scal_gpu(imlayer.outputs*imlayer.batch, .00, gnet.layers[gnet.n-1].delta_gpu, 1); + scal_gpu(imlayer.outputs*imlayer.batch, .00, gnet->layers[gnet->n-1].delta_gpu, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); - printf("features %f\n", cuda_mag_array(gnet.layers[gnet.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); + printf("features %f\n", cuda_mag_array(gnet->layers[gnet->n-1].delta_gpu, imlayer.outputs*imlayer.batch)); - axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet.layers[gnet.n-1].delta_gpu, 1); + axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet->layers[gnet->n-1].delta_gpu, 1); backward_network_gpu(gnet); - for(k = 0; k < gnet.batch; ++k){ - int index = j*gnet.batch + k; - copy_cpu(gnet.outputs, gnet.output + k*gnet.outputs, 1, gen.X.vals[index], 1); + for(k = 0; k < gnet->batch; ++k){ + int index = j*gnet->batch + k; + copy_cpu(gnet->outputs, gnet->output + k*gnet->outputs, 1, gen.X.vals[index], 1); } } harmless_update_network_gpu(anet); @@ -570,8 +567,8 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, //scale_image(im2, .5); #ifdef OPENCV if(display){ - image im = float_to_image(anet.w, anet.h, anet.c, gen.X.vals[0]); - image im2 = float_to_image(anet.w, anet.h, anet.c, train.X.vals[0]); + image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]); + image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); show_image(im, "gen"); show_image(im2, "train"); cvWaitKey(50); @@ -580,9 +577,9 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, /* if(aloss < .1){ - anet.learning_rate = 0; + anet->learning_rate = 0; } else if (aloss > .3){ - anet.learning_rate = orig_rate; + anet->learning_rate = orig_rate; } */ @@ -627,21 +624,21 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle char *base = basecfg(cfg); char *abase = basecfg(acfg); printf("%s\n", base); - network net = load_network(cfg, weight, clear); - network anet = load_network(acfg, aweight, clear); + network *net = load_network(cfg, weight, clear); + network *anet = load_network(acfg, aweight, clear); int i, j, k; layer imlayer = {0}; - for (i = 0; i < net.n; ++i) { - if (net.layers[i].out_c == 3) { - imlayer = net.layers[i]; + for (i = 0; i < net->n; ++i) { + if (net->layers[i].out_c == 3) { + imlayer = net->layers[i]; break; } } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - int imgs = net.batch*net.subdivisions; - i = *net.seen/imgs; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + int imgs = net->batch*net->subdivisions; + i = *net->seen/imgs; data train, buffer; @@ -663,17 +660,17 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle pthread_t load_thread = load_data_in_thread(args); clock_t time; - int x_size = net.inputs*net.batch; + int x_size = net->inputs*net->batch; //int y_size = x_size; - net.delta = 0; - net.train = 1; + net->delta = 0; + net->train = 1; float *pixs = calloc(x_size, sizeof(float)); float *graypixs = calloc(x_size, sizeof(float)); //float *y = calloc(y_size, sizeof(float)); - //int ay_size = anet.outputs*anet.batch; - anet.delta = 0; - anet.train = 1; + //int ay_size = anet->outputs*anet->batch; + anet->delta = 0; + anet->train = 1; float *imerror = cuda_make_array(0, imlayer.outputs*imlayer.batch); @@ -682,7 +679,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle //data generated = copy_data(train); - while (get_current_batch(net) < net.max_batches) { + while (get_current_batch(net) < net->max_batches) { i += 1; time=clock(); pthread_join(load_thread, 0); @@ -693,7 +690,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle data gray = copy_data(train); for(j = 0; j < imgs; ++j){ - image gim = float_to_image(net.w, net.h, net.c, gray.X.vals[j]); + image gim = float_to_image(net->w, net->h, net->c, gray.X.vals[j]); grayscale_image_3c(gim); train.y.vals[j][0] = .95; gray.y.vals[j][0] = .05; @@ -701,44 +698,44 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle time=clock(); float gloss = 0; - for(j = 0; j < net.subdivisions; ++j){ - get_next_batch(train, net.batch, j*net.batch, pixs, 0); - get_next_batch(gray, net.batch, j*net.batch, graypixs, 0); - cuda_push_array(net.input_gpu, graypixs, net.inputs*net.batch); - cuda_push_array(net.truth_gpu, pixs, net.truths*net.batch); + for(j = 0; j < net->subdivisions; ++j){ + get_next_batch(train, net->batch, j*net->batch, pixs, 0); + get_next_batch(gray, net->batch, j*net->batch, graypixs, 0); + cuda_push_array(net->input_gpu, graypixs, net->inputs*net->batch); + cuda_push_array(net->truth_gpu, pixs, net->truths*net->batch); /* - image origi = float_to_image(net.w, net.h, 3, pixs); - image grayi = float_to_image(net.w, net.h, 3, graypixs); + image origi = float_to_image(net->w, net->h, 3, pixs); + image grayi = float_to_image(net->w, net->h, 3, graypixs); show_image(grayi, "gray"); show_image(origi, "orig"); cvWaitKey(0); */ - *net.seen += net.batch; + *net->seen += net->batch; forward_network_gpu(net); fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); - copy_gpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1); - fill_gpu(anet.inputs*anet.batch, .95, anet.truth_gpu, 1); - anet.delta_gpu = imerror; + copy_gpu(anet->inputs*anet->batch, imlayer.output_gpu, 1, anet->input_gpu, 1); + fill_gpu(anet->inputs*anet->batch, .95, anet->truth_gpu, 1); + anet->delta_gpu = imerror; forward_network_gpu(anet); backward_network_gpu(anet); - scal_gpu(imlayer.outputs*imlayer.batch, 1./100., net.layers[net.n-1].delta_gpu, 1); + scal_gpu(imlayer.outputs*imlayer.batch, 1./100., net->layers[net->n-1].delta_gpu, 1); scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); - printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs*imlayer.batch)); + printf("features %f\n", cuda_mag_array(net->layers[net->n-1].delta_gpu, imlayer.outputs*imlayer.batch)); - axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1); + axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net->layers[net->n-1].delta_gpu, 1); backward_network_gpu(net); - gloss += *net.cost /(net.subdivisions*net.batch); + gloss += *net->cost /(net->subdivisions*net->batch); - for(k = 0; k < net.batch; ++k){ - int index = j*net.batch + k; + for(k = 0; k < net->batch; ++k){ + int index = j*net->batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1); } } @@ -752,8 +749,8 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle #ifdef OPENCV if(display){ - image im = float_to_image(anet.w, anet.h, anet.c, gray.X.vals[0]); - image im2 = float_to_image(anet.w, anet.h, anet.c, train.X.vals[0]); + image im = float_to_image(anet->w, anet->h, anet->c, gray.X.vals[0]); + image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); show_image(im, "gen"); show_image(im2, "train"); cvWaitKey(50); @@ -801,27 +798,27 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi if(weightfile){ load_weights(&net, weightfile); } - if(clear) *net.seen = 0; + if(clear) *net->seen = 0; char *abase = basecfg(acfgfile); network anet = parse_network_cfg(acfgfile); if(aweightfile){ load_weights(&anet, aweightfile); } - if(clear) *anet.seen = 0; + if(clear) *anet->seen = 0; int i, j, k; layer imlayer = {0}; - for (i = 0; i < net.n; ++i) { - if (net.layers[i].out_c == 3) { - imlayer = net.layers[i]; + for (i = 0; i < net->n; ++i) { + if (net->layers[i].out_c == 3) { + imlayer = net->layers[i]; break; } } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - int imgs = net.batch*net.subdivisions; - i = *net.seen/imgs; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + int imgs = net->batch*net->subdivisions; + i = *net->seen/imgs; data train, buffer; @@ -830,21 +827,21 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi char **paths = (char **)list_to_array(plist); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.paths = paths; args.n = imgs; args.m = plist->size; args.d = &buffer; - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - args.size = net.w; + args.min = net->min_crop; + args.max = net->max_crop; + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; + args.size = net->w; args.type = CLASSIFICATION_DATA; args.classes = 1; char *ls[1] = {"coco"}; @@ -856,8 +853,8 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi network_state gstate = {0}; gstate.index = 0; gstate.net = net; - int x_size = get_network_input_size(net)*net.batch; - int y_size = 1*net.batch; + int x_size = get_network_input_size(net)*net->batch; + int y_size = 1*net->batch; gstate.input = cuda_make_array(0, x_size); gstate.truth = 0; gstate.delta = 0; @@ -868,7 +865,7 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi network_state astate = {0}; astate.index = 0; astate.net = anet; - int ay_size = get_network_output_size(anet)*anet.batch; + int ay_size = get_network_output_size(anet)*anet->batch; astate.input = 0; astate.truth = 0; astate.delta = 0; @@ -883,7 +880,7 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi //data generated = copy_data(train); - while (get_current_batch(net) < net.max_batches) { + while (get_current_batch(net) < net->max_batches) { i += 1; time=clock(); pthread_join(load_thread, 0); @@ -896,10 +893,10 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi time=clock(); float gloss = 0; - for(j = 0; j < net.subdivisions; ++j){ - get_next_batch(train, net.batch, j*net.batch, X, y); + for(j = 0; j < net->subdivisions; ++j){ + get_next_batch(train, net->batch, j*net->batch, X, y); cuda_push_array(gstate.input, X, x_size); - *net.seen += net.batch; + *net->seen += net->batch; forward_network_gpu(net, gstate); fill_gpu(imlayer.outputs, 0, imerror, 1); @@ -917,11 +914,11 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi printf("features %f\n", cuda_mag_array(imlayer.delta_gpu, imlayer.outputs)); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); - gloss += get_network_cost(net) /(net.subdivisions*net.batch); + gloss += get_network_cost(net) /(net->subdivisions*net->batch); cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); - for(k = 0; k < net.batch; ++k){ - int index = j*net.batch + k; + for(k = 0; k < net->batch; ++k){ + int index = j*net->batch + k; copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); generated.y.vals[index][0] = 0; } @@ -977,10 +974,10 @@ void train_lsd(char *cfgfile, char *weightfile, int clear) if(weightfile){ load_weights(&net, weightfile); } - if(clear) *net.seen = 0; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - int imgs = net.batch*net.subdivisions; - int i = *net.seen/imgs; + if(clear) *net->seen = 0; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + int imgs = net->batch*net->subdivisions; + int i = *net->seen/imgs; data train, buffer; @@ -989,21 +986,21 @@ void train_lsd(char *cfgfile, char *weightfile, int clear) char **paths = (char **)list_to_array(plist); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.paths = paths; args.n = imgs; args.m = plist->size; args.d = &buffer; - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - args.size = net.w; + args.min = net->min_crop; + args.max = net->max_crop; + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; + args.size = net->w; args.type = CLASSIFICATION_DATA; args.classes = 1; char *ls[1] = {"coco"}; @@ -1012,7 +1009,7 @@ void train_lsd(char *cfgfile, char *weightfile, int clear) pthread_t load_thread = load_data_in_thread(args); clock_t time; //while(i*imgs < N*120){ - while(get_current_batch(net) < net.max_batches){ + while(get_current_batch(net) < net->max_batches){ i += 1; time=clock(); pthread_join(load_thread, 0); @@ -1045,13 +1042,10 @@ void train_lsd(char *cfgfile, char *weightfile, int clear) } */ -void test_lsd(char *cfgfile, char *weightfile, char *filename, int gray) +void test_lsd(char *cfg, char *weights, char *filename, int gray) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); srand(2222222); clock_t time; @@ -1059,8 +1053,8 @@ void test_lsd(char *cfgfile, char *weightfile, char *filename, int gray) char *input = buff; int i, imlayer = 0; - for (i = 0; i < net.n; ++i) { - if (net.layers[i].out_c == 3) { + for (i = 0; i < net->n; ++i) { + if (net->layers[i].out_c == 3) { imlayer = i; printf("%d\n", i); break; @@ -1078,8 +1072,8 @@ void test_lsd(char *cfgfile, char *weightfile, char *filename, int gray) strtok(input, "\n"); } image im = load_image_color(input, 0, 0); - image resized = resize_min(im, net.w); - image crop = crop_image(resized, (resized.w - net.w)/2, (resized.h - net.h)/2, net.w, net.h); + image resized = resize_min(im, net->w); + image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h); if(gray) grayscale_image_3c(crop); float *X = crop.data; diff --git a/examples/nightmare.c b/examples/nightmare.c index 6763f116759..572396feb36 100644 --- a/examples/nightmare.c +++ b/examples/nightmare.c @@ -49,14 +49,14 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa net->delta_gpu = cuda_make_array(delta.data, im.w*im.h*im.c); cuda_push_array(net->input_gpu, im.data, net->inputs); - forward_network_gpu(*net); + forward_network_gpu(net); copy_gpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1); cuda_pull_array(last.delta_gpu, last.delta, last.outputs); calculate_loss(last.delta, last.delta, last.outputs, thresh); cuda_push_array(last.delta_gpu, last.delta, last.outputs); - backward_network_gpu(*net); + backward_network_gpu(net); cuda_pull_array(net->delta_gpu, delta.data, im.w*im.h*im.c); cuda_free(net->delta_gpu); @@ -64,10 +64,10 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa #else net->input = im.data; net->delta = delta.data; - forward_network(*net); + forward_network(net); copy_cpu(last.outputs, last.output, 1, last.delta, 1); calculate_loss(last.output, last.delta, last.outputs, thresh); - backward_network(*net); + backward_network(net); #endif if(flip) flip_image(delta); @@ -127,7 +127,7 @@ void smooth(image recon, image update, float lambda, int num) } } -void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters) +void reconstruct_picture(network *net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters) { int iter = 0; for (iter = 0; iter < iters; ++iter) { @@ -135,22 +135,22 @@ void reconstruct_picture(network net, float *features, image recon, image update #ifdef GPU layer l = get_network_output_layer(net); - cuda_push_array(net.input_gpu, recon.data, recon.w*recon.h*recon.c); - //cuda_push_array(net.truth_gpu, features, net.truths); - net.delta_gpu = cuda_make_array(delta.data, delta.w*delta.h*delta.c); + cuda_push_array(net->input_gpu, recon.data, recon.w*recon.h*recon.c); + //cuda_push_array(net->truth_gpu, features, net->truths); + net->delta_gpu = cuda_make_array(delta.data, delta.w*delta.h*delta.c); forward_network_gpu(net); cuda_push_array(l.delta_gpu, features, l.outputs); axpy_gpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1); backward_network_gpu(net); - cuda_pull_array(net.delta_gpu, delta.data, delta.w*delta.h*delta.c); + cuda_pull_array(net->delta_gpu, delta.data, delta.w*delta.h*delta.c); - cuda_free(net.delta_gpu); + cuda_free(net->delta_gpu); #else - net.input = recon.data; - net.delta = delta.data; - net.truth = features; + net->input = recon.data; + net->delta = delta.data; + net->truth = features; forward_network(net); backward_network(net); @@ -206,7 +206,7 @@ void run_lsd(int argc, char **argv) float *features = 0; image update; if (reconstruct){ - im = letterbox_image(im, net.w, net.h); + im = letterbox_image(im, net->w, net->h); int zz = 0; network_predict(net, im.data); @@ -308,12 +308,12 @@ void run_nightmare(int argc, char **argv) int reconstruct = find_arg(argc, argv, "-reconstruct"); int smooth_size = find_int_arg(argc, argv, "-smooth", 1); - network net = parse_network_cfg(cfg); - load_weights(&net, weights); + network *net = parse_network_cfg(cfg); + load_weights(net, weights); char *cfgbase = basecfg(cfg); char *imbase = basecfg(input); - set_batch_network(&net, 1); + set_batch_network(net, 1); image im = load_image_color(input, 0, 0); if(0){ float scale = 1; @@ -325,19 +325,19 @@ void run_nightmare(int argc, char **argv) free_image(im); im = resized; } - //im = letterbox_image(im, net.w, net.h); + //im = letterbox_image(im, net->w, net->h); float *features = 0; image update; if (reconstruct){ - net.n = max_layer; - im = letterbox_image(im, net.w, net.h); + net->n = max_layer; + im = letterbox_image(im, net->w, net->h); //resize_network(&net, im.w, im.h); network_predict(net, im.data); - if(net.layers[net.n-1].type == REGION){ + if(net->layers[net->n-1].type == REGION){ printf("region!\n"); - zero_objectness(net.layers[net.n-1]); + zero_objectness(net->layers[net->n-1]); } image out_im = copy_image(get_network_image(net)); /* @@ -379,7 +379,7 @@ void run_nightmare(int argc, char **argv) }else{ int layer = max_layer + rand()%range - range/2; int octave = rand()%octaves; - optimize_picture(&net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm); + optimize_picture(net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm); } } fprintf(stderr, "done\n"); diff --git a/examples/regressor.c b/examples/regressor.c index b246d48bec8..00c55aae506 100644 --- a/examples/regressor.c +++ b/examples/regressor.c @@ -10,7 +10,7 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, char *base = basecfg(cfgfile); printf("%s\n", base); printf("%d\n", ngpus); - network *nets = calloc(ngpus, sizeof(network)); + network **nets = calloc(ngpus, sizeof(network*)); srand(time(0)); int seed = rand(); @@ -19,19 +19,15 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #ifdef GPU cuda_set_device(gpus[i]); #endif - nets[i] = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&nets[i], weightfile); - } - if(clear) *nets[i].seen = 0; - nets[i].learning_rate *= ngpus; + nets[i] = load_network(cfgfile, weightfile, clear); + nets[i]->learning_rate *= ngpus; } srand(time(0)); - network net = nets[0]; + network *net = nets[0]; - int imgs = net.batch * net.subdivisions * ngpus; + int imgs = net->batch * net->subdivisions * ngpus; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); list *options = read_data_cfg(datacfg); char *backup_directory = option_find_str(options, "backup", "/backup/"); @@ -44,18 +40,18 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, clock_t time; load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.threads = 32; - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - args.size = net.w; + args.min = net->min_crop; + args.max = net->max_crop; + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; + args.size = net->w; args.paths = paths; args.n = imgs; @@ -68,8 +64,8 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, args.d = &buffer; load_thread = load_data(args); - int epoch = (*net.seen)/N; - while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + int epoch = (*net->seen)/N; + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ time=clock(); pthread_join(load_thread, 0); @@ -91,10 +87,10 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #endif if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen); free_data(train); - if(*net.seen/N > epoch){ - epoch = *net.seen/N; + if(*net->seen/N > epoch){ + epoch = *net->seen/N; char buff[256]; sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); save_weights(net, buff); @@ -117,11 +113,8 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, void predict_regressor(char *cfgfile, char *weightfile, char *filename) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); clock_t time; @@ -138,7 +131,7 @@ void predict_regressor(char *cfgfile, char *weightfile, char *filename) strtok(input, "\n"); } image im = load_image_color(input, 0, 0); - image sized = letterbox_image(im, net.w, net.h); + image sized = letterbox_image(im, net->w, net->h); float *X = sized.data; time=clock(); @@ -156,11 +149,8 @@ void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_inde { #ifdef OPENCV printf("Regressor Demo\n"); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); CvCapture * cap; @@ -181,7 +171,7 @@ void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_inde gettimeofday(&tval_before, NULL); image in = get_image_from_stream(cap); - image in_s = letterbox_image(in, net.w, net.h); + image in_s = letterbox_image(in, net->w, net->h); show_image(in, "Regressor"); float *predictions = network_predict(net, in_s.data); diff --git a/examples/rnn.c b/examples/rnn.c index 994efb3d025..489e9829f06 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -171,17 +171,14 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, char *base = basecfg(cfgfile); fprintf(stderr, "%s\n", base); float avg_loss = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } + network *net = load_network(cfgfile, weightfile, clear); - int inputs = net.inputs; - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g, Inputs: %d %d %d\n", net.learning_rate, net.momentum, net.decay, inputs, net.batch, net.time_steps); - int batch = net.batch; - int steps = net.time_steps; - if(clear) *net.seen = 0; - int i = (*net.seen)/net.batch; + int inputs = net->inputs; + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g, Inputs: %d %d %d\n", net->learning_rate, net->momentum, net->decay, inputs, net->batch, net->time_steps); + int batch = net->batch; + int steps = net->time_steps; + if(clear) *net->seen = 0; + int i = (*net->seen)/net->batch; int streams = batch/steps; size_t *offsets = calloc(streams, sizeof(size_t)); @@ -191,7 +188,7 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, } clock_t time; - while(get_current_batch(net) < net.max_batches){ + while(get_current_batch(net) < net->max_batches){ i += 1; time=clock(); float_pair p; @@ -201,8 +198,8 @@ void train_char_rnn(char *cfgfile, char *weightfile, char *filename, int clear, p = get_rnn_data(text, offsets, inputs, size, streams, steps); } - copy_cpu(net.inputs*net.batch, p.x, 1, net.input, 1); - copy_cpu(net.truths*net.batch, p.y, 1, net.truth, 1); + copy_cpu(net->inputs*net->batch, p.x, 1, net->input, 1); + copy_cpu(net->truths*net->batch, p.y, 1, net->truth, 1); float loss = train_network_datum(net) / (batch); free(p.x); free(p.y); @@ -257,14 +254,11 @@ void test_char_rnn(char *cfgfile, char *weightfile, int num, char *seed, float t char *base = basecfg(cfgfile); fprintf(stderr, "%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - int inputs = net.inputs; + network *net = load_network(cfgfile, weightfile, 0); + int inputs = net->inputs; int i, j; - for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp; + for(i = 0; i < net->n; ++i) net->layers[i].temperature = temp; int c = 0; int len = strlen(seed); float *input = calloc(inputs, sizeof(float)); @@ -314,14 +308,11 @@ void test_tactic_rnn_multi(char *cfgfile, char *weightfile, int num, float temp, char *base = basecfg(cfgfile); fprintf(stderr, "%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - int inputs = net.inputs; + network *net = load_network(cfgfile, weightfile, 0); + int inputs = net->inputs; int i, j; - for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp; + for(i = 0; i < net->n; ++i) net->layers[i].temperature = temp; int c = 0; float *input = calloc(inputs, sizeof(float)); float *out = 0; @@ -362,14 +353,11 @@ void test_tactic_rnn(char *cfgfile, char *weightfile, int num, float temp, int r char *base = basecfg(cfgfile); fprintf(stderr, "%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - int inputs = net.inputs; + network *net = load_network(cfgfile, weightfile, 0); + int inputs = net->inputs; int i, j; - for(i = 0; i < net.n; ++i) net.layers[i].temperature = temp; + for(i = 0; i < net->n; ++i) net->layers[i].temperature = temp; int c = 0; float *input = calloc(inputs, sizeof(float)); float *out = 0; @@ -400,11 +388,8 @@ void valid_tactic_rnn(char *cfgfile, char *weightfile, char *seed) char *base = basecfg(cfgfile); fprintf(stderr, "%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - int inputs = net.inputs; + network *net = load_network(cfgfile, weightfile, 0); + int inputs = net->inputs; int count = 0; int words = 1; @@ -452,11 +437,8 @@ void valid_char_rnn(char *cfgfile, char *weightfile, char *seed) char *base = basecfg(cfgfile); fprintf(stderr, "%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - int inputs = net.inputs; + network *net = load_network(cfgfile, weightfile, 0); + int inputs = net->inputs; int count = 0; int words = 1; @@ -493,11 +475,8 @@ void vec_char_rnn(char *cfgfile, char *weightfile, char *seed) char *base = basecfg(cfgfile); fprintf(stderr, "%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - int inputs = net.inputs; + network *net = load_network(cfgfile, weightfile, 0); + int inputs = net->inputs; int c; int seed_len = strlen(seed); @@ -525,7 +504,7 @@ void vec_char_rnn(char *cfgfile, char *weightfile, char *seed) network_predict(net, input); input[(int)c] = 0; - layer l = net.layers[0]; + layer l = net->layers[0]; #ifdef GPU cuda_pull_array(l.output_gpu, l.output, l.outputs); #endif diff --git a/examples/segmenter.c b/examples/segmenter.c index 137ecd8e1aa..d73aceb3b82 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -10,7 +10,7 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, char *base = basecfg(cfgfile); printf("%s\n", base); printf("%d\n", ngpus); - network *nets = calloc(ngpus, sizeof(network)); + network **nets = calloc(ngpus, sizeof(network*)); srand(time(0)); int seed = rand(); @@ -19,23 +19,20 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, #ifdef GPU cuda_set_device(gpus[i]); #endif - nets[i] = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&nets[i], weightfile); - } - if(clear) *nets[i].seen = 0; + nets[i] = load_network(cfgfile, weightfile, clear); + nets[i]->learning_rate *= ngpus; } srand(time(0)); - network net = nets[0]; + network *net = nets[0]; image pred = get_network_image(net); - int div = net.w/pred.w; - assert(pred.w * div == net.w); - assert(pred.h * div == net.h); + int div = net->w/pred.w; + assert(pred.w * div == net->w); + assert(pred.h * div == net->h); - int imgs = net.batch * net.subdivisions * ngpus; + int imgs = net->batch * net->subdivisions * ngpus; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); list *options = read_data_cfg(datacfg); char *backup_directory = option_find_str(options, "backup", "/backup/"); @@ -48,19 +45,19 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, clock_t time; load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.threads = 32; args.scale = div; - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; - args.size = net.w; + args.min = net->min_crop; + args.max = net->max_crop; + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; + args.size = net->w; args.classes = 80; args.paths = paths; @@ -74,8 +71,8 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, args.d = &buffer; load_thread = load_data(args); - int epoch = (*net.seen)/N; - while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + int epoch = (*net->seen)/N; + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ time=clock(); pthread_join(load_thread, 0); @@ -96,8 +93,8 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, loss = train_network(net, train); #endif if(display){ - image tr = float_to_image(net.w/div, net.h/div, 80, train.y.vals[net.batch*(net.subdivisions-1)]); - image im = float_to_image(net.w, net.h, net.c, train.X.vals[net.batch*(net.subdivisions-1)]); + image tr = float_to_image(net->w/div, net->h/div, 80, train.y.vals[net->batch*(net->subdivisions-1)]); + image im = float_to_image(net->w, net->h, net->c, train.X.vals[net->batch*(net->subdivisions-1)]); image mask = mask_to_rgb(tr); image prmask = mask_to_rgb(pred); show_image(im, "input"); @@ -111,10 +108,10 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, } if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen); free_data(train); - if(*net.seen/N > epoch){ - epoch = *net.seen/N; + if(*net->seen/N > epoch){ + epoch = *net->seen/N; char buff[256]; sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); save_weights(net, buff); @@ -135,13 +132,10 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, free(base); } -void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *filename) +void predict_segmenter(char *datafile, char *cfg, char *weights, char *filename) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); srand(2222222); clock_t time; @@ -158,7 +152,7 @@ void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *fi strtok(input, "\n"); } image im = load_image_color(input, 0, 0); - image sized = letterbox_image(im, net.w, net.h); + image sized = letterbox_image(im, net->w, net->h); float *X = sized.data; time=clock(); @@ -180,15 +174,12 @@ void predict_segmenter(char *datafile, char *cfgfile, char *weightfile, char *fi } -void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename) +void demo_segmenter(char *datacfg, char *cfg, char *weights, int cam_index, const char *filename) { #ifdef OPENCV printf("Classifier Demo\n"); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); srand(2222222); CvCapture * cap; @@ -209,7 +200,7 @@ void demo_segmenter(char *datacfg, char *cfgfile, char *weightfile, int cam_inde gettimeofday(&tval_before, NULL); image in = get_image_from_stream(cap); - image in_s = letterbox_image(in, net.w, net.h); + image in_s = letterbox_image(in, net->w, net->h); network_predict(net, in_s.data); diff --git a/examples/super.c b/examples/super.c index 89521c94f0e..506b065e50d 100644 --- a/examples/super.c +++ b/examples/super.c @@ -8,14 +8,10 @@ void train_super(char *cfgfile, char *weightfile, int clear) char *base = basecfg(cfgfile); printf("%s\n", base); float avg_loss = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - if(clear) *net.seen = 0; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - int imgs = net.batch*net.subdivisions; - int i = *net.seen/imgs; + network *net = load_network(cfgfile, weightfile, clear); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + int imgs = net->batch*net->subdivisions; + int i = *net->seen/imgs; data train, buffer; @@ -24,8 +20,8 @@ void train_super(char *cfgfile, char *weightfile, int clear) char **paths = (char **)list_to_array(plist); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.scale = 4; args.paths = paths; args.n = imgs; @@ -36,7 +32,7 @@ void train_super(char *cfgfile, char *weightfile, int clear) pthread_t load_thread = load_data_in_thread(args); clock_t time; //while(i*imgs < N*120){ - while(get_current_batch(net) < net.max_batches){ + while(get_current_batch(net) < net->max_batches){ i += 1; time=clock(); pthread_join(load_thread, 0); @@ -70,11 +66,8 @@ void train_super(char *cfgfile, char *weightfile, int clear) void test_super(char *cfgfile, char *weightfile, char *filename) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); clock_t time; @@ -91,7 +84,7 @@ void test_super(char *cfgfile, char *weightfile, char *filename) strtok(input, "\n"); } image im = load_image_color(input, 0, 0); - resize_network(&net, im.w, im.h); + resize_network(net, im.w, im.h); printf("%d %d\n", im.w, im.h); float *X = im.data; diff --git a/examples/tag.c b/examples/tag.c index 51bbb95ea0a..4caf8cba18f 100644 --- a/examples/tag.c +++ b/examples/tag.c @@ -7,12 +7,8 @@ void train_tag(char *cfgfile, char *weightfile, int clear) char *base = basecfg(cfgfile); char *backup_directory = "/home/pjreddie/backup/"; printf("%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - if(clear) *net.seen = 0; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfgfile, weightfile, clear); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); int imgs = 1024; list *plist = get_paths("/home/pjreddie/tag/train.list"); char **paths = (char **)list_to_array(plist); @@ -24,30 +20,30 @@ void train_tag(char *cfgfile, char *weightfile, int clear) data buffer; load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; - args.min = net.w; - args.max = net.max_crop; - args.size = net.w; + args.min = net->w; + args.max = net->max_crop; + args.size = net->w; args.paths = paths; - args.classes = net.outputs; + args.classes = net->outputs; args.n = imgs; args.m = N; args.d = &buffer; args.type = TAG_DATA; - args.angle = net.angle; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; + args.angle = net->angle; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; - fprintf(stderr, "%d classes\n", net.outputs); + fprintf(stderr, "%d classes\n", net->outputs); load_thread = load_data_in_thread(args); - int epoch = (*net.seen)/N; - while(get_current_batch(net) < net.max_batches || net.max_batches == 0){ + int epoch = (*net->seen)/N; + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ time=clock(); pthread_join(load_thread, 0); train = buffer; @@ -58,10 +54,10 @@ void train_tag(char *cfgfile, char *weightfile, int clear) float loss = train_network(net, train); if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen); free_data(train); - if(*net.seen/N > epoch){ - epoch = *net.seen/N; + if(*net->seen/N > epoch){ + epoch = *net->seen/N; char buff[256]; sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); save_weights(net, buff); @@ -86,11 +82,8 @@ void train_tag(char *cfgfile, char *weightfile, int clear) void test_tag(char *cfgfile, char *weightfile, char *filename) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); srand(2222222); int i = 0; char **names = get_labels("data/tags.txt"); @@ -98,7 +91,7 @@ void test_tag(char *cfgfile, char *weightfile, char *filename) int indexes[10]; char buff[256]; char *input = buff; - int size = net.w; + int size = net->w; while(1){ if(filename){ strncpy(input, filename, 256); @@ -111,7 +104,7 @@ void test_tag(char *cfgfile, char *weightfile, char *filename) } image im = load_image_color(input, 0, 0); image r = resize_min(im, size); - resize_network(&net, r.w, r.h); + resize_network(net, r.w, r.h); printf("%d %d\n", r.w, r.h); float *X = r.data; diff --git a/examples/yolo.c b/examples/yolo.c index 39a3f4998a2..9174b4013d6 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -10,17 +10,14 @@ void train_yolo(char *cfgfile, char *weightfile) char *base = basecfg(cfgfile); printf("%s\n", base); float avg_loss = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); - int imgs = net.batch*net.subdivisions; - int i = *net.seen/imgs; + network *net = load_network(cfgfile, weightfile, 0); + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + int imgs = net->batch*net->subdivisions; + int i = *net->seen/imgs; data train, buffer; - layer l = net.layers[net.n - 1]; + layer l = net->layers[net->n - 1]; int side = l.side; int classes = l.classes; @@ -31,8 +28,8 @@ void train_yolo(char *cfgfile, char *weightfile) char **paths = (char **)list_to_array(plist); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.paths = paths; args.n = imgs; args.m = plist->size; @@ -42,15 +39,15 @@ void train_yolo(char *cfgfile, char *weightfile) args.d = &buffer; args.type = REGION_DATA; - args.angle = net.angle; - args.exposure = net.exposure; - args.saturation = net.saturation; - args.hue = net.hue; + args.angle = net->angle; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; pthread_t load_thread = load_data_in_thread(args); clock_t time; //while(i*imgs < N*120){ - while(get_current_batch(net) < net.max_batches){ + while(get_current_batch(net) < net->max_batches){ i += 1; time=clock(); pthread_join(load_thread, 0); @@ -98,14 +95,11 @@ void print_yolo_detections(FILE **fps, char *id, box *boxes, float **probs, int } } -void validate_yolo(char *cfgfile, char *weightfile) +void validate_yolo(char *cfg, char *weights) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); srand(time(0)); char *base = "results/comp4_det_test_"; @@ -114,7 +108,7 @@ void validate_yolo(char *cfgfile, char *weightfile) //list *plist = get_paths("data/voc.2012.test"); char **paths = (char **)list_to_array(plist); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; int classes = l.classes; int j; @@ -144,8 +138,8 @@ void validate_yolo(char *cfgfile, char *weightfile) pthread_t *thr = calloc(nthreads, sizeof(pthread_t)); load_args args = {0}; - args.w = net.w; - args.h = net.h; + args.w = net->w; + args.h = net->h; args.type = IMAGE_DATA; for(t = 0; t < nthreads; ++t){ @@ -186,21 +180,18 @@ void validate_yolo(char *cfgfile, char *weightfile) fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start)); } -void validate_yolo_recall(char *cfgfile, char *weightfile) +void validate_yolo_recall(char *cfg, char *weights) { - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); - fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); + fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); srand(time(0)); char *base = "results/comp4_det_test_"; list *plist = get_paths("data/voc.2007.test"); char **paths = (char **)list_to_array(plist); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; int classes = l.classes; int side = l.side; @@ -230,7 +221,7 @@ void validate_yolo_recall(char *cfgfile, char *weightfile) for(i = 0; i < m; ++i){ char *path = paths[i]; image orig = load_image_color(path, 0, 0); - image sized = resize_image(orig, net.w, net.h); + image sized = resize_image(orig, net->w, net->h); char *id = basecfg(path); network_predict(net, sized.data); get_detection_boxes(l, orig.w, orig.h, thresh, probs, boxes, 1); @@ -275,12 +266,9 @@ void validate_yolo_recall(char *cfgfile, char *weightfile) void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) { image **alphabet = load_alphabet(); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - layer l = net.layers[net.n-1]; - set_batch_network(&net, 1); + network *net = load_network(cfgfile, weightfile, 0); + layer l = net->layers[net->n-1]; + set_batch_network(net, 1); srand(2222222); clock_t time; char buff[256]; @@ -301,7 +289,7 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) strtok(input, "\n"); } image im = load_image_color(input,0,0); - image sized = resize_image(im, net.w, net.h); + image sized = resize_image(im, net->w, net->h); float *X = sized.data; time=clock(); network_predict(net, X); diff --git a/include/darknet.h b/include/darknet.h index 0b6eeb06e8c..b3dc89a4280 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -446,12 +446,15 @@ typedef struct network{ int h, w, c; int max_crop; int min_crop; + float max_ratio; + float min_ratio; int center; float angle; float aspect; float exposure; float saturation; float hue; + int random; int gpu_index; tree *hierarchy; @@ -553,9 +556,8 @@ typedef struct{ } box_label; -network load_network(char *cfg, char *weights, int clear); -network *load_network_p(char *cfg, char *weights, int clear); -load_args get_base_args(network net); +network *load_network(char *cfg, char *weights, int clear); +load_args get_base_args(network *net); void free_data(data d); @@ -575,10 +577,11 @@ pthread_t load_data(load_args args); list *read_data_cfg(char *filename); list *read_cfg(char *filename); unsigned char *read_file(char *filename); +data resize_data(data orig, int w, int h); -void forward_network(network net); -void backward_network(network net); -void update_network(network net); +void forward_network(network *net); +void backward_network(network *net); +void update_network(network *net); void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); @@ -600,20 +603,20 @@ void cuda_pull_array(float *x_gpu, float *x, size_t n); float cuda_mag_array(float *x_gpu, size_t n); void cuda_push_array(float *x_gpu, float *x, size_t n); -void forward_network_gpu(network net); -void backward_network_gpu(network net); -void update_network_gpu(network net); +void forward_network_gpu(network *net); +void backward_network_gpu(network *net); +void update_network_gpu(network *net); -float train_networks(network *nets, int n, data d, int interval); -void sync_nets(network *nets, int n, int interval); -void harmless_update_network_gpu(network net); +float train_networks(network **nets, int n, data d, int interval); +void sync_nets(network **nets, int n, int interval); +void harmless_update_network_gpu(network *net); #endif void save_image_png(image im, const char *name); void get_next_batch(data d, int n, int offset, float *X, float *y); void grayscale_image_3c(image im); void normalize_image(image p); void matrix_to_csv(matrix m); -float train_network_sgd(network net, data d, int n); +float train_network_sgd(network *net, data d, int n); void rgbgr_image(image im); data copy_data(data d); data concat_data(data d1, data d2); @@ -622,8 +625,8 @@ float matrix_topk_accuracy(matrix truth, matrix guess, int k); void matrix_add_matrix(matrix from, matrix to); void scale_matrix(matrix m, float scale); matrix csv_to_matrix(char *filename); -float *network_accuracies(network net, data d, int n); -float train_network_datum(network net); +float *network_accuracies(network *net, data d, int n); +float train_network_datum(network *net); image make_random_image(int w, int h, int c); void denormalize_connected_layer(layer l); @@ -639,17 +642,17 @@ void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box char *option_find_str(list *l, char *key, char *def); int option_find_int(list *l, char *key, int def); -network parse_network_cfg(char *filename); -void save_weights(network net, char *filename); +network *parse_network_cfg(char *filename); +void save_weights(network *net, char *filename); void load_weights(network *net, char *filename); -void save_weights_upto(network net, char *filename, int cutoff); +void save_weights_upto(network *net, char *filename, int cutoff); void load_weights_upto(network *net, char *filename, int start, int cutoff); void zero_objectness(layer l); void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, float **masks, int only_objectness, int *map, float tree_thresh, int relative); -void free_network(network net); +void free_network(network *net); void set_batch_network(network *net, int b); -void set_temp_network(network net, float t); +void set_temp_network(network *net, float t); image load_image(char *filename, int w, int h, int c); image load_image_color(char *filename, int w, int h); image make_image(int w, int h, int c); @@ -657,6 +660,7 @@ image resize_image(image im, int w, int h); image letterbox_image(image im, int w, int h); image crop_image(image im, int dx, int dy, int w, int h); image resize_min(image im, int min); +image resize_max(image im, int max); image threshold_image(image im, float thresh); image mask_to_rgb(image mask); int resize_network(network *net, int w, int h); @@ -666,25 +670,25 @@ void save_image(image p, const char *name); void show_image(image p, const char *name); image copy_image(image p); void draw_box_width(image a, int x1, int y1, int x2, int y2, int w, float r, float g, float b); -float get_current_rate(network net); +float get_current_rate(network *net); void composite_3d(char *f1, char *f2, char *out, int delta); data load_data_old(char **paths, int n, int m, char **labels, int k, int w, int h); -size_t get_current_batch(network net); +size_t get_current_batch(network *net); void constrain_image(image im); -image get_network_image_layer(network net, int i); -layer get_network_output_layer(network net); -void top_predictions(network net, int n, int *index); +image get_network_image_layer(network *net, int i); +layer get_network_output_layer(network *net); +void top_predictions(network *net, int n, int *index); void flip_image(image a); image float_to_image(int w, int h, int c, float *data); void ghost_image(image source, image dest, int dx, int dy); -float network_accuracy(network net, data d); +float network_accuracy(network *net, data d); void random_distort_image(image im, float hue, float saturation, float exposure); void fill_image(image m, float s); image grayscale_image(image im); void rotate_image_cw(image im, int times); double what_time_is_it_now(); image rotate_image(image m, float rad); -void visualize_network(network net); +void visualize_network(network *net); float box_iou(box a, box b); void do_nms(box *boxes, float **probs, int total, int classes, float thresh); data load_all_cifar10(); @@ -692,11 +696,10 @@ box_label *read_boxes(char *filename, int *n); box float_to_box(float *f, int stride); void draw_detections(image im, int num, float thresh, box *boxes, float **probs, float **masks, char **names, image **alphabet, int classes); -matrix network_predict_data(network net, data test); +matrix network_predict_data(network *net, data test); image **load_alphabet(); -image get_network_image(network net); -float *network_predict(network net, float *input); -float *network_predict_p(network *net, float *input); +image get_network_image(network *net); +float *network_predict(network *net, float *input); int network_width(network *net); int network_height(network *net); @@ -705,8 +708,7 @@ void network_detect(network *net, image im, float thresh, float hier_thresh, flo int num_boxes(network *net); box *make_boxes(network *net); -void reset_network_state(network net, int b); -void reset_network_state(network net, int b); +void reset_network_state(network *net, int b); char **get_labels(char *filename); void do_nms_sort(box *boxes, float **probs, int total, int classes, float thresh); @@ -720,7 +722,7 @@ image get_image_from_stream(CvCapture *cap); #endif #endif void free_image(image m); -float train_network(network net, data d); +float train_network(network *net, data d); pthread_t load_data_in_thread(load_args args); void load_data_blocking(load_args args); list *get_paths(char *filename); diff --git a/python/darknet.py b/python/darknet.py index aadc6347dc6..c8ec9be5b7f 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -38,7 +38,7 @@ class METADATA(Structure): lib.network_height.argtypes = [c_void_p] lib.network_height.restype = c_int -predict = lib.network_predict_p +predict = lib.network_predict predict.argtypes = [c_void_p, POINTER(c_float)] predict.restype = POINTER(c_float) @@ -57,13 +57,13 @@ class METADATA(Structure): make_probs.argtypes = [c_void_p] make_probs.restype = POINTER(POINTER(c_float)) -detect = lib.network_predict_p +detect = lib.network_predict detect.argtypes = [c_void_p, IMAGE, c_float, c_float, c_float, POINTER(BOX), POINTER(POINTER(c_float))] reset_rnn = lib.reset_rnn reset_rnn.argtypes = [c_void_p] -load_net = lib.load_network_p +load_net = lib.load_network load_net.argtypes = [c_char_p, c_char_p, c_int] load_net.restype = c_void_p diff --git a/src/data.c b/src/data.c index 36b1286a491..cddc7bc117d 100644 --- a/src/data.c +++ b/src/data.c @@ -1172,11 +1172,32 @@ data load_data_regression(char **paths, int n, int m, int min, int max, int size return d; } +data resize_data(data orig, int w, int h) +{ + data d = {0}; + d.shallow = 0; + d.w = w; + d.h = h; + int i; + d.X.rows = orig.X.rows; + d.X.cols = w*h*3; + d.X.vals = calloc(d.X.rows, sizeof(float)); + + d.y = copy_matrix(orig.y); + for(i = 0; i < orig.X.rows; ++i){ + image im = float_to_image(orig.w, orig.h, 3, orig.X.vals[i]); + d.X.vals[i] = resize_image(im, w, h).data; + } + return d; +} + data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center) { if(m) paths = get_random_paths(paths, n, m); data d = {0}; d.shallow = 0; + d.w=size; + d.h=size; d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure, center); d.y = load_labels_paths(paths, n, labels, k, hierarchy); if(m) free(paths); diff --git a/src/demo.c b/src/demo.c index c8ff8cbcc2c..ec73abd5283 100644 --- a/src/demo.c +++ b/src/demo.c @@ -19,7 +19,7 @@ static int demo_classes; static float **probs; static box *boxes; -static network net; +static network *net; static image buff [3]; static image buff_letter[3]; static int buff_index = 0; @@ -43,7 +43,7 @@ void *detect_in_thread(void *ptr) running = 1; float nms = .4; - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; float *X = buff_letter[(buff_index+2)%3].data; float *prediction = network_predict(net, X); @@ -53,7 +53,7 @@ void *detect_in_thread(void *ptr) if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else if (l.type == REGION){ - get_region_boxes(l, buff[0].w, buff[0].h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, 0, demo_hier, 1); + get_region_boxes(l, buff[0].w, buff[0].h, net->w, net->h, demo_thresh, probs, boxes, 0, 0, 0, demo_hier, 1); } else { error("Last layer must produce detections\n"); } @@ -74,7 +74,7 @@ void *detect_in_thread(void *ptr) void *fetch_in_thread(void *ptr) { int status = fill_image_from_stream(cap, buff[buff_index]); - letterbox_image_into(buff[buff_index], net.w, net.h, buff_letter[buff_index]); + letterbox_image_into(buff[buff_index], net->w, net->h, buff_letter[buff_index]); if(status == 0) demo_done = 1; return 0; } @@ -126,11 +126,8 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch demo_thresh = thresh; demo_hier = hier; printf("Demo\n"); - net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - set_batch_network(&net, 1); + net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); pthread_t detect_thread; pthread_t fetch_thread; @@ -155,7 +152,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(!cap) error("Couldn't connect to webcam.\n"); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; demo_detections = l.n*l.w*l.h; int j; @@ -169,9 +166,9 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch buff[0] = get_image_from_stream(cap); buff[1] = copy_image(buff[0]); buff[2] = copy_image(buff[0]); - buff_letter[0] = letterbox_image(buff[0], net.w, net.h); - buff_letter[1] = letterbox_image(buff[0], net.w, net.h); - buff_letter[2] = letterbox_image(buff[0], net.w, net.h); + buff_letter[0] = letterbox_image(buff[0], net->w, net->h); + buff_letter[1] = letterbox_image(buff[0], net->w, net->h); + buff_letter[2] = letterbox_image(buff[0], net->w, net->h); ipl = cvCreateImage(cvSize(buff[0].w,buff[0].h), IPL_DEPTH_8U, buff[0].c); int count = 0; @@ -218,7 +215,7 @@ void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float th demo_hier = hier; printf("Demo\n"); net = load_network(cfg1, weight1, 0); - set_batch_network(&net, 1); + set_batch_network(net, 1); pthread_t detect_thread; pthread_t fetch_thread; @@ -243,7 +240,7 @@ void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float th if(!cap) error("Couldn't connect to webcam.\n"); - layer l = net.layers[net.n-1]; + layer l = net->layers[net->n-1]; demo_detections = l.n*l.w*l.h; int j; @@ -257,9 +254,9 @@ void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float th buff[0] = get_image_from_stream(cap); buff[1] = copy_image(buff[0]); buff[2] = copy_image(buff[0]); - buff_letter[0] = letterbox_image(buff[0], net.w, net.h); - buff_letter[1] = letterbox_image(buff[0], net.w, net.h); - buff_letter[2] = letterbox_image(buff[0], net.w, net.h); + buff_letter[0] = letterbox_image(buff[0], net->w, net->h); + buff_letter[1] = letterbox_image(buff[0], net->w, net->h); + buff_letter[2] = letterbox_image(buff[0], net->w, net->h); ipl = cvCreateImage(cvSize(buff[0].w,buff[0].h), IPL_DEPTH_8U, buff[0].c); int count = 0; diff --git a/src/network.c b/src/network.c index 89e18238852..6425855dd59 100644 --- a/src/network.c +++ b/src/network.c @@ -30,64 +30,46 @@ #include "parser.h" #include "data.h" -load_args get_base_args(network net) +load_args get_base_args(network *net) { load_args args = {0}; - args.w = net.w; - args.h = net.h; - args.size = net.w; - - args.min = net.min_crop; - args.max = net.max_crop; - args.angle = net.angle; - args.aspect = net.aspect; - args.exposure = net.exposure; - args.center = net.center; - args.saturation = net.saturation; - args.hue = net.hue; + args.w = net->w; + args.h = net->h; + args.size = net->w; + + args.min = net->min_crop; + args.max = net->max_crop; + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.center = net->center; + args.saturation = net->saturation; + args.hue = net->hue; return args; } -network load_network(char *cfg, char *weights, int clear) +network *load_network(char *cfg, char *weights, int clear) { - network net = parse_network_cfg(cfg); + network *net = parse_network_cfg(cfg); if(weights && weights[0] != 0){ - load_weights(&net, weights); + load_weights(net, weights); } - if(clear) *net.seen = 0; - return net; -} - -network *load_network_p(char *cfg, char *weights, int clear) -{ - network *net = calloc(1, sizeof(network)); - *net = load_network(cfg, weights, clear); + if(clear) (*net->seen) = 0; return net; } -size_t get_current_batch(network net) +size_t get_current_batch(network *net) { - size_t batch_num = (*net.seen)/(net.batch*net.subdivisions); + size_t batch_num = (*net->seen)/(net->batch*net->subdivisions); return batch_num; } -void reset_momentum(network net) -{ - if (net.momentum == 0) return; - net.learning_rate = 0; - net.momentum = 0; - net.decay = 0; - #ifdef GPU - //if(net.gpu_index >= 0) update_network_gpu(net); - #endif -} - -void reset_network_state(network net, int b) +void reset_network_state(network *net, int b) { int i; - for (i = 0; i < net.n; ++i) { + for (i = 0; i < net->n; ++i) { #ifdef GPU - layer l = net.layers[i]; + layer l = net->layers[i]; if(l.state_gpu){ fill_gpu(l.outputs, 0, l.state_gpu + l.outputs*b, 1); } @@ -100,39 +82,38 @@ void reset_network_state(network net, int b) void reset_rnn(network *net) { - reset_network_state(*net, 0); + reset_network_state(net, 0); } -float get_current_rate(network net) +float get_current_rate(network *net) { size_t batch_num = get_current_batch(net); int i; float rate; - if (batch_num < net.burn_in) return net.learning_rate * pow((float)batch_num / net.burn_in, net.power); - switch (net.policy) { + if (batch_num < net->burn_in) return net->learning_rate * pow((float)batch_num / net->burn_in, net->power); + switch (net->policy) { case CONSTANT: - return net.learning_rate; + return net->learning_rate; case STEP: - return net.learning_rate * pow(net.scale, batch_num/net.step); + return net->learning_rate * pow(net->scale, batch_num/net->step); case STEPS: - rate = net.learning_rate; - for(i = 0; i < net.num_steps; ++i){ - if(net.steps[i] > batch_num) return rate; - rate *= net.scales[i]; - //if(net.steps[i] > batch_num - 1 && net.scales[i] > 1) reset_momentum(net); + rate = net->learning_rate; + for(i = 0; i < net->num_steps; ++i){ + if(net->steps[i] > batch_num) return rate; + rate *= net->scales[i]; } return rate; case EXP: - return net.learning_rate * pow(net.gamma, batch_num); + return net->learning_rate * pow(net->gamma, batch_num); case POLY: - return net.learning_rate * pow(1 - (float)batch_num / net.max_batches, net.power); + return net->learning_rate * pow(1 - (float)batch_num / net->max_batches, net->power); case RANDOM: - return net.learning_rate * pow(rand_uniform(0,1), net.power); + return net->learning_rate * pow(rand_uniform(0,1), net->power); case SIG: - return net.learning_rate * (1./(1.+exp(net.gamma*(batch_num - net.step)))); + return net->learning_rate * (1./(1.+exp(net->gamma*(batch_num - net->step)))); default: fprintf(stderr, "Policy is weird!\n"); - return net.learning_rate; + return net->learning_rate; } } @@ -189,19 +170,26 @@ char *get_layer_string(LAYER_TYPE a) return "none"; } -network make_network(int n) +network *make_network(int n) { - network net = {0}; - net.n = n; - net.layers = calloc(net.n, sizeof(layer)); - net.seen = calloc(1, sizeof(size_t)); - net.t = calloc(1, sizeof(int)); - net.cost = calloc(1, sizeof(float)); + network *net = calloc(1, sizeof(network)); + net->n = n; + net->layers = calloc(net->n, sizeof(layer)); + net->seen = calloc(1, sizeof(size_t)); + net->t = calloc(1, sizeof(int)); + net->cost = calloc(1, sizeof(float)); return net; } -void forward_network(network net) +void forward_network(network *netp) { +#ifdef GPU + if(netp->gpu_index >= 0){ + forward_network_gpu(netp); + return; + } +#endif + network net = *netp; int i; for(i = 0; i < net.n; ++i){ net.index = i; @@ -215,15 +203,22 @@ void forward_network(network net) net.truth = l.output; } } - calc_network_cost(net); + calc_network_cost(netp); } -void update_network(network net) +void update_network(network *netp) { +#ifdef GPU + if(netp->gpu_index >= 0){ + update_network_gpu(netp); + return; + } +#endif + network net = *netp; int i; update_args a = {0}; a.batch = net.batch*net.subdivisions; - a.learning_rate = get_current_rate(net); + a.learning_rate = get_current_rate(netp); a.momentum = net.momentum; a.decay = net.decay; a.adam = net.adam; @@ -241,8 +236,9 @@ void update_network(network net) } } -void calc_network_cost(network net) +void calc_network_cost(network *netp) { + network net = *netp; int i; float sum = 0; int count = 0; @@ -255,13 +251,20 @@ void calc_network_cost(network net) *net.cost = sum/count; } -int get_predicted_class_network(network net) +int get_predicted_class_network(network *net) { - return max_index(net.output, net.outputs); + return max_index(net->output, net->outputs); } -void backward_network(network net) +void backward_network(network *netp) { +#ifdef GPU + if(netp->gpu_index >= 0){ + backward_network_gpu(netp); + return; + } +#endif + network net = *netp; int i; network orig = net; for(i = net.n-1; i >= 0; --i){ @@ -279,55 +282,52 @@ void backward_network(network net) } } -float train_network_datum(network net) +float train_network_datum(network *net) { -#ifdef GPU - if(gpu_index >= 0) return train_network_datum_gpu(net); -#endif - *net.seen += net.batch; - net.train = 1; + *net->seen += net->batch; + net->train = 1; forward_network(net); backward_network(net); - float error = *net.cost; - if(((*net.seen)/net.batch)%net.subdivisions == 0) update_network(net); + float error = *net->cost; + if(((*net->seen)/net->batch)%net->subdivisions == 0) update_network(net); return error; } -float train_network_sgd(network net, data d, int n) +float train_network_sgd(network *net, data d, int n) { - int batch = net.batch; + int batch = net->batch; int i; float sum = 0; for(i = 0; i < n; ++i){ - get_random_batch(d, batch, net.input, net.truth); + get_random_batch(d, batch, net->input, net->truth); float err = train_network_datum(net); sum += err; } return (float)sum/(n*batch); } -float train_network(network net, data d) +float train_network(network *net, data d) { - assert(d.X.rows % net.batch == 0); - int batch = net.batch; + assert(d.X.rows % net->batch == 0); + int batch = net->batch; int n = d.X.rows / batch; int i; float sum = 0; for(i = 0; i < n; ++i){ - get_next_batch(d, batch, i*batch, net.input, net.truth); + get_next_batch(d, batch, i*batch, net->input, net->truth); float err = train_network_datum(net); sum += err; } return (float)sum/(n*batch); } -void set_temp_network(network net, float t) +void set_temp_network(network *net, float t) { int i; - for(i = 0; i < net.n; ++i){ - net.layers[i].temperature = t; + for(i = 0; i < net->n; ++i){ + net->layers[i].temperature = t; } } @@ -395,7 +395,7 @@ int resize_network(network *net, int w, int h) h = l.out_h; if(l.type == AVGPOOL) break; } - layer out = get_network_output_layer(*net); + layer out = get_network_output_layer(net); net->inputs = net->layers[0].inputs; net->outputs = out.outputs; net->truths = out.outputs; @@ -424,22 +424,22 @@ int resize_network(network *net, int w, int h) return 0; } -detection_layer get_network_detection_layer(network net) +layer get_network_detection_layer(network *net) { int i; - for(i = 0; i < net.n; ++i){ - if(net.layers[i].type == DETECTION){ - return net.layers[i]; + for(i = 0; i < net->n; ++i){ + if(net->layers[i].type == DETECTION){ + return net->layers[i]; } } fprintf(stderr, "Detection layer not found!!\n"); - detection_layer l = {0}; + layer l = {0}; return l; } -image get_network_image_layer(network net, int i) +image get_network_image_layer(network *net, int i) { - layer l = net.layers[i]; + layer l = net->layers[i]; #ifdef GPU //cuda_pull_array(l.output_gpu, l.output, l.outputs); #endif @@ -450,10 +450,10 @@ image get_network_image_layer(network net, int i) return def; } -image get_network_image(network net) +image get_network_image(network *net) { int i; - for(i = net.n-1; i >= 0; --i){ + for(i = net->n-1; i >= 0; --i){ image m = get_network_image_layer(net, i); if(m.h != 0) return m; } @@ -461,37 +461,37 @@ image get_network_image(network net) return def; } -void visualize_network(network net) +void visualize_network(network *net) { image *prev = 0; int i; char buff[256]; - for(i = 0; i < net.n; ++i){ + for(i = 0; i < net->n; ++i){ sprintf(buff, "Layer %d", i); - layer l = net.layers[i]; + layer l = net->layers[i]; if(l.type == CONVOLUTIONAL){ prev = visualize_convolutional_layer(l, buff, prev); } } } -void top_predictions(network net, int k, int *index) +void top_predictions(network *net, int k, int *index) { - top_k(net.output, net.outputs, k, index); + top_k(net->output, net->outputs, k, index); } -float *network_predict(network net, float *input) +float *network_predict(network *net, float *input) { -#ifdef GPU - if(gpu_index >= 0) return network_predict_gpu(net, input); -#endif - net.input = input; - net.truth = 0; - net.train = 0; - net.delta = 0; + network orig = *net; + net->input = input; + net->truth = 0; + net->train = 0; + net->delta = 0; forward_network(net); - return net.output; + float *out = net->output; + *net = orig; + return out; } int num_boxes(network *net) @@ -526,16 +526,11 @@ void network_detect(network *net, image im, float thresh, float hier_thresh, flo } } -float *network_predict_p(network *net, float *input) -{ - return network_predict(*net, input); -} - float *network_predict_image(network *net, image im) { image imr = letterbox_image(im, net->w, net->h); set_batch_network(net, 1); - float *p = network_predict(*net, imr.data); + float *p = network_predict(net, imr.data); free_image(imr); return p; } @@ -543,20 +538,20 @@ float *network_predict_image(network *net, image im) int network_width(network *net){return net->w;} int network_height(network *net){return net->h;} -matrix network_predict_data_multi(network net, data test, int n) +matrix network_predict_data_multi(network *net, data test, int n) { int i,j,b,m; - int k = net.outputs; + int k = net->outputs; matrix pred = make_matrix(test.X.rows, k); - float *X = calloc(net.batch*test.X.rows, sizeof(float)); - for(i = 0; i < test.X.rows; i += net.batch){ - for(b = 0; b < net.batch; ++b){ + float *X = calloc(net->batch*test.X.rows, sizeof(float)); + for(i = 0; i < test.X.rows; i += net->batch){ + for(b = 0; b < net->batch; ++b){ if(i+b == test.X.rows) break; memcpy(X+b*test.X.cols, test.X.vals[i+b], test.X.cols*sizeof(float)); } for(m = 0; m < n; ++m){ float *out = network_predict(net, X); - for(b = 0; b < net.batch; ++b){ + for(b = 0; b < net->batch; ++b){ if(i+b == test.X.rows) break; for(j = 0; j < k; ++j){ pred.vals[i+b][j] += out[j+b*k]/n; @@ -568,19 +563,19 @@ matrix network_predict_data_multi(network net, data test, int n) return pred; } -matrix network_predict_data(network net, data test) +matrix network_predict_data(network *net, data test) { int i,j,b; - int k = net.outputs; + int k = net->outputs; matrix pred = make_matrix(test.X.rows, k); - float *X = calloc(net.batch*test.X.cols, sizeof(float)); - for(i = 0; i < test.X.rows; i += net.batch){ - for(b = 0; b < net.batch; ++b){ + float *X = calloc(net->batch*test.X.cols, sizeof(float)); + for(i = 0; i < test.X.rows; i += net->batch){ + for(b = 0; b < net->batch; ++b){ if(i+b == test.X.rows) break; memcpy(X+b*test.X.cols, test.X.vals[i+b], test.X.cols*sizeof(float)); } float *out = network_predict(net, X); - for(b = 0; b < net.batch; ++b){ + for(b = 0; b < net->batch; ++b){ if(i+b == test.X.rows) break; for(j = 0; j < k; ++j){ pred.vals[i+b][j] = out[j+b*k]; @@ -591,11 +586,11 @@ matrix network_predict_data(network net, data test) return pred; } -void print_network(network net) +void print_network(network *net) { int i,j; - for(i = 0; i < net.n; ++i){ - layer l = net.layers[i]; + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; float *output = l.output; int n = l.outputs; float mean = mean_array(output, n); @@ -608,7 +603,7 @@ void print_network(network net) } } -void compare_networks(network n1, network n2, data test) +void compare_networks(network *n1, network *n2, data test) { matrix g1 = network_predict_data(n1, test); matrix g2 = network_predict_data(n2, test); @@ -633,7 +628,7 @@ void compare_networks(network n1, network n2, data test) printf("%f\n", num/den); } -float network_accuracy(network net, data d) +float network_accuracy(network *net, data d) { matrix guess = network_predict_data(net, d); float acc = matrix_topk_accuracy(d.y, guess,1); @@ -641,7 +636,7 @@ float network_accuracy(network net, data d) return acc; } -float *network_accuracies(network net, data d, int n) +float *network_accuracies(network *net, data d, int n) { static float acc[2]; matrix guess = network_predict_data(net, d); @@ -651,16 +646,16 @@ float *network_accuracies(network net, data d, int n) return acc; } -layer get_network_output_layer(network net) +layer get_network_output_layer(network *net) { int i; - for(i = net.n - 1; i >= 0; --i){ - if(net.layers[i].type != COST) break; + for(i = net->n - 1; i >= 0; --i){ + if(net->layers[i].type != COST) break; } - return net.layers[i]; + return net->layers[i]; } -float network_accuracy_multi(network net, data d, int n) +float network_accuracy_multi(network *net, data d, int n) { matrix guess = network_predict_data_multi(net, d, n); float acc = matrix_topk_accuracy(d.y, guess,1); @@ -668,45 +663,417 @@ float network_accuracy_multi(network net, data d, int n) return acc; } -void free_network(network net) +void free_network(network *net) { int i; - for(i = 0; i < net.n; ++i){ - free_layer(net.layers[i]); + for(i = 0; i < net->n; ++i){ + free_layer(net->layers[i]); } - free(net.layers); - if(net.input) free(net.input); - if(net.truth) free(net.truth); + free(net->layers); + if(net->input) free(net->input); + if(net->truth) free(net->truth); #ifdef GPU - if(net.input_gpu) cuda_free(net.input_gpu); - if(net.truth_gpu) cuda_free(net.truth_gpu); + if(net->input_gpu) cuda_free(net->input_gpu); + if(net->truth_gpu) cuda_free(net->truth_gpu); #endif + free(net); } // Some day... +// ^ What the hell is this comment for? -layer network_output_layer(network net) +layer network_output_layer(network *net) { int i; - for(i = net.n - 1; i >= 0; --i){ - if(net.layers[i].type != COST) break; + for(i = net->n - 1; i >= 0; --i){ + if(net->layers[i].type != COST) break; } - return net.layers[i]; + return net->layers[i]; } -int network_inputs(network net) +int network_inputs(network *net) { - return net.layers[0].inputs; + return net->layers[0].inputs; } -int network_outputs(network net) +int network_outputs(network *net) { return network_output_layer(net).outputs; } -float *network_output(network net) +float *network_output(network *net) { return network_output_layer(net).output; } +#ifdef GPU + +void forward_network_gpu(network *netp) +{ + network net = *netp; + cuda_set_device(net.gpu_index); + cuda_push_array(net.input_gpu, net.input, net.inputs*net.batch); + if(net.truth){ + cuda_push_array(net.truth_gpu, net.truth, net.truths*net.batch); + } + + int i; + for(i = 0; i < net.n; ++i){ + net.index = i; + layer l = net.layers[i]; + if(l.delta_gpu){ + fill_gpu(l.outputs * l.batch, 0, l.delta_gpu, 1); + } + l.forward_gpu(l, net); + net.input_gpu = l.output_gpu; + net.input = l.output; + if(l.truth) { + net.truth_gpu = l.output_gpu; + net.truth = l.output; + } + } + pull_network_output(netp); + calc_network_cost(netp); +} + +void backward_network_gpu(network *netp) +{ + int i; + network net = *netp; + network orig = net; + cuda_set_device(net.gpu_index); + for(i = net.n-1; i >= 0; --i){ + layer l = net.layers[i]; + if(l.stopbackward) break; + if(i == 0){ + net = orig; + }else{ + layer prev = net.layers[i-1]; + net.input = prev.output; + net.delta = prev.delta; + net.input_gpu = prev.output_gpu; + net.delta_gpu = prev.delta_gpu; + } + net.index = i; + l.backward_gpu(l, net); + } +} + +void update_network_gpu(network *netp) +{ + network net = *netp; + cuda_set_device(net.gpu_index); + int i; + update_args a = {0}; + a.batch = net.batch*net.subdivisions; + a.learning_rate = get_current_rate(netp); + a.momentum = net.momentum; + a.decay = net.decay; + a.adam = net.adam; + a.B1 = net.B1; + a.B2 = net.B2; + a.eps = net.eps; + ++*net.t; + a.t = (*net.t); + + for(i = 0; i < net.n; ++i){ + layer l = net.layers[i]; + if(l.update_gpu){ + l.update_gpu(l, a); + } + } +} + +void harmless_update_network_gpu(network *netp) +{ + network net = *netp; + cuda_set_device(net.gpu_index); + int i; + for(i = 0; i < net.n; ++i){ + layer l = net.layers[i]; + if(l.weight_updates_gpu) fill_gpu(l.nweights, 0, l.weight_updates_gpu, 1); + if(l.bias_updates_gpu) fill_gpu(l.nbiases, 0, l.bias_updates_gpu, 1); + if(l.scale_updates_gpu) fill_gpu(l.nbiases, 0, l.scale_updates_gpu, 1); + } +} + +typedef struct { + network *net; + data d; + float *err; +} train_args; + +void *train_thread(void *ptr) +{ + train_args args = *(train_args*)ptr; + free(ptr); + cuda_set_device(args.net->gpu_index); + *args.err = train_network(args.net, args.d); + return 0; +} + +pthread_t train_network_in_thread(network *net, data d, float *err) +{ + pthread_t thread; + train_args *ptr = (train_args *)calloc(1, sizeof(train_args)); + ptr->net = net; + ptr->d = d; + ptr->err = err; + if(pthread_create(&thread, 0, train_thread, ptr)) error("Thread creation failed"); + return thread; +} + +void merge_weights(layer l, layer base) +{ + if (l.type == CONVOLUTIONAL) { + axpy_cpu(l.n, 1, l.bias_updates, 1, base.biases, 1); + axpy_cpu(l.nweights, 1, l.weight_updates, 1, base.weights, 1); + if (l.scales) { + axpy_cpu(l.n, 1, l.scale_updates, 1, base.scales, 1); + } + } else if(l.type == CONNECTED) { + axpy_cpu(l.outputs, 1, l.bias_updates, 1, base.biases, 1); + axpy_cpu(l.outputs*l.inputs, 1, l.weight_updates, 1, base.weights, 1); + } +} + +void scale_weights(layer l, float s) +{ + if (l.type == CONVOLUTIONAL) { + scal_cpu(l.n, s, l.biases, 1); + scal_cpu(l.nweights, s, l.weights, 1); + if (l.scales) { + scal_cpu(l.n, s, l.scales, 1); + } + } else if(l.type == CONNECTED) { + scal_cpu(l.outputs, s, l.biases, 1); + scal_cpu(l.outputs*l.inputs, s, l.weights, 1); + } +} + + +void pull_weights(layer l) +{ + if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ + cuda_pull_array(l.biases_gpu, l.bias_updates, l.n); + cuda_pull_array(l.weights_gpu, l.weight_updates, l.nweights); + if(l.scales) cuda_pull_array(l.scales_gpu, l.scale_updates, l.n); + } else if(l.type == CONNECTED){ + cuda_pull_array(l.biases_gpu, l.bias_updates, l.outputs); + cuda_pull_array(l.weights_gpu, l.weight_updates, l.outputs*l.inputs); + } +} + +void push_weights(layer l) +{ + if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ + cuda_push_array(l.biases_gpu, l.biases, l.n); + cuda_push_array(l.weights_gpu, l.weights, l.nweights); + if(l.scales) cuda_push_array(l.scales_gpu, l.scales, l.n); + } else if(l.type == CONNECTED){ + cuda_push_array(l.biases_gpu, l.biases, l.outputs); + cuda_push_array(l.weights_gpu, l.weights, l.outputs*l.inputs); + } +} + +void distribute_weights(layer l, layer base) +{ + if (l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL) { + cuda_push_array(l.biases_gpu, base.biases, l.n); + cuda_push_array(l.weights_gpu, base.weights, l.nweights); + if (base.scales) cuda_push_array(l.scales_gpu, base.scales, l.n); + } else if (l.type == CONNECTED) { + cuda_push_array(l.biases_gpu, base.biases, l.outputs); + cuda_push_array(l.weights_gpu, base.weights, l.outputs*l.inputs); + } +} + + +/* + + void pull_updates(layer l) + { + if(l.type == CONVOLUTIONAL){ + cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.n); + cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.nweights); + if(l.scale_updates) cuda_pull_array(l.scale_updates_gpu, l.scale_updates, l.n); + } else if(l.type == CONNECTED){ + cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.outputs); + cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.outputs*l.inputs); + } + } + + void push_updates(layer l) + { + if(l.type == CONVOLUTIONAL){ + cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.n); + cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.nweights); + if(l.scale_updates) cuda_push_array(l.scale_updates_gpu, l.scale_updates, l.n); + } else if(l.type == CONNECTED){ + cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.outputs); + cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.outputs*l.inputs); + } + } + + void update_layer(layer l, network net) + { + int update_batch = net.batch*net.subdivisions; + float rate = get_current_rate(net); + l.t = get_current_batch(net); + if(l.update_gpu){ + l.update_gpu(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); + } + } + void merge_updates(layer l, layer base) + { + if (l.type == CONVOLUTIONAL) { + axpy_cpu(l.n, 1, l.bias_updates, 1, base.bias_updates, 1); + axpy_cpu(l.nweights, 1, l.weight_updates, 1, base.weight_updates, 1); + if (l.scale_updates) { + axpy_cpu(l.n, 1, l.scale_updates, 1, base.scale_updates, 1); + } + } else if(l.type == CONNECTED) { + axpy_cpu(l.outputs, 1, l.bias_updates, 1, base.bias_updates, 1); + axpy_cpu(l.outputs*l.inputs, 1, l.weight_updates, 1, base.weight_updates, 1); + } + } + + void distribute_updates(layer l, layer base) + { + if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ + cuda_push_array(l.bias_updates_gpu, base.bias_updates, l.n); + cuda_push_array(l.weight_updates_gpu, base.weight_updates, l.nweights); + if(base.scale_updates) cuda_push_array(l.scale_updates_gpu, base.scale_updates, l.n); + } else if(l.type == CONNECTED){ + cuda_push_array(l.bias_updates_gpu, base.bias_updates, l.outputs); + cuda_push_array(l.weight_updates_gpu, base.weight_updates, l.outputs*l.inputs); + } + } + */ + +/* + void sync_layer(network *nets, int n, int j) + { + int i; + network net = nets[0]; + layer base = net.layers[j]; + scale_weights(base, 0); + for (i = 0; i < n; ++i) { + cuda_set_device(nets[i].gpu_index); + layer l = nets[i].layers[j]; + pull_weights(l); + merge_weights(l, base); + } + scale_weights(base, 1./n); + for (i = 0; i < n; ++i) { + cuda_set_device(nets[i].gpu_index); + layer l = nets[i].layers[j]; + distribute_weights(l, base); + } + } + */ + +void sync_layer(network **nets, int n, int j) +{ + int i; + network *net = nets[0]; + layer base = net->layers[j]; + scale_weights(base, 0); + for (i = 0; i < n; ++i) { + cuda_set_device(nets[i]->gpu_index); + layer l = nets[i]->layers[j]; + pull_weights(l); + merge_weights(l, base); + } + scale_weights(base, 1./n); + for (i = 0; i < n; ++i) { + cuda_set_device(nets[i]->gpu_index); + layer l = nets[i]->layers[j]; + distribute_weights(l, base); + } +} + +typedef struct{ + network **nets; + int n; + int j; +} sync_args; + +void *sync_layer_thread(void *ptr) +{ + sync_args args = *(sync_args*)ptr; + sync_layer(args.nets, args.n, args.j); + free(ptr); + return 0; +} + +pthread_t sync_layer_in_thread(network **nets, int n, int j) +{ + pthread_t thread; + sync_args *ptr = (sync_args *)calloc(1, sizeof(sync_args)); + ptr->nets = nets; + ptr->n = n; + ptr->j = j; + if(pthread_create(&thread, 0, sync_layer_thread, ptr)) error("Thread creation failed"); + return thread; +} + +void sync_nets(network **nets, int n, int interval) +{ + int j; + int layers = nets[0]->n; + pthread_t *threads = (pthread_t *) calloc(layers, sizeof(pthread_t)); + + *(nets[0]->seen) += interval * (n-1) * nets[0]->batch * nets[0]->subdivisions; + for (j = 0; j < n; ++j){ + *(nets[j]->seen) = *(nets[0]->seen); + } + for (j = 0; j < layers; ++j) { + threads[j] = sync_layer_in_thread(nets, n, j); + } + for (j = 0; j < layers; ++j) { + pthread_join(threads[j], 0); + } + free(threads); +} + +float train_networks(network **nets, int n, data d, int interval) +{ + int i; + int batch = nets[0]->batch; + int subdivisions = nets[0]->subdivisions; + assert(batch * subdivisions * n == d.X.rows); + pthread_t *threads = (pthread_t *) calloc(n, sizeof(pthread_t)); + float *errors = (float *) calloc(n, sizeof(float)); + + float sum = 0; + for(i = 0; i < n; ++i){ + data p = get_data_part(d, i, n); + threads[i] = train_network_in_thread(nets[i], p, errors + i); + } + for(i = 0; i < n; ++i){ + pthread_join(threads[i], 0); + //printf("%f\n", errors[i]); + sum += errors[i]; + } + //cudaDeviceSynchronize(); + if (get_current_batch(nets[0]) % interval == 0) { + printf("Syncing... "); + fflush(stdout); + sync_nets(nets, n, interval); + printf("Done!\n"); + } + //cudaDeviceSynchronize(); + free(threads); + free(errors); + return (float)sum/(n); +} + +void pull_network_output(network *net) +{ + layer l = get_network_output_layer(net); + cuda_pull_array(l.output_gpu, l.output, l.outputs*l.batch); +} + +#endif diff --git a/src/network.h b/src/network.h index 4e956cbff64..1b0dfd1aaa3 100644 --- a/src/network.h +++ b/src/network.h @@ -10,22 +10,20 @@ #ifdef GPU -float train_network_datum_gpu(network net); -float *network_predict_gpu(network net, float *input); -void pull_network_output(network net); +void pull_network_output(network *net); #endif -void compare_networks(network n1, network n2, data d); +void compare_networks(network *n1, network *n2, data d); char *get_layer_string(LAYER_TYPE a); -network make_network(int n); +network *make_network(int n); -float network_accuracy_multi(network net, data d, int n); -int get_predicted_class_network(network net); -void print_network(network net); +float network_accuracy_multi(network *net, data d, int n); +int get_predicted_class_network(network *net); +void print_network(network *net); int resize_network(network *net, int w, int h); -void calc_network_cost(network net); +void calc_network_cost(network *net); #endif diff --git a/src/network_kernels.cu b/src/network_kernels.cu deleted file mode 100644 index e14c156d785..00000000000 --- a/src/network_kernels.cu +++ /dev/null @@ -1,422 +0,0 @@ -#include "cuda_runtime.h" -#include "curand.h" -#include "cublas_v2.h" - -extern "C" { -#include -#include -#include - -#include "network.h" -#include "data.h" -#include "utils.h" -#include "parser.h" - -#include "crop_layer.h" -#include "connected_layer.h" -#include "rnn_layer.h" -#include "gru_layer.h" -#include "crnn_layer.h" -#include "detection_layer.h" -#include "region_layer.h" -#include "convolutional_layer.h" -#include "activation_layer.h" -#include "maxpool_layer.h" -#include "reorg_layer.h" -#include "avgpool_layer.h" -#include "normalization_layer.h" -#include "batchnorm_layer.h" -#include "cost_layer.h" -#include "local_layer.h" -#include "softmax_layer.h" -#include "dropout_layer.h" -#include "route_layer.h" -#include "shortcut_layer.h" -#include "blas.h" -} - -void forward_network_gpu(network net) -{ - int i; - for(i = 0; i < net.n; ++i){ - net.index = i; - layer l = net.layers[i]; - if(l.delta_gpu){ - fill_gpu(l.outputs * l.batch, 0, l.delta_gpu, 1); - } - l.forward_gpu(l, net); - net.input_gpu = l.output_gpu; - net.input = l.output; - if(l.truth) { - net.truth_gpu = l.output_gpu; - net.truth = l.output; - } - } - pull_network_output(net); - calc_network_cost(net); -} - -void backward_network_gpu(network net) -{ - int i; - network orig = net; - for(i = net.n-1; i >= 0; --i){ - layer l = net.layers[i]; - if(l.stopbackward) break; - if(i == 0){ - net = orig; - }else{ - layer prev = net.layers[i-1]; - net.input = prev.output; - net.delta = prev.delta; - net.input_gpu = prev.output_gpu; - net.delta_gpu = prev.delta_gpu; - } - net.index = i; - l.backward_gpu(l, net); - } -} - -void update_network_gpu(network net) -{ - cuda_set_device(net.gpu_index); - int i; - update_args a = {0}; - a.batch = net.batch*net.subdivisions; - a.learning_rate = get_current_rate(net); - a.momentum = net.momentum; - a.decay = net.decay; - a.adam = net.adam; - a.B1 = net.B1; - a.B2 = net.B2; - a.eps = net.eps; - ++*net.t; - a.t = (*net.t); - - for(i = 0; i < net.n; ++i){ - layer l = net.layers[i]; - if(l.update_gpu){ - l.update_gpu(l, a); - } - } -} - -void harmless_update_network_gpu(network net) -{ - cuda_set_device(net.gpu_index); - int i; - for(i = 0; i < net.n; ++i){ - layer l = net.layers[i]; - if(l.weight_updates_gpu) fill_gpu(l.nweights, 0, l.weight_updates_gpu, 1); - if(l.bias_updates_gpu) fill_gpu(l.nbiases, 0, l.bias_updates_gpu, 1); - if(l.scale_updates_gpu) fill_gpu(l.nbiases, 0, l.scale_updates_gpu, 1); - } -} - -float train_network_datum_gpu(network net) -{ - *net.seen += net.batch; - - int x_size = net.inputs*net.batch; - int y_size = net.truths*net.batch; - cuda_push_array(net.input_gpu, net.input, x_size); - cuda_push_array(net.truth_gpu, net.truth, y_size); - - net.train = 1; - forward_network_gpu(net); - backward_network_gpu(net); - - float error = *net.cost; - if (((*net.seen) / net.batch) % net.subdivisions == 0) update_network_gpu(net); - - return error; -} - -typedef struct { - network net; - data d; - float *err; -} train_args; - -void *train_thread(void *ptr) -{ - train_args args = *(train_args*)ptr; - free(ptr); - cuda_set_device(args.net.gpu_index); - *args.err = train_network(args.net, args.d); - return 0; -} - -pthread_t train_network_in_thread(network net, data d, float *err) -{ - pthread_t thread; - train_args *ptr = (train_args *)calloc(1, sizeof(train_args)); - ptr->net = net; - ptr->d = d; - ptr->err = err; - if(pthread_create(&thread, 0, train_thread, ptr)) error("Thread creation failed"); - return thread; -} - -void merge_weights(layer l, layer base) -{ - if (l.type == CONVOLUTIONAL) { - axpy_cpu(l.n, 1, l.bias_updates, 1, base.biases, 1); - axpy_cpu(l.nweights, 1, l.weight_updates, 1, base.weights, 1); - if (l.scales) { - axpy_cpu(l.n, 1, l.scale_updates, 1, base.scales, 1); - } - } else if(l.type == CONNECTED) { - axpy_cpu(l.outputs, 1, l.bias_updates, 1, base.biases, 1); - axpy_cpu(l.outputs*l.inputs, 1, l.weight_updates, 1, base.weights, 1); - } -} - -void scale_weights(layer l, float s) -{ - if (l.type == CONVOLUTIONAL) { - scal_cpu(l.n, s, l.biases, 1); - scal_cpu(l.nweights, s, l.weights, 1); - if (l.scales) { - scal_cpu(l.n, s, l.scales, 1); - } - } else if(l.type == CONNECTED) { - scal_cpu(l.outputs, s, l.biases, 1); - scal_cpu(l.outputs*l.inputs, s, l.weights, 1); - } -} - - -void pull_weights(layer l) -{ - if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ - cuda_pull_array(l.biases_gpu, l.bias_updates, l.n); - cuda_pull_array(l.weights_gpu, l.weight_updates, l.nweights); - if(l.scales) cuda_pull_array(l.scales_gpu, l.scale_updates, l.n); - } else if(l.type == CONNECTED){ - cuda_pull_array(l.biases_gpu, l.bias_updates, l.outputs); - cuda_pull_array(l.weights_gpu, l.weight_updates, l.outputs*l.inputs); - } -} - -void push_weights(layer l) -{ - if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ - cuda_push_array(l.biases_gpu, l.biases, l.n); - cuda_push_array(l.weights_gpu, l.weights, l.nweights); - if(l.scales) cuda_push_array(l.scales_gpu, l.scales, l.n); - } else if(l.type == CONNECTED){ - cuda_push_array(l.biases_gpu, l.biases, l.outputs); - cuda_push_array(l.weights_gpu, l.weights, l.outputs*l.inputs); - } -} - -void distribute_weights(layer l, layer base) -{ - if (l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL) { - cuda_push_array(l.biases_gpu, base.biases, l.n); - cuda_push_array(l.weights_gpu, base.weights, l.nweights); - if (base.scales) cuda_push_array(l.scales_gpu, base.scales, l.n); - } else if (l.type == CONNECTED) { - cuda_push_array(l.biases_gpu, base.biases, l.outputs); - cuda_push_array(l.weights_gpu, base.weights, l.outputs*l.inputs); - } -} - - -/* - -void pull_updates(layer l) -{ - if(l.type == CONVOLUTIONAL){ - cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.n); - cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.nweights); - if(l.scale_updates) cuda_pull_array(l.scale_updates_gpu, l.scale_updates, l.n); - } else if(l.type == CONNECTED){ - cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.outputs); - cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.outputs*l.inputs); - } -} - -void push_updates(layer l) -{ - if(l.type == CONVOLUTIONAL){ - cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.n); - cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.nweights); - if(l.scale_updates) cuda_push_array(l.scale_updates_gpu, l.scale_updates, l.n); - } else if(l.type == CONNECTED){ - cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.outputs); - cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.outputs*l.inputs); - } -} - -void update_layer(layer l, network net) -{ - int update_batch = net.batch*net.subdivisions; - float rate = get_current_rate(net); - l.t = get_current_batch(net); - if(l.update_gpu){ - l.update_gpu(l, update_batch, rate*l.learning_rate_scale, net.momentum, net.decay); - } -} -void merge_updates(layer l, layer base) -{ - if (l.type == CONVOLUTIONAL) { - axpy_cpu(l.n, 1, l.bias_updates, 1, base.bias_updates, 1); - axpy_cpu(l.nweights, 1, l.weight_updates, 1, base.weight_updates, 1); - if (l.scale_updates) { - axpy_cpu(l.n, 1, l.scale_updates, 1, base.scale_updates, 1); - } - } else if(l.type == CONNECTED) { - axpy_cpu(l.outputs, 1, l.bias_updates, 1, base.bias_updates, 1); - axpy_cpu(l.outputs*l.inputs, 1, l.weight_updates, 1, base.weight_updates, 1); - } -} - -void distribute_updates(layer l, layer base) -{ - if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ - cuda_push_array(l.bias_updates_gpu, base.bias_updates, l.n); - cuda_push_array(l.weight_updates_gpu, base.weight_updates, l.nweights); - if(base.scale_updates) cuda_push_array(l.scale_updates_gpu, base.scale_updates, l.n); - } else if(l.type == CONNECTED){ - cuda_push_array(l.bias_updates_gpu, base.bias_updates, l.outputs); - cuda_push_array(l.weight_updates_gpu, base.weight_updates, l.outputs*l.inputs); - } -} -*/ - -/* -void sync_layer(network *nets, int n, int j) -{ - int i; - network net = nets[0]; - layer base = net.layers[j]; - scale_weights(base, 0); - for (i = 0; i < n; ++i) { - cuda_set_device(nets[i].gpu_index); - layer l = nets[i].layers[j]; - pull_weights(l); - merge_weights(l, base); - } - scale_weights(base, 1./n); - for (i = 0; i < n; ++i) { - cuda_set_device(nets[i].gpu_index); - layer l = nets[i].layers[j]; - distribute_weights(l, base); - } -} -*/ - -void sync_layer(network *nets, int n, int j) -{ - int i; - network net = nets[0]; - layer base = net.layers[j]; - scale_weights(base, 0); - for (i = 0; i < n; ++i) { - cuda_set_device(nets[i].gpu_index); - layer l = nets[i].layers[j]; - pull_weights(l); - merge_weights(l, base); - } - scale_weights(base, 1./n); - for (i = 0; i < n; ++i) { - cuda_set_device(nets[i].gpu_index); - layer l = nets[i].layers[j]; - distribute_weights(l, base); - } -} - -typedef struct{ - network *nets; - int n; - int j; -} sync_args; - -void *sync_layer_thread(void *ptr) -{ - sync_args args = *(sync_args*)ptr; - sync_layer(args.nets, args.n, args.j); - free(ptr); - return 0; -} - -pthread_t sync_layer_in_thread(network *nets, int n, int j) -{ - pthread_t thread; - sync_args *ptr = (sync_args *)calloc(1, sizeof(sync_args)); - ptr->nets = nets; - ptr->n = n; - ptr->j = j; - if(pthread_create(&thread, 0, sync_layer_thread, ptr)) error("Thread creation failed"); - return thread; -} - -void sync_nets(network *nets, int n, int interval) -{ - int j; - int layers = nets[0].n; - pthread_t *threads = (pthread_t *) calloc(layers, sizeof(pthread_t)); - - *nets[0].seen += interval * (n-1) * nets[0].batch * nets[0].subdivisions; - for (j = 0; j < n; ++j){ - *nets[j].seen = *nets[0].seen; - } - for (j = 0; j < layers; ++j) { - threads[j] = sync_layer_in_thread(nets, n, j); - } - for (j = 0; j < layers; ++j) { - pthread_join(threads[j], 0); - } - free(threads); -} - -float train_networks(network *nets, int n, data d, int interval) -{ - int i; - int batch = nets[0].batch; - int subdivisions = nets[0].subdivisions; - assert(batch * subdivisions * n == d.X.rows); - pthread_t *threads = (pthread_t *) calloc(n, sizeof(pthread_t)); - float *errors = (float *) calloc(n, sizeof(float)); - - float sum = 0; - for(i = 0; i < n; ++i){ - data p = get_data_part(d, i, n); - threads[i] = train_network_in_thread(nets[i], p, errors + i); - } - for(i = 0; i < n; ++i){ - pthread_join(threads[i], 0); - //printf("%f\n", errors[i]); - sum += errors[i]; - } - //cudaDeviceSynchronize(); - if (get_current_batch(nets[0]) % interval == 0) { - printf("Syncing... "); - fflush(stdout); - sync_nets(nets, n, interval); - printf("Done!\n"); - } - //cudaDeviceSynchronize(); - free(threads); - free(errors); - return (float)sum/(n); -} - -void pull_network_output(network net) -{ - layer l = get_network_output_layer(net); - cuda_pull_array(l.output_gpu, l.output, l.outputs*l.batch); -} - -float *network_predict_gpu(network net, float *input) -{ - cuda_set_device(net.gpu_index); - cuda_push_array(net.input_gpu, input, net.inputs*net.batch); - net.truth = 0; - net.train = 0; - forward_network_gpu(net); - return net.output; -} - diff --git a/src/parser.c b/src/parser.c index 3e414aecef2..14914bc908d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -116,7 +116,7 @@ typedef struct size_params{ int c; int index; int time_steps; - network net; + network *net; } size_params; local_layer parse_local(list *options, size_params params) @@ -160,7 +160,7 @@ layer parse_deconvolutional(list *options, size_params params) int padding = option_find_int_quiet(options, "padding",0); if(pad) padding = size/2; - layer l = make_deconvolutional_layer(batch,h,w,c,n,size,stride,padding, activation, batch_normalize, params.net.adam); + layer l = make_deconvolutional_layer(batch,h,w,c,n,size,stride,padding, activation, batch_normalize, params.net->adam); return l; } @@ -189,7 +189,7 @@ convolutional_layer parse_convolutional(list *options, size_params params) int binary = option_find_int_quiet(options, "binary", 0); int xnor = option_find_int_quiet(options, "xnor", 0); - convolutional_layer layer = make_convolutional_layer(batch,h,w,c,n,groups,size,stride,padding,activation, batch_normalize, binary, xnor, params.net.adam); + convolutional_layer layer = make_convolutional_layer(batch,h,w,c,n,groups,size,stride,padding,activation, batch_normalize, binary, xnor, params.net->adam); layer.flipped = option_find_int_quiet(options, "flipped", 0); layer.dot = option_find_float_quiet(options, "dot", 0); @@ -218,7 +218,7 @@ layer parse_rnn(list *options, size_params params) ACTIVATION activation = get_activation(activation_s); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - layer l = make_rnn_layer(params.batch, params.inputs, output, params.time_steps, activation, batch_normalize, params.net.adam); + layer l = make_rnn_layer(params.batch, params.inputs, output, params.time_steps, activation, batch_normalize, params.net->adam); l.shortcut = option_find_int_quiet(options, "shortcut", 0); @@ -230,7 +230,7 @@ layer parse_gru(list *options, size_params params) int output = option_find_int(options, "output",1); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - layer l = make_gru_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize, params.net.adam); + layer l = make_gru_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize, params.net->adam); l.tanh = option_find_int_quiet(options, "tanh", 0); return l; @@ -241,7 +241,7 @@ layer parse_lstm(list *options, size_params params) int output = option_find_int(options, "output", 1); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - layer l = make_lstm_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize, params.net.adam); + layer l = make_lstm_layer(params.batch, params.inputs, output, params.time_steps, batch_normalize, params.net->adam); return l; } @@ -253,7 +253,7 @@ layer parse_connected(list *options, size_params params) ACTIVATION activation = get_activation(activation_s); int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0); - layer l = make_connected_layer(params.batch, params.inputs, output, activation, batch_normalize, params.net.adam); + layer l = make_connected_layer(params.batch, params.inputs, output, activation, batch_normalize, params.net->adam); return l; } @@ -456,14 +456,14 @@ layer parse_batchnorm(list *options, size_params params) return l; } -layer parse_shortcut(list *options, size_params params, network net) +layer parse_shortcut(list *options, size_params params, network *net) { char *l = option_find(options, "from"); int index = atoi(l); if(index < 0) index = params.index + index; int batch = params.batch; - layer from = net.layers[index]; + layer from = net->layers[index]; layer s = make_shortcut_layer(batch, index, params.w, params.h, params.c, from.out_w, from.out_h, from.out_c); @@ -491,7 +491,7 @@ layer parse_activation(list *options, size_params params) return l; } -route_layer parse_route(list *options, size_params params, network net) +route_layer parse_route(list *options, size_params params, network *net) { char *l = option_find(options, "layers"); int len = strlen(l); @@ -509,19 +509,19 @@ route_layer parse_route(list *options, size_params params, network net) l = strchr(l, ',')+1; if(index < 0) index = params.index + index; layers[i] = index; - sizes[i] = net.layers[index].outputs; + sizes[i] = net->layers[index].outputs; } int batch = params.batch; route_layer layer = make_route_layer(batch, n, layers, sizes); - convolutional_layer first = net.layers[layers[0]]; + convolutional_layer first = net->layers[layers[0]]; layer.out_w = first.out_w; layer.out_h = first.out_h; layer.out_c = first.out_c; for(i = 1; i < n; ++i){ int index = layers[i]; - convolutional_layer next = net.layers[index]; + convolutional_layer next = net->layers[index]; if(next.out_w == first.out_w && next.out_h == first.out_h){ layer.out_c += next.out_c; }else{ @@ -557,6 +557,7 @@ void parse_net_options(list *options, network *net) net->batch /= subdivs; net->batch *= net->time_steps; net->subdivisions = subdivs; + net->random = option_find_int_quiet(options, "random", 0); net->adam = option_find_int_quiet(options, "adam", 0); if(net->adam){ @@ -571,6 +572,8 @@ void parse_net_options(list *options, network *net) net->inputs = option_find_int_quiet(options, "inputs", net->h * net->w * net->c); net->max_crop = option_find_int_quiet(options, "max_crop",net->w*2); net->min_crop = option_find_int_quiet(options, "min_crop",net->w); + net->max_ratio = option_find_float_quiet(options, "max_ratio", (float) net->max_crop / net->w); + net->min_ratio = option_find_float_quiet(options, "min_ratio", (float) net->min_crop / net->w); net->center = option_find_int_quiet(options, "center",0); net->angle = option_find_float_quiet(options, "angle", 0); @@ -628,26 +631,26 @@ int is_network(section *s) || strcmp(s->type, "[network]")==0); } -network parse_network_cfg(char *filename) +network *parse_network_cfg(char *filename) { list *sections = read_cfg(filename); node *n = sections->front; if(!n) error("Config file has no sections"); - network net = make_network(sections->size - 1); - net.gpu_index = gpu_index; + network *net = make_network(sections->size - 1); + net->gpu_index = gpu_index; size_params params; section *s = (section *)n->val; list *options = s->options; if(!is_network(s)) error("First section must be [net] or [network]"); - parse_net_options(options, &net); - - params.h = net.h; - params.w = net.w; - params.c = net.c; - params.inputs = net.inputs; - params.batch = net.batch; - params.time_steps = net.time_steps; + parse_net_options(options, net); + + params.h = net->h; + params.w = net->w; + params.c = net->c; + params.inputs = net->inputs; + params.batch = net->batch; + params.time_steps = net->time_steps; params.net = net; size_t workspace_size = 0; @@ -690,7 +693,7 @@ network parse_network_cfg(char *filename) l = parse_detection(options, params); }else if(lt == SOFTMAX){ l = parse_softmax(options, params); - net.hierarchy = l.softmax_tree; + net->hierarchy = l.softmax_tree; }else if(lt == NORMALIZATION){ l = parse_normalization(options, params); }else if(lt == BATCHNORM){ @@ -707,11 +710,11 @@ network parse_network_cfg(char *filename) l = parse_shortcut(options, params, net); }else if(lt == DROPOUT){ l = parse_dropout(options, params); - l.output = net.layers[count-1].output; - l.delta = net.layers[count-1].delta; + l.output = net->layers[count-1].output; + l.delta = net->layers[count-1].delta; #ifdef GPU - l.output_gpu = net.layers[count-1].output_gpu; - l.delta_gpu = net.layers[count-1].delta_gpu; + l.output_gpu = net->layers[count-1].output_gpu; + l.delta_gpu = net->layers[count-1].delta_gpu; #endif }else{ fprintf(stderr, "Type not recognized: %s\n", s->type); @@ -724,7 +727,7 @@ network parse_network_cfg(char *filename) l.learning_rate_scale = option_find_float_quiet(options, "learning_rate", 1); l.smooth = option_find_float_quiet(options, "smooth", 0); option_unused(options); - net.layers[count] = l; + net->layers[count] = l; if (l.workspace_size > workspace_size) workspace_size = l.workspace_size; free_section(s); n = n->next; @@ -738,27 +741,27 @@ network parse_network_cfg(char *filename) } free_list(sections); layer out = get_network_output_layer(net); - net.outputs = out.outputs; - net.truths = out.outputs; - if(net.layers[net.n-1].truths) net.truths = net.layers[net.n-1].truths; - net.output = out.output; - net.input = calloc(net.inputs*net.batch, sizeof(float)); - net.truth = calloc(net.truths*net.batch, sizeof(float)); + net->outputs = out.outputs; + net->truths = out.outputs; + if(net->layers[net->n-1].truths) net->truths = net->layers[net->n-1].truths; + net->output = out.output; + net->input = calloc(net->inputs*net->batch, sizeof(float)); + net->truth = calloc(net->truths*net->batch, sizeof(float)); #ifdef GPU - net.output_gpu = out.output_gpu; - net.input_gpu = cuda_make_array(net.input, net.inputs*net.batch); - net.truth_gpu = cuda_make_array(net.truth, net.truths*net.batch); + net->output_gpu = out.output_gpu; + net->input_gpu = cuda_make_array(net->input, net->inputs*net->batch); + net->truth_gpu = cuda_make_array(net->truth, net->truths*net->batch); #endif if(workspace_size){ //printf("%ld\n", workspace_size); #ifdef GPU if(gpu_index >= 0){ - net.workspace = cuda_make_array(0, (workspace_size-1)/sizeof(float)+1); + net->workspace = cuda_make_array(0, (workspace_size-1)/sizeof(float)+1); }else { - net.workspace = calloc(1, workspace_size); + net->workspace = calloc(1, workspace_size); } #else - net.workspace = calloc(1, workspace_size); + net->workspace = calloc(1, workspace_size); #endif } return net; @@ -880,11 +883,11 @@ void save_connected_weights(layer l, FILE *fp) } } -void save_weights_upto(network net, char *filename, int cutoff) +void save_weights_upto(network *net, char *filename, int cutoff) { #ifdef GPU - if(net.gpu_index >= 0){ - cuda_set_device(net.gpu_index); + if(net->gpu_index >= 0){ + cuda_set_device(net->gpu_index); } #endif fprintf(stderr, "Saving weights to %s\n", filename); @@ -897,11 +900,11 @@ void save_weights_upto(network net, char *filename, int cutoff) fwrite(&major, sizeof(int), 1, fp); fwrite(&minor, sizeof(int), 1, fp); fwrite(&revision, sizeof(int), 1, fp); - fwrite(net.seen, sizeof(size_t), 1, fp); + fwrite(net->seen, sizeof(size_t), 1, fp); int i; - for(i = 0; i < net.n && i < cutoff; ++i){ - layer l = net.layers[i]; + for(i = 0; i < net->n && i < cutoff; ++i){ + layer l = net->layers[i]; if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ save_convolutional_weights(l, fp); } if(l.type == CONNECTED){ @@ -952,9 +955,9 @@ void save_weights_upto(network net, char *filename, int cutoff) } fclose(fp); } -void save_weights(network net, char *filename) +void save_weights(network *net, char *filename) { - save_weights_upto(net, filename, net.n); + save_weights_upto(net, filename, net->n); } void transpose_matrix(float *a, int rows, int cols) diff --git a/src/region_layer.c b/src/region_layer.c index f6f4828c98f..449957c3c56 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -109,7 +109,7 @@ void delta_region_mask(float *truth, float *x, int n, int index, float *delta, i } -void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, int stride, float *avg_cat) +void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, int stride, float *avg_cat, int tag) { int i, n; if(hier){ @@ -127,7 +127,7 @@ void delta_region_class(float *output, float *delta, int index, int class, int c } *avg_cat += pred; } else { - if (delta[index]){ + if (delta[index] && tag){ delta[index + stride*class] = scale * (1 - output[index + stride*class]); return; } @@ -218,7 +218,7 @@ void forward_region_layer(const layer l, network net) } int class_index = entry_index(l, b, maxi, l.coords + 1); int obj_index = entry_index(l, b, maxi, l.coords); - delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax); if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); else l.delta[obj_index] = 0; l.delta[obj_index] = 0; @@ -316,7 +316,7 @@ void forward_region_layer(const layer l, network net) int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; if (l.map) class = l.map[class]; int class_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, l.coords + 1); - delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax); ++count; ++class_count; } From c7252703420159a9f3a1ec416b1b4326c4c95402 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 17 Oct 2017 12:44:17 -0700 Subject: [PATCH 054/118] WHOOOPS! :fire: :fire: :fire: --- examples/attention.c | 326 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 examples/attention.c diff --git a/examples/attention.c b/examples/attention.c new file mode 100644 index 00000000000..e7f15245f3f --- /dev/null +++ b/examples/attention.c @@ -0,0 +1,326 @@ +#include "darknet.h" + +#include +#include + +void train_attention(char *datacfg, char *cfgfile, char *weightfile, char *cfgfile2, char *weightfile2, int *gpus, int ngpus, int clear) +{ + int i; + + float avg_loss = -1; + char *base = basecfg(cfgfile); + printf("%s\n", base); + printf("%d\n", ngpus); + network **attnets = calloc(ngpus, sizeof(network*)); + network **clsnets = calloc(ngpus, sizeof(network*)); + + srand(time(0)); + int seed = rand(); + for(i = 0; i < ngpus; ++i){ + srand(seed); +#ifdef GPU + cuda_set_device(gpus[i]); +#endif + attnets[i] = load_network(cfgfile, weightfile, clear); + attnets[i]->learning_rate *= ngpus; + clsnets[i] = load_network(cfgfile2, weightfile2, clear); + clsnets[i]->learning_rate *= ngpus; + } + srand(time(0)); + network *net = attnets[0]; + //network *clsnet = clsnets[0]; + + int imgs = net->batch * net->subdivisions * ngpus; + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + list *options = read_data_cfg(datacfg); + + char *backup_directory = option_find_str(options, "backup", "/backup/"); + char *label_list = option_find_str(options, "labels", "data/labels.list"); + char *train_list = option_find_str(options, "train", "data/train.list"); + int classes = option_find_int(options, "classes", 2); + + char **labels = get_labels(label_list); + list *plist = get_paths(train_list); + char **paths = (char **)list_to_array(plist); + printf("%d\n", plist->size); + int N = plist->size; + double time; + + load_args args = {0}; + args.w = 4*net->w; + args.h = 4*net->h; + args.size = 4*net->w; + args.threads = 32; + args.hierarchy = net->hierarchy; + + args.min = net->min_ratio*net->w; + args.max = net->max_ratio*net->w; + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; + + args.paths = paths; + args.classes = classes; + args.n = imgs; + args.m = N; + args.labels = labels; + args.type = CLASSIFICATION_DATA; + + data train; + data buffer; + pthread_t load_thread; + args.d = &buffer; + load_thread = load_data(args); + + int epoch = (*net->seen)/N; + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ + time = what_time_is_it_now(); + + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data(args); + data resized = resize_data(train, net->w, net->h); + + printf("Loaded: %lf seconds\n", what_time_is_it_now()-time); + time = what_time_is_it_now(); + + float loss = 0; +#ifdef GPU + if(ngpus == 1){ + loss = train_network(net, train); + } else { + loss = train_networks(attnets, ngpus, train, 4); + } +#else + loss = train_network(net, train); +#endif + free_data(resized); + if(avg_loss == -1) avg_loss = loss; + avg_loss = avg_loss*.9 + loss*.1; + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen); + free_data(train); + if(*net->seen/N > epoch){ + epoch = *net->seen/N; + char buff[256]; + sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); + save_weights(net, buff); + } + if(get_current_batch(net)%1000 == 0){ + char buff[256]; + sprintf(buff, "%s/%s.backup",backup_directory,base); + save_weights(net, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s.weights", backup_directory, base); + save_weights(net, buff); + pthread_join(load_thread, 0); + + free_network(net); + free_ptrs((void**)labels, classes); + free_ptrs((void**)paths, plist->size); + free_list(plist); + free(base); +} + +void validate_attention_single(char *datacfg, char *filename, char *weightfile) +{ + int i, j; + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); + srand(time(0)); + + list *options = read_data_cfg(datacfg); + + char *label_list = option_find_str(options, "labels", "data/labels.list"); + char *leaf_list = option_find_str(options, "leaves", 0); + if(leaf_list) change_leaves(net->hierarchy, leaf_list); + char *valid_list = option_find_str(options, "valid", "data/train.list"); + int classes = option_find_int(options, "classes", 2); + int topk = option_find_int(options, "top", 1); + + char **labels = get_labels(label_list); + list *plist = get_paths(valid_list); + + char **paths = (char **)list_to_array(plist); + int m = plist->size; + free_list(plist); + + float avg_acc = 0; + float avg_topk = 0; + int *indexes = calloc(topk, sizeof(int)); + + for(i = 0; i < m; ++i){ + int class = -1; + char *path = paths[i]; + for(j = 0; j < classes; ++j){ + if(strstr(path, labels[j])){ + class = j; + break; + } + } + image im = load_image_color(paths[i], 0, 0); + image resized = resize_min(im, net->w); + image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h); + //show_image(im, "orig"); + //show_image(crop, "cropped"); + //cvWaitKey(0); + float *pred = network_predict(net, crop.data); + if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 1, 1); + + if(resized.data != im.data) free_image(resized); + free_image(im); + free_image(crop); + top_k(pred, classes, topk, indexes); + + if(indexes[0] == class) avg_acc += 1; + for(j = 0; j < topk; ++j){ + if(indexes[j] == class) avg_topk += 1; + } + + printf("%d: top 1: %f, top %d: %f\n", i, avg_acc/(i+1), topk, avg_topk/(i+1)); + } +} + +void validate_attention_multi(char *datacfg, char *filename, char *weightfile) +{ + int i, j; + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); + srand(time(0)); + + list *options = read_data_cfg(datacfg); + + char *label_list = option_find_str(options, "labels", "data/labels.list"); + char *valid_list = option_find_str(options, "valid", "data/train.list"); + int classes = option_find_int(options, "classes", 2); + int topk = option_find_int(options, "top", 1); + + char **labels = get_labels(label_list); + list *plist = get_paths(valid_list); + int scales[] = {224, 288, 320, 352, 384}; + int nscales = sizeof(scales)/sizeof(scales[0]); + + char **paths = (char **)list_to_array(plist); + int m = plist->size; + free_list(plist); + + float avg_acc = 0; + float avg_topk = 0; + int *indexes = calloc(topk, sizeof(int)); + + for(i = 0; i < m; ++i){ + int class = -1; + char *path = paths[i]; + for(j = 0; j < classes; ++j){ + if(strstr(path, labels[j])){ + class = j; + break; + } + } + float *pred = calloc(classes, sizeof(float)); + image im = load_image_color(paths[i], 0, 0); + for(j = 0; j < nscales; ++j){ + image r = resize_min(im, scales[j]); + resize_network(net, r.w, r.h); + float *p = network_predict(net, r.data); + if(net->hierarchy) hierarchy_predictions(p, net->outputs, net->hierarchy, 1 , 1); + axpy_cpu(classes, 1, p, 1, pred, 1); + flip_image(r); + p = network_predict(net, r.data); + axpy_cpu(classes, 1, p, 1, pred, 1); + if(r.data != im.data) free_image(r); + } + free_image(im); + top_k(pred, classes, topk, indexes); + free(pred); + if(indexes[0] == class) avg_acc += 1; + for(j = 0; j < topk; ++j){ + if(indexes[j] == class) avg_topk += 1; + } + + printf("%d: top 1: %f, top %d: %f\n", i, avg_acc/(i+1), topk, avg_topk/(i+1)); + } +} + +void predict_attention(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top) +{ + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); + srand(2222222); + + list *options = read_data_cfg(datacfg); + + char *name_list = option_find_str(options, "names", 0); + if(!name_list) name_list = option_find_str(options, "labels", "data/labels.list"); + if(top == 0) top = option_find_int(options, "top", 1); + + int i = 0; + char **names = get_labels(name_list); + clock_t time; + int *indexes = calloc(top, sizeof(int)); + char buff[256]; + char *input = buff; + while(1){ + if(filename){ + strncpy(input, filename, 256); + }else{ + printf("Enter Image Path: "); + fflush(stdout); + input = fgets(input, 256, stdin); + if(!input) return; + strtok(input, "\n"); + } + image im = load_image_color(input, 0, 0); + image r = letterbox_image(im, net->w, net->h); + //resize_network(&net, r.w, r.h); + //printf("%d %d\n", r.w, r.h); + + float *X = r.data; + time=clock(); + float *predictions = network_predict(net, X); + if(net->hierarchy) hierarchy_predictions(predictions, net->outputs, net->hierarchy, 1, 1); + top_k(predictions, net->outputs, top, indexes); + fprintf(stderr, "%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + for(i = 0; i < top; ++i){ + int index = indexes[i]; + //if(net->hierarchy) printf("%d, %s: %f, parent: %s \n",index, names[index], predictions[index], (net->hierarchy->parent[index] >= 0) ? names[net->hierarchy->parent[index]] : "Root"); + //else printf("%s: %f\n",names[index], predictions[index]); + printf("%5.2f%%: %s\n", predictions[index]*100, names[index]); + } + if(r.data != im.data) free_image(r); + free_image(im); + if (filename) break; + } +} + + +void run_attention(int argc, char **argv) +{ + if(argc < 4){ + fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]); + return; + } + + char *gpu_list = find_char_arg(argc, argv, "-gpus", 0); + int ngpus; + int *gpus = read_intlist(gpu_list, &ngpus, gpu_index); + + + int top = find_int_arg(argc, argv, "-t", 0); + int clear = find_arg(argc, argv, "-clear"); + char *data = argv[3]; + char *cfg = argv[4]; + char *weights = (argc > 5) ? argv[5] : 0; + char *filename = (argc > 6) ? argv[6]: 0; + char *layer_s = (argc > 7) ? argv[7]: 0; + if(0==strcmp(argv[2], "predict")) predict_attention(data, cfg, weights, filename, top); + else if(0==strcmp(argv[2], "train")) train_attention(data, cfg, weights, filename, layer_s, gpus, ngpus, clear); + else if(0==strcmp(argv[2], "valid")) validate_attention_single(data, cfg, weights); + else if(0==strcmp(argv[2], "validmulti")) validate_attention_multi(data, cfg, weights); +} + + From 3fb3eec6502ff8e9b77ce6d43d835b41d0c3241f Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 7 Nov 2017 16:10:33 -0800 Subject: [PATCH 055/118] OK SHOULD I START WORKING ON CVPR OR WHAT? --- examples/attention.c | 191 +++++-- examples/classifier.c | 2 +- examples/darknet.c | 3 + examples/detector-scipy-opencv.py | 56 +++ examples/detector.c | 2 +- examples/go.c | 795 ++++++++++++++++++++++++------ include/darknet.h | 10 + python/darknet.py | 9 + src/activation_kernels.cu | 35 ++ src/data.c | 55 ++- src/utils.c | 30 ++ src/utils.h | 1 - 12 files changed, 992 insertions(+), 197 deletions(-) create mode 100644 examples/detector-scipy-opencv.py diff --git a/examples/attention.c b/examples/attention.c index e7f15245f3f..1afd8489316 100644 --- a/examples/attention.c +++ b/examples/attention.c @@ -3,16 +3,64 @@ #include #include -void train_attention(char *datacfg, char *cfgfile, char *weightfile, char *cfgfile2, char *weightfile2, int *gpus, int ngpus, int clear) +void extend_data_truth(data *d, int n, float val) { - int i; + int i, j; + for(i = 0; i < d->y.rows; ++i){ + d->y.vals[i] = realloc(d->y.vals[i], (d->y.cols+n)*sizeof(float)); + for(j = 0; j < n; ++j){ + d->y.vals[i][d->y.cols + j] = val; + } + } + d->y.cols += n; +} + +matrix network_loss_data(network *net, data test) +{ + int i,b; + int k = 1; + matrix pred = make_matrix(test.X.rows, k); + float *X = calloc(net->batch*test.X.cols, sizeof(float)); + float *y = calloc(net->batch*test.y.cols, sizeof(float)); + for(i = 0; i < test.X.rows; i += net->batch){ + for(b = 0; b < net->batch; ++b){ + if(i+b == test.X.rows) break; + memcpy(X+b*test.X.cols, test.X.vals[i+b], test.X.cols*sizeof(float)); + memcpy(y+b*test.y.cols, test.y.vals[i+b], test.y.cols*sizeof(float)); + } + + network orig = *net; + net->input = X; + net->truth = y; + net->train = 0; + net->delta = 0; + forward_network(net); + *net = orig; + + float *delta = net->layers[net->n-1].output; + for(b = 0; b < net->batch; ++b){ + if(i+b == test.X.rows) break; + int t = max_index(y + b*test.y.cols, 1000); + float err = sum_array(delta + b*net->outputs, net->outputs); + pred.vals[i+b][0] = -err; + //pred.vals[i+b][0] = 1-delta[b*net->outputs + t]; + } + } + free(X); + free(y); + return pred; +} + +void train_attention(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) +{ + int i, j; - float avg_loss = -1; + float avg_cls_loss = -1; + float avg_att_loss = -1; char *base = basecfg(cfgfile); printf("%s\n", base); printf("%d\n", ngpus); - network **attnets = calloc(ngpus, sizeof(network*)); - network **clsnets = calloc(ngpus, sizeof(network*)); + network **nets = calloc(ngpus, sizeof(network*)); srand(time(0)); int seed = rand(); @@ -21,14 +69,11 @@ void train_attention(char *datacfg, char *cfgfile, char *weightfile, char *cfgfi #ifdef GPU cuda_set_device(gpus[i]); #endif - attnets[i] = load_network(cfgfile, weightfile, clear); - attnets[i]->learning_rate *= ngpus; - clsnets[i] = load_network(cfgfile2, weightfile2, clear); - clsnets[i]->learning_rate *= ngpus; + nets[i] = load_network(cfgfile, weightfile, clear); + nets[i]->learning_rate *= ngpus; } srand(time(0)); - network *net = attnets[0]; - //network *clsnet = clsnets[0]; + network *net = nets[0]; int imgs = net->batch * net->subdivisions * ngpus; @@ -47,15 +92,18 @@ void train_attention(char *datacfg, char *cfgfile, char *weightfile, char *cfgfi int N = plist->size; double time; + int divs=3; + int size=2; + load_args args = {0}; - args.w = 4*net->w; - args.h = 4*net->h; - args.size = 4*net->w; + args.w = divs*net->w/size; + args.h = divs*net->h/size; + args.size = divs*net->w/size; args.threads = 32; args.hierarchy = net->hierarchy; - args.min = net->min_ratio*net->w; - args.max = net->max_ratio*net->w; + args.min = net->min_ratio*args.w; + args.max = net->max_ratio*args.w; args.angle = net->angle; args.aspect = net->aspect; args.exposure = net->exposure; @@ -83,25 +131,81 @@ void train_attention(char *datacfg, char *cfgfile, char *weightfile, char *cfgfi train = buffer; load_thread = load_data(args); data resized = resize_data(train, net->w, net->h); + extend_data_truth(&resized, divs*divs, 0); + data *tiles = tile_data(train, divs, size); printf("Loaded: %lf seconds\n", what_time_is_it_now()-time); time = what_time_is_it_now(); - float loss = 0; + float aloss = 0; + float closs = 0; + int z; + for (i = 0; i < divs*divs/ngpus; ++i) { +#pragma omp parallel for + for(j = 0; j < ngpus; ++j){ + int index = i*ngpus + j; + extend_data_truth(tiles+index, divs*divs, SECRET_NUM); + matrix deltas = network_loss_data(nets[j], tiles[index]); + for(z = 0; z < resized.y.rows; ++z){ + resized.y.vals[z][train.y.cols + index] = deltas.vals[z][0]; + } + free_matrix(deltas); + } + } + int *inds = calloc(resized.y.rows, sizeof(int)); + for(z = 0; z < resized.y.rows; ++z){ + int index = max_index(resized.y.vals[z] + train.y.cols, divs*divs); + inds[z] = index; + for(i = 0; i < divs*divs; ++i){ + resized.y.vals[z][train.y.cols + i] = (i == index)? 1 : 0; + } + } + data best = select_data(tiles, inds); + free(inds); + #ifdef GPU + if (ngpus == 1) { + closs = train_network(net, best); + } else { + closs = train_networks(nets, ngpus, best, 4); + } + #endif + for (i = 0; i < divs*divs; ++i) { + printf("%.2f ", resized.y.vals[0][train.y.cols + i]); + if((i+1)%divs == 0) printf("\n"); + free_data(tiles[i]); + } + free_data(best); + printf("\n"); + image im = float_to_image(64,64,3,resized.X.vals[0]); + //show_image(im, "orig"); + //cvWaitKey(100); + /* + image im1 = float_to_image(64,64,3,tiles[i].X.vals[0]); + image im2 = float_to_image(64,64,3,resized.X.vals[0]); + show_image(im1, "tile"); + show_image(im2, "res"); + */ #ifdef GPU - if(ngpus == 1){ - loss = train_network(net, train); + if (ngpus == 1) { + aloss = train_network(net, resized); } else { - loss = train_networks(attnets, ngpus, train, 4); + aloss = train_networks(nets, ngpus, resized, 4); } -#else - loss = train_network(net, train); #endif + for(i = 0; i < divs*divs; ++i){ + printf("%f ", nets[0]->output[1000 + i]); + if ((i+1) % divs == 0) printf("\n"); + } + printf("\n"); + free_data(resized); - if(avg_loss == -1) avg_loss = loss; - avg_loss = avg_loss*.9 + loss*.1; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen); free_data(train); + if(avg_cls_loss == -1) avg_cls_loss = closs; + if(avg_att_loss == -1) avg_att_loss = aloss; + avg_cls_loss = avg_cls_loss*.9 + closs*.1; + avg_att_loss = avg_att_loss*.9 + aloss*.1; + + printf("%ld, %.3f: Att: %f, %f avg, Class: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, aloss, avg_att_loss, closs, avg_cls_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen); if(*net->seen/N > epoch){ epoch = *net->seen/N; char buff[256]; @@ -152,6 +256,11 @@ void validate_attention_single(char *datacfg, char *filename, char *weightfile) float avg_acc = 0; float avg_topk = 0; int *indexes = calloc(topk, sizeof(int)); + int divs = 4; + int size = 2; + int extra = 0; + float *avgs = calloc(classes, sizeof(float)); + int *inds = calloc(divs*divs, sizeof(int)); for(i = 0; i < m; ++i){ int class = -1; @@ -163,14 +272,38 @@ void validate_attention_single(char *datacfg, char *filename, char *weightfile) } } image im = load_image_color(paths[i], 0, 0); - image resized = resize_min(im, net->w); - image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h); + image resized = resize_min(im, net->w*divs/size); + image crop = crop_image(resized, (resized.w - net->w*divs/size)/2, (resized.h - net->h*divs/size)/2, net->w*divs/size, net->h*divs/size); + image rcrop = resize_image(crop, net->w, net->h); //show_image(im, "orig"); //show_image(crop, "cropped"); //cvWaitKey(0); - float *pred = network_predict(net, crop.data); + float *pred = network_predict(net, rcrop.data); + //pred[classes + 56] = 0; + for(j = 0; j < divs*divs; ++j){ + printf("%.2f ", pred[classes + j]); + if((j+1)%divs == 0) printf("\n"); + } + printf("\n"); + copy_cpu(classes, pred, 1, avgs, 1); + top_k(pred + classes, divs*divs, divs*divs, inds); + show_image(crop, "crop"); + for(j = 0; j < extra; ++j){ + int index = inds[j]; + int row = index / divs; + int col = index % divs; + int y = row * crop.h / divs - (net->h - crop.h/divs)/2; + int x = col * crop.w / divs - (net->w - crop.w/divs)/2; + printf("%d %d %d %d\n", row, col, y, x); + image tile = crop_image(crop, x, y, net->w, net->h); + float *pred = network_predict(net, tile.data); + axpy_cpu(classes, 1., pred, 1, avgs, 1); + show_image(tile, "tile"); + cvWaitKey(10); + } if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 1, 1); + if(rcrop.data != resized.data) free_image(rcrop); if(resized.data != im.data) free_image(resized); free_image(im); free_image(crop); @@ -318,7 +451,7 @@ void run_attention(int argc, char **argv) char *filename = (argc > 6) ? argv[6]: 0; char *layer_s = (argc > 7) ? argv[7]: 0; if(0==strcmp(argv[2], "predict")) predict_attention(data, cfg, weights, filename, top); - else if(0==strcmp(argv[2], "train")) train_attention(data, cfg, weights, filename, layer_s, gpus, ngpus, clear); + else if(0==strcmp(argv[2], "train")) train_attention(data, cfg, weights, gpus, ngpus, clear); else if(0==strcmp(argv[2], "valid")) validate_attention_single(data, cfg, weights); else if(0==strcmp(argv[2], "validmulti")) validate_attention_multi(data, cfg, weights); } diff --git a/examples/classifier.c b/examples/classifier.c index ad80e5f7ba6..8843e5484cb 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -447,7 +447,7 @@ void validate_classifier_multi(char *datacfg, char *cfg, char *weights) float *pred = calloc(classes, sizeof(float)); image im = load_image_color(paths[i], 0, 0); for(j = 0; j < nscales; ++j){ - image r = resize_min(im, scales[j]); + image r = resize_max(im, scales[j]); resize_network(net, r.w, r.h); float *p = network_predict(net, r.data); if(net->hierarchy) hierarchy_predictions(p, net->outputs, net->hierarchy, 1 , 1); diff --git a/examples/darknet.c b/examples/darknet.c index c67f20a1090..b89f69aba65 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -12,6 +12,7 @@ extern void run_coco(int argc, char **argv); extern void run_captcha(int argc, char **argv); extern void run_nightmare(int argc, char **argv); extern void run_classifier(int argc, char **argv); +extern void run_attention(int argc, char **argv); extern void run_regressor(int argc, char **argv); extern void run_segmenter(int argc, char **argv); extern void run_char_rnn(int argc, char **argv); @@ -431,6 +432,8 @@ int main(int argc, char **argv) predict_classifier("cfg/imagenet1k.data", argv[2], argv[3], argv[4], 5); } else if (0 == strcmp(argv[1], "classifier")){ run_classifier(argc, argv); + } else if (0 == strcmp(argv[1], "attention")){ + run_attention(argc, argv); } else if (0 == strcmp(argv[1], "regressor")){ run_regressor(argc, argv); } else if (0 == strcmp(argv[1], "segmenter")){ diff --git a/examples/detector-scipy-opencv.py b/examples/detector-scipy-opencv.py new file mode 100644 index 00000000000..3bfc591312a --- /dev/null +++ b/examples/detector-scipy-opencv.py @@ -0,0 +1,56 @@ +# Stupid python path shit. +# Instead just add darknet.py to somewhere in your python path +# OK actually that might not be a great idea, idk, work in progress +# Use at your own risk. or don't, i don't care + +from scipy.misc import imread +import cv2 + +def array_to_image(arr): + arr = arr.transpose(2,0,1) + c = arr.shape[0] + h = arr.shape[1] + w = arr.shape[2] + arr = (arr/255.0).flatten() + data = dn.c_array(dn.c_float, arr) + im = dn.IMAGE(w,h,c,data) + return im + +def detect2(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45): + boxes = dn.make_boxes(net) + probs = dn.make_probs(net) + num = dn.num_boxes(net) + dn.network_detect(net, image, thresh, hier_thresh, nms, boxes, probs) + res = [] + for j in range(num): + for i in range(meta.classes): + if probs[j][i] > 0: + res.append((meta.names[i], probs[j][i], (boxes[j].x, boxes[j].y, boxes[j].w, boxes[j].h))) + res = sorted(res, key=lambda x: -x[1]) + dn.free_ptrs(dn.cast(probs, dn.POINTER(dn.c_void_p)), num) + return res + +import sys, os +sys.path.append(os.path.join(os.getcwd(),'python/')) + +import darknet as dn + +# Darknet +net = dn.load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0) +meta = dn.load_meta("cfg/coco.data") +r = dn.detect(net, meta, "data/dog.jpg") +print r + +# scipy +arr= imread('data/dog.jpg') +im = array_to_image(arr) +r = detect2(net, meta, im) +print r + +# OpenCV +arr = cv2.imread('data/dog.jpg') +im = array_to_image(arr) +dn.rgbgr_image(im) +r = detect2(net, meta, im) +print r + diff --git a/examples/detector.c b/examples/detector.c index ed6815d5d21..155753310b9 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -609,8 +609,8 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time); get_region_boxes(l, im.w, im.h, net->w, net->h, thresh, probs, boxes, masks, 0, 0, hier_thresh, 1); + //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); - //else if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, masks, names, alphabet, l.classes); if(outfile){ save_image(im, outfile); diff --git a/examples/go.c b/examples/go.c index f99eebb58b9..688579dcb3a 100644 --- a/examples/go.c +++ b/examples/go.c @@ -1,10 +1,14 @@ #include "darknet.h" +#include +#include #include int inverted = 1; int noi = 1; -static const int nind = 2; +static const int nind = 10; +int legal_go(float *b, float *ko, int p, int r, int c); +int check_ko(float *x, float *ko); typedef struct { char **data; @@ -14,7 +18,7 @@ typedef struct { char *fgetgo(FILE *fp) { if(feof(fp)) return 0; - size_t size = 94; + size_t size = 96; char *line = malloc(size*sizeof(char)); if(size != fread(line, sizeof(char), size, fp)){ free(line); @@ -32,8 +36,8 @@ moves load_go_moves(char *filename) FILE *fp = fopen(filename, "rb"); int count = 0; char *line = 0; - while((line = fgetgo(fp))){ - if(count >= m.n){ + while ((line = fgetgo(fp))) { + if (count >= m.n) { m.n *= 2; m.data = realloc(m.data, m.n*sizeof(char*)); } @@ -49,7 +53,7 @@ moves load_go_moves(char *filename) void string_to_board(char *s, float *board) { int i, j; - //memset(board, 0, 1*19*19*sizeof(float)); + memset(board, 0, 2*19*19*sizeof(float)); int count = 0; for(i = 0; i < 91; ++i){ char c = s[i]; @@ -57,8 +61,7 @@ void string_to_board(char *s, float *board) int me = (c >> (2*j)) & 1; int you = (c >> (2*j + 1)) & 1; if (me) board[count] = 1; - else if (you) board[count] = -1; - else board[count] = 0; + else if (you) board[count + 19*19] = 1; ++count; if(count >= 19*19) break; } @@ -73,7 +76,7 @@ void board_to_string(char *s, float *board) for(i = 0; i < 91; ++i){ for(j = 0; j < 4; ++j){ int me = (board[count] == 1); - int you = (board[count] == -1); + int you = (board[count + 19*19] == 1); if (me) s[i] = s[i] | (1<<(2*j)); if (you) s[i] = s[i] | (1<<(2*j + 1)); ++count; @@ -82,29 +85,40 @@ void board_to_string(char *s, float *board) } } +static int occupied(float *b, int i) +{ + if (b[i]) return 1; + if (b[i+19*19]) return -1; + return 0; +} + data random_go_moves(moves m, int n) { data d = {0}; - d.X = make_matrix(n, 19*19); - d.y = make_matrix(n, 19*19+1); - int i; + d.X = make_matrix(n, 19*19*3); + d.y = make_matrix(n, 19*19+2); + int i, j; for(i = 0; i < n; ++i){ float *board = d.X.vals[i]; float *label = d.y.vals[i]; char *b = m.data[rand()%m.n]; - int row = b[0]; - int col = b[1]; + int player = b[0] - '0'; + int result = b[1] - '0'; + int row = b[2]; + int col = b[3]; + string_to_board(b+4, board); + if(player > 0) for(j = 0; j < 19*19; ++j) board[19*19*2 + j] = 1; + label[19*19+1] = (player==result); if(row >= 19 || col >= 19){ label[19*19] = 1; } else { label[col + 19*row] = 1; - string_to_board(b+2, board); - if(board[col + 19*row]) printf("hey\n"); + if(occupied(board, col + 19*row)) printf("hey\n"); } int flip = rand()%2; int rotate = rand()%4; - image in = float_to_image(19, 19, 1, board); + image in = float_to_image(19, 19, 3, board); image out = float_to_image(19, 19, 1, label); if(flip){ flip_image(in); @@ -149,18 +163,18 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng printf("Moves: %d\n", N); int epoch = (*net->seen)/N; while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ - clock_t time=clock(); + double time=what_time_is_it_now(); data train = random_go_moves(m, net->batch*net->subdivisions*ngpus); - printf("Loaded: %lf seconds\n", sec(clock()-time)); - time=clock(); + printf("Loaded: %lf seconds\n", what_time_is_it_now() - time); + time=what_time_is_it_now(); float loss = 0; #ifdef GPU if(ngpus == 1){ loss = train_network(net, train); } else { - loss = train_networks(nets, ngpus, train, 4); + loss = train_networks(nets, ngpus, train, 10); } #else loss = train_network(net, train); @@ -169,7 +183,7 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.95 + loss*.05; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen); if(*net->seen/N > epoch){ epoch = *net->seen/N; char buff[256]; @@ -195,11 +209,11 @@ void train_go(char *cfgfile, char *weightfile, char *filename, int *gpus, int ng free(base); } -void propagate_liberty(float *board, int *lib, int *visited, int row, int col, int side) +static void propagate_liberty(float *board, int *lib, int *visited, int row, int col, int side) { if (row < 0 || row > 18 || col < 0 || col > 18) return; int index = row*19 + col; - if (board[index] != side) return; + if (occupied(board,index) != side) return; if (visited[index]) return; visited[index] = 1; lib[index] += 1; @@ -210,27 +224,27 @@ void propagate_liberty(float *board, int *lib, int *visited, int row, int col, i } -int *calculate_liberties(float *board) +static int *calculate_liberties(float *board) { int *lib = calloc(19*19, sizeof(int)); - int visited[361]; + int visited[19*19]; int i, j; for(j = 0; j < 19; ++j){ for(i = 0; i < 19; ++i){ memset(visited, 0, 19*19*sizeof(int)); int index = j*19 + i; - if(board[index] == 0){ - if ((i > 0) && board[index - 1]) propagate_liberty(board, lib, visited, j, i-1, board[index-1]); - if ((i < 18) && board[index + 1]) propagate_liberty(board, lib, visited, j, i+1, board[index+1]); - if ((j > 0) && board[index - 19]) propagate_liberty(board, lib, visited, j-1, i, board[index-19]); - if ((j < 18) && board[index + 19]) propagate_liberty(board, lib, visited, j+1, i, board[index+19]); + if(!occupied(board,index)){ + if ((i > 0) && occupied(board,index - 1)) propagate_liberty(board, lib, visited, j, i-1, occupied(board,index-1)); + if ((i < 18) && occupied(board,index + 1)) propagate_liberty(board, lib, visited, j, i+1, occupied(board,index+1)); + if ((j > 0) && occupied(board,index - 19)) propagate_liberty(board, lib, visited, j-1, i, occupied(board,index-19)); + if ((j < 18) && occupied(board,index + 19)) propagate_liberty(board, lib, visited, j+1, i, occupied(board,index+19)); } } } return lib; } -void print_board(FILE *stream, float *board, int swap, int *indexes) +void print_board(FILE *stream, float *board, int player, int *indexes) { int i,j,n; fprintf(stream, " "); @@ -254,20 +268,16 @@ void print_board(FILE *stream, float *board, int swap, int *indexes) else if(n == 3) fprintf(stream, "\uff14"); else if(n == 4) fprintf(stream, "\uff15"); */ - if(n == 0) fprintf(stream, " 1"); - else if(n == 1) fprintf(stream, " 2"); - else if(n == 2) fprintf(stream, " 3"); - else if(n == 3) fprintf(stream, " 4"); - else if(n == 4) fprintf(stream, " 5"); + fprintf(stream, " %d", n+1); } } if(found) continue; } //if(board[index]*-swap > 0) fprintf(stream, "\u25C9 "); //else if(board[index]*-swap < 0) fprintf(stream, "\u25EF "); - if(board[index]*-swap > 0) fprintf(stream, " O"); - else if(board[index]*-swap < 0) fprintf(stream, " X"); - else fprintf(stream, " "); + if (occupied(board, index) == player) fprintf(stream, " X"); + else if (occupied(board, index) ==-player) fprintf(stream, " O"); + else fprintf(stream, " ."); } fprintf(stream, "\n"); } @@ -277,23 +287,28 @@ void flip_board(float *board) { int i; for(i = 0; i < 19*19; ++i){ - board[i] = -board[i]; + float swap = board[i]; + board[i] = board[i+19*19]; + board[i+19*19] = swap; + board[i+19*19*2] = 1-board[i+19*19*2]; } } -void predict_move(network *net, float *board, float *move, int multi) +float predict_move2(network *net, float *board, float *move, int multi) { float *output = network_predict(net, board); copy_cpu(19*19+1, output, 1, move, 1); + float result = output[19*19 + 1]; int i; if(multi){ - image bim = float_to_image(19, 19, 1, board); + image bim = float_to_image(19, 19, 3, board); for(i = 1; i < 8; ++i){ rotate_image_cw(bim, i); if(i >= 4) flip_image(bim); float *output = network_predict(net, board); image oim = float_to_image(19, 19, 1, output); + result += output[19*19 + 1]; if(i >= 4) flip_image(oim); rotate_image_cw(oim, -i); @@ -303,19 +318,22 @@ void predict_move(network *net, float *board, float *move, int multi) if(i >= 4) flip_image(bim); rotate_image_cw(bim, -i); } + result = result/8; scal_cpu(19*19+1, 1./8., move, 1); } for(i = 0; i < 19*19; ++i){ - if(board[i]) move[i] = 0; + if(board[i] || board[i+19*19]) move[i] = 0; } + return result; } -void remove_connected(float *b, int *lib, int p, int r, int c) +static void remove_connected(float *b, int *lib, int p, int r, int c) { if (r < 0 || r >= 19 || c < 0 || c >= 19) return; - if (b[r*19 + c] != p) return; + if (occupied(b, r*19 + c) != p) return; if (lib[r*19 + c] != 1) return; b[r*19 + c] = 0; + b[19*19 + r*19 + c] = 0; remove_connected(b, lib, p, r+1, c); remove_connected(b, lib, p, r-1, c); remove_connected(b, lib, p, r, c+1); @@ -326,7 +344,8 @@ void remove_connected(float *b, int *lib, int p, int r, int c) void move_go(float *b, int p, int r, int c) { int *l = calculate_liberties(b); - b[r*19 + c] = p; + if(p > 0) b[r*19 + c] = 1; + else b[19*19 + r*19 + c] = 1; remove_connected(b, l, -p, r+1, c); remove_connected(b, l, -p, r-1, c); remove_connected(b, l, -p, r, c+1); @@ -334,13 +353,271 @@ void move_go(float *b, int p, int r, int c) free(l); } -int makes_safe_go(float *b, int *lib, int p, int r, int c){ +int compare_board(float *a, float *b) +{ + if(memcmp(a, b, 19*19*3*sizeof(float)) == 0) return 1; + return 0; +} + +typedef struct mcts_tree{ + float *board; + struct mcts_tree **children; + float *prior; + int *visit_count; + float *value; + float *mean; + float *prob; + int total_count; + float result; + int done; + int pass; +} mcts_tree; + +void free_mcts(mcts_tree *root) +{ + if(!root) return; + int i; + free(root->board); + for(i = 0; i < 19*19+1; ++i){ + if(root->children[i]) free_mcts(root->children[i]); + } + free(root->children); + free(root->prior); + free(root->visit_count); + free(root->value); + free(root->mean); + free(root->prob); + free(root); +} + +float *network_predict_rotations(network *net, float *next) +{ + int n = net->batch; + float *in = calloc(19*19*3*n, sizeof(float)); + image im = float_to_image(19, 19, 3, next); + int i,j; + int *inds = random_index_order(0, 8); + for(j = 0; j < n; ++j){ + i = inds[j]; + rotate_image_cw(im, i); + if(i >= 4) flip_image(im); + memcpy(in + 19*19*3*j, im.data, 19*19*3*sizeof(float)); + if(i >= 4) flip_image(im); + rotate_image_cw(im, -i); + } + float *pred = network_predict(net, in); + for(j = 0; j < n; ++j){ + i = inds[j]; + image im = float_to_image(19, 19, 1, pred + j*(19*19 + 2)); + if(i >= 4) flip_image(im); + rotate_image_cw(im, -i); + if(j > 0){ + axpy_cpu(19*19+2, 1, im.data, 1, pred, 1); + } + } + free(in); + free(inds); + scal_cpu(19*19+2, 1./n, pred, 1); + return pred; +} + +mcts_tree *expand(float *next, float *ko, network *net) +{ + mcts_tree *root = calloc(1, sizeof(mcts_tree)); + root->board = next; + root->children = calloc(19*19+1, sizeof(mcts_tree*)); + root->prior = calloc(19*19 + 1, sizeof(float)); + root->prob = calloc(19*19 + 1, sizeof(float)); + root->mean = calloc(19*19 + 1, sizeof(float)); + root->value = calloc(19*19 + 1, sizeof(float)); + root->visit_count = calloc(19*19 + 1, sizeof(int)); + root->total_count = 1; + int i; + float *pred = network_predict_rotations(net, next); + copy_cpu(19*19+1, pred, 1, root->prior, 1); + float val = 2*pred[19*19 + 1] - 1; + root->result = val; + for(i = 0; i < 19*19+1; ++i) { + root->visit_count[i] = 0; + root->value[i] = 0; + root->mean[i] = val; + if(i < 19*19 && occupied(next, i)){ + root->value[i] = -1; + root->mean[i] = -1; + root->prior[i] = 0; + } + } + //print_board(stderr, next, flip?-1:1, 0); + return root; +} + +float *copy_board(float *board) +{ + float *next = calloc(19*19*3, sizeof(float)); + copy_cpu(19*19*3, board, 1, next, 1); + return next; +} + +float select_mcts(mcts_tree *root, network *net, float *prev, float cpuct) +{ + if(root->done) return -root->result; + int i; + float max = -1000; + int max_i = 0; + for(i = 0; i < 19*19+1; ++i){ + root->prob[i] = root->mean[i] + cpuct*root->prior[i] * sqrt(root->total_count) / (1. + root->visit_count[i]); + if(root->prob[i] > max){ + max = root->prob[i]; + max_i = i; + } + } + float val; + i = max_i; + root->visit_count[i]++; + root->total_count++; + if (root->children[i]) { + val = select_mcts(root->children[i], net, root->board, cpuct); + } else { + if(max_i < 19*19 && !legal_go(root->board, prev, 1, max_i/19, max_i%19)) { + root->mean[i] = -1; + root->value[i] = -1; + root->prior[i] = 0; + --root->total_count; + return select_mcts(root, net, prev, cpuct); + //printf("Detected ko\n"); + //getchar(); + } else { + float *next = copy_board(root->board); + if (max_i < 19*19) { + move_go(next, 1, max_i / 19, max_i % 19); + } + flip_board(next); + root->children[i] = expand(next, root->board, net); + val = -root->children[i]->result; + if(max_i == 19*19){ + root->children[i]->pass = 1; + if (root->pass){ + root->children[i]->done = 1; + } + } + } + } + root->value[i] += val; + root->mean[i] = root->value[i]/root->visit_count[i]; + return -val; +} + +mcts_tree *run_mcts(mcts_tree *tree, network *net, float *board, float *ko, int player, int n, float cpuct, float secs) +{ + int i; + double t = what_time_is_it_now(); + if(player < 0) flip_board(board); + if(!tree) tree = expand(copy_board(board), ko, net); + assert(compare_board(tree->board, board)); + for(i = 0; i < n; ++i){ + if (secs > 0 && (what_time_is_it_now() - t) > secs) break; + int max_i = max_int_index(tree->visit_count, 19*19+1); + if (tree->visit_count[max_i] >= n) break; + select_mcts(tree, net, ko, cpuct); + } + if(player < 0) flip_board(board); + //fprintf(stderr, "%f Seconds\n", what_time_is_it_now() - t); + return tree; +} + +mcts_tree *move_mcts(mcts_tree *tree, int index) +{ + if(index < 0 || index > 19*19 || !tree || !tree->children[index]) { + free_mcts(tree); + tree = 0; + } else { + mcts_tree *swap = tree; + tree = tree->children[index]; + swap->children[index] = 0; + free_mcts(swap); + } + return tree; +} + +typedef struct { + float value; + float mcts; + int row; + int col; +} move; + +move pick_move(mcts_tree *tree, float temp, int player) +{ + int i; + float probs[19*19+1] = {0}; + move m = {0}; + double sum = 0; + /* + for(i = 0; i < 19*19+1; ++i){ + probs[i] = tree->visit_count[i]; + } + */ + //softmax(probs, 19*19+1, temp, 1, probs); + for(i = 0; i < 19*19+1; ++i){ + sum += pow(tree->visit_count[i], 1./temp); + } + for(i = 0; i < 19*19+1; ++i){ + probs[i] = pow(tree->visit_count[i], 1./temp) / sum; + } + + int index = sample_array(probs, 19*19+1); + m.row = index / 19; + m.col = index % 19; + m.value = (tree->result+1.)/2.; + m.mcts = (tree->mean[index]+1.)/2.; + + int indexes[nind]; + top_k(probs, 19*19+1, nind, indexes); + print_board(stderr, tree->board, player, indexes); + + fprintf(stderr, "%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", index/19, index%19, tree->result, tree->prior[index], probs[index], tree->mean[index], (tree->children[index])?tree->children[index]->result:0, tree->visit_count[index]); + int ind = max_index(probs, 19*19+1); + fprintf(stderr, "%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", ind/19, ind%19, tree->result, tree->prior[ind], probs[ind], tree->mean[ind], (tree->children[ind])?tree->children[ind]->result:0, tree->visit_count[ind]); + ind = max_index(tree->prior, 19*19+1); + fprintf(stderr, "%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", ind/19, ind%19, tree->result, tree->prior[ind], probs[ind], tree->mean[ind], (tree->children[ind])?tree->children[ind]->result:0, tree->visit_count[ind]); + return m; +} + +/* + float predict_move(network *net, float *board, float *move, int multi, float *ko, float temp) + { + + int i; + + int max_v = 0; + int max_i = 0; + for(i = 0; i < 19*19+1; ++i){ + if(root->visit_count[i] > max_v){ + max_v = root->visit_count[i]; + max_i = i; + } + } + fprintf(stderr, "%f Seconds\n", what_time_is_it_now() - t); + int ind = max_index(root->mean, 19*19+1); + fprintf(stderr, "%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", max_i/19, max_i%19, root->result, root->prior[max_i], root->prob[max_i], root->mean[max_i], (root->children[max_i])?root->children[max_i]->result:0, root->visit_count[max_i]); + fprintf(stderr, "%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", ind/19, ind%19, root->result, root->prior[ind], root->prob[ind], root->mean[ind], (root->children[ind])?root->children[ind]->result:0, root->visit_count[ind]); + ind = max_index(root->prior, 19*19+1); + fprintf(stderr, "%d %d, Result: %f, Prior: %f, Prob: %f, Mean Value: %f, Child Result: %f, Visited: %d\n", ind/19, ind%19, root->result, root->prior[ind], root->prob[ind], root->mean[ind], (root->children[ind])?root->children[ind]->result:0, root->visit_count[ind]); + if(root->result < -.9 && root->mean[max_i] < -.9) return -1000.f; + + float val = root->result; + free_mcts(root); + return val; + } + */ + +static int makes_safe_go(float *b, int *lib, int p, int r, int c){ if (r < 0 || r >= 19 || c < 0 || c >= 19) return 0; - if (b[r*19 + c] == -p){ + if (occupied(b,r*19 + c) == -p){ if (lib[r*19 + c] > 1) return 0; else return 1; } - if (b[r*19 + c] == 0) return 1; + if (!occupied(b,r*19 + c)) return 1; if (lib[r*19 + c] > 1) return 1; return 0; } @@ -357,82 +634,101 @@ int suicide_go(float *b, int p, int r, int c) return !safe; } -int legal_go(float *b, char *ko, int p, int r, int c) +int check_ko(float *x, float *ko) { - if (b[r*19 + c]) return 0; - char curr[91]; - char next[91]; - board_to_string(curr, b); - move_go(b, p, r, c); - board_to_string(next, b); - string_to_board(curr, b); - if(memcmp(next, ko, 91) == 0) return 0; - return 1; + if(!ko) return 0; + float curr[19*19*3]; + copy_cpu(19*19*3, x, 1, curr, 1); + if(curr[19*19*2] != ko[19*19*2]) flip_board(curr); + if(compare_board(curr, ko)) return 1; + return 0; } -int generate_move(network *net, int player, float *board, int multi, float thresh, float temp, char *ko, int print) +int legal_go(float *b, float *ko, int p, int r, int c) { - int i, j; - int empty = 1; - for(i = 0; i < 19*19; ++i){ - if (board[i]) { - empty = 0; - break; - } - } - if(empty) { - return 72; - } - for(i = 0; i < net->n; ++i) net->layers[i].temperature = temp; - - float move[362]; - if (player < 0) flip_board(board); - predict_move(net, board, move, multi); - if (player < 0) flip_board(board); + if (occupied(b, r*19+c)) return 0; + float curr[19*19*3]; + copy_cpu(19*19*3, b, 1, curr, 1); + move_go(curr, p, r, c); + if(check_ko(curr, ko)) return 0; + if(suicide_go(b, p, r, c)) return 0; + return 1; +} +/* + move generate_move(mcts_tree *root, network *net, int player, float *board, int multi, float temp, float *ko, int print) + { + move m = {0}; +//root = run_mcts(tree, network *net, float *board, float *ko, int n, float cpuct) +int i, j; +int empty = 1; +for(i = 0; i < 19*19; ++i){ +if (occupied(board, i)) { +empty = 0; +break; +} +} +if(empty) { +m.value = .5; +m.mcts = .5; +m.row = 3; +m.col = 15; +return m; +} - for(i = 0; i < 19; ++i){ - for(j = 0; j < 19; ++j){ - if (!legal_go(board, ko, player, i, j)) move[i*19 + j] = 0; - } - } +float move[362]; +if (player < 0) flip_board(board); +float result = predict_move(net, board, move, multi, ko, temp); +if (player < 0) flip_board(board); +if(result == -1000.f) return -2; - int indexes[nind]; - top_k(move, 19*19+1, nind, indexes); - if(thresh > move[indexes[0]]) thresh = move[indexes[nind-1]]; +for(i = 0; i < 19; ++i){ +for(j = 0; j < 19; ++j){ +if (!legal_go(board, ko, player, i, j)) move[i*19 + j] = 0; +} +} - for(i = 0; i < 19*19+1; ++i){ - if (move[i] < thresh) move[i] = 0; - } +int indexes[nind]; +top_k(move, 19*19+1, nind, indexes); - int max = max_index(move, 19*19+1); - int row = max / 19; - int col = max % 19; - int index = sample_array(move, 19*19+1); +int max = max_index(move, 19*19+1); +int row = max / 19; +int col = max % 19; +int index = sample_array(move, 19*19+1); - if(print){ - top_k(move, 19*19+1, nind, indexes); - for(i = 0; i < nind; ++i){ - if (!move[indexes[i]]) indexes[i] = -1; - } - print_board(stderr, board, player, indexes); - for(i = 0; i < nind; ++i){ - fprintf(stderr, "%d: %f\n", i+1, move[indexes[i]]); - } - } - if (row == 19) return -1; +if(print){ +top_k(move, 19*19+1, nind, indexes); +for(i = 0; i < nind; ++i){ +if (!move[indexes[i]]) indexes[i] = -1; +} +print_board(stderr, board, 1, indexes); +fprintf(stderr, "%s To Move\n", player > 0 ? "X" : "O"); +fprintf(stderr, "%.2f%% Win Chance\n", (result+1)/2*100); +for(i = 0; i < nind; ++i){ +int index = indexes[i]; +int row = index / 19; +int col = index % 19; +if(row == 19){ +fprintf(stderr, "%d: Pass, %.2f%%\n", i+1, move[index]*100); +} else { +fprintf(stderr, "%d: %c %d, %.2f%%\n", i+1, col + 'A' + 1*(col > 7 && noi), (inverted)?19 - row : row+1, move[index]*100); +} +} +} +if (row == 19) return -1; - if (suicide_go(board, player, row, col)){ - return -1; - } +if (suicide_go(board, player, row, col)){ +return -1; +} - if (suicide_go(board, player, index/19, index%19)){ - index = max; - } - if (index == 19*19) return -1; - return index; +if (suicide_go(board, player, index/19, index%19)){ +index = max; +} +if (index == 19*19) return -1; +return index; } +*/ void valid_go(char *cfgfile, char *weightfile, int multi, char *filename) { @@ -443,22 +739,25 @@ void valid_go(char *cfgfile, char *weightfile, int multi, char *filename) set_batch_network(net, 1); printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); - float *board = calloc(19*19, sizeof(float)); - float *move = calloc(19*19+1, sizeof(float)); - // moves m = load_go_moves("/home/pjreddie/backup/go.test"); + float *board = calloc(19*19*3, sizeof(float)); + float *move = calloc(19*19+2, sizeof(float)); + // moves m = load_go_moves("/home/pjreddie/backup/go.test"); moves m = load_go_moves(filename); int N = m.n; - int i; + int i,j; int correct = 0; - for(i = 0; i 0) for(j = 0; j < 19*19; ++j) board[19*19*2 + j] = 1; + predict_move2(net, board, move, multi); + int index = max_index(move, 19*19+1); if(index == truth) ++correct; printf("%d Accuracy %f\n", i, (float) correct/(i+1)); } @@ -473,29 +772,78 @@ int print_game(float *board, FILE *fp) fprintf(fp, "clear_board\n"); for(j = 0; j < 19; ++j){ for(i = 0; i < 19; ++i){ - if(board[j*19 + i] == 1) fprintf(fp, "play black %c%d\n", 'A'+i+(i>=8), 19-j); - if(board[j*19 + i] == -1) fprintf(fp, "play white %c%d\n", 'A'+i+(i>=8), 19-j); - if(board[j*19 + i]) ++count; + if(occupied(board,j*19 + i) == 1) fprintf(fp, "play black %c%d\n", 'A'+i+(i>=8), 19-j); + if(occupied(board,j*19 + i) == -1) fprintf(fp, "play white %c%d\n", 'A'+i+(i>=8), 19-j); + if(occupied(board,j*19 + i)) ++count; } } return count; } -void engine_go(char *filename, char *weightfile, int multi) + +int stdin_ready() { + fd_set readfds; + FD_ZERO(&readfds); + + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_SET(STDIN_FILENO, &readfds); + + if (select(1, &readfds, NULL, NULL, &timeout)){ + return 1; + } + return 0; +} + +mcts_tree *ponder(mcts_tree *tree, network *net, float *b, float *ko, int player, float cpuct) +{ + double t = what_time_is_it_now(); + int count = 0; + if (tree) count = tree->total_count; + while(!stdin_ready()){ + if (what_time_is_it_now() - t > 120) break; + tree = run_mcts(tree, net, b, ko, player, 100000, cpuct, .1); + } + fprintf(stderr, "Pondered %d moves...\n", tree->total_count - count); + return tree; +} + +void engine_go(char *filename, char *weightfile, int mcts_iters, float secs, float temp, float cpuct, int anon, int resign) +{ + mcts_tree *root = 0; network *net = load_network(filename, weightfile, 0); set_batch_network(net, 1); srand(time(0)); - float *board = calloc(19*19, sizeof(float)); - char *one = calloc(91, sizeof(char)); - char *two = calloc(91, sizeof(char)); + float *board = calloc(19*19*3, sizeof(float)); + flip_board(board); + float *one = calloc(19*19*3, sizeof(float)); + float *two = calloc(19*19*3, sizeof(float)); + int ponder_player = 0; int passed = 0; + int move_num = 0; + int main_time = 0; + int byo_yomi_time = 0; + int byo_yomi_stones = 0; + int black_time_left = 0; + int black_stones_left = 0; + int white_time_left = 0; + int white_stones_left = 0; + float orig_time = secs; + int old_ponder = 0; while(1){ + if(ponder_player){ + root = ponder(root, net, board, two, ponder_player, cpuct); + } + old_ponder = ponder_player; + ponder_player = 0; char buff[256]; int id = 0; int has_id = (scanf("%d", &id) == 1); scanf("%s", buff); if (feof(stdin)) break; + fprintf(stderr, "%s\n", buff); char ids[256]; sprintf(ids, "%d", id); //fprintf(stderr, "%s\n", buff); @@ -503,13 +851,34 @@ void engine_go(char *filename, char *weightfile, int multi) if (!strcmp(buff, "protocol_version")){ printf("=%s 2\n\n", ids); } else if (!strcmp(buff, "name")){ - printf("=%s DarkGo\n\n", ids); - } else if (!strcmp(buff, "time_settings") || !strcmp(buff, "time_left")){ - char *line = fgetl(stdin); - free(line); + if(anon){ + printf("=%s The Fool!\n\n", ids); + }else{ + printf("=%s DarkGo\n\n", ids); + } + } else if (!strcmp(buff, "time_settings")){ + ponder_player = old_ponder; + scanf("%d %d %d", &main_time, &byo_yomi_time, &byo_yomi_stones); + printf("=%s \n\n", ids); + } else if (!strcmp(buff, "time_left")){ + ponder_player = old_ponder; + char color[256]; + int time = 0, stones = 0; + scanf("%s %d %d", color, &time, &stones); + if (color[0] == 'b' || color[0] == 'B'){ + black_time_left = time; + black_stones_left = stones; + } else { + white_time_left = time; + white_stones_left = stones; + } printf("=%s \n\n", ids); } else if (!strcmp(buff, "version")){ - printf("=%s 1.0. Want more DarkGo? You can find me on OGS, unlimited games, no waiting! https://online-go.com/user/view/434218\n\n", ids); + if(anon){ + printf("=%s :-DDDD\n\n", ids); + }else { + printf("=%s 1.0. Want more DarkGo? You can find me on OGS, unlimited games, no waiting! https://online-go.com/user/view/434218\n\n", ids); + } } else if (!strcmp(buff, "known_command")){ char comm[256]; scanf("%s", comm); @@ -541,7 +910,10 @@ void engine_go(char *filename, char *weightfile, int multi) if(boardsize != 19){ printf("?%s unacceptable size\n\n", ids); } else { - memset(board, 0, 19*19*sizeof(float)); + root = move_mcts(root, -1); + memset(board, 0, 3*19*19*sizeof(float)); + flip_board(board); + move_num = 0; printf("=%s \n\n", ids); } } else if (!strcmp(buff, "fixed_handicap")){ @@ -551,10 +923,15 @@ void engine_go(char *filename, char *weightfile, int multi) int i; for(i = 0; i < handicap; ++i){ board[indexes[i]] = 1; + ++move_num; } + root = move_mcts(root, -1); } else if (!strcmp(buff, "clear_board")){ passed = 0; - memset(board, 0, 19*19*sizeof(float)); + memset(board, 0, 3*19*19*sizeof(float)); + flip_board(board); + move_num = 0; + root = move_mcts(root, -1); printf("=%s \n\n", ids); } else if (!strcmp(buff, "komi")){ float komi = 0; @@ -565,6 +942,7 @@ void engine_go(char *filename, char *weightfile, int multi) print_board(stdout, board, 1, 0); printf("\n"); } else if (!strcmp(buff, "play") || !strcmp(buff, "black") || !strcmp(buff, "white")){ + ++move_num; char color[256]; if(!strcmp(buff, "play")) { @@ -584,6 +962,7 @@ void engine_go(char *filename, char *weightfile, int multi) free(line); fflush(stdout); fflush(stderr); + root = move_mcts(root, 19*19); continue; } else { passed = 0; @@ -594,15 +973,22 @@ void engine_go(char *filename, char *weightfile, int multi) r = 19 - r; fprintf(stderr, "move: %d %d\n", r, c); - char *swap = two; + float *swap = two; two = one; one = swap; move_go(board, player, r, c); - board_to_string(one, board); + copy_cpu(19*19*3, board, 1, one, 1); + if(root) fprintf(stderr, "Prior: %f\n", root->prior[r*19 + c]); + if(root) fprintf(stderr, "Mean: %f\n", root->mean[r*19 + c]); + if(root) fprintf(stderr, "Result: %f\n", root->result); + root = move_mcts(root, r*19 + c); + if(root) fprintf(stderr, "Visited: %d\n", root->total_count); + else fprintf(stderr, "NOT VISITED\n"); printf("=%s \n\n", ids); //print_board(stderr, board, 1, 0); } else if (!strcmp(buff, "genmove") || !strcmp(buff, "genmove_black") || !strcmp(buff, "genmove_white")){ + ++move_num; int player = 0; if(!strcmp(buff, "genmove")){ char color[256]; @@ -613,25 +999,41 @@ void engine_go(char *filename, char *weightfile, int multi) } else { player = -1; } + if(player > 0){ + if(black_time_left <= 30) secs = 2.5; + else secs = orig_time; + } else { + if(white_time_left <= 30) secs = 2.5; + else secs = orig_time; + } + ponder_player = -player; + + //tree = generate_move(net, player, board, multi, .1, two, 1); + double t = what_time_is_it_now(); + root = run_mcts(root, net, board, two, player, mcts_iters, cpuct, secs); + fprintf(stderr, "%f Seconds\n", what_time_is_it_now() - t); + move m = pick_move(root, temp, player); + root = move_mcts(root, m.row*19 + m.col); + - int index = generate_move(net, player, board, multi, .4, 1, two, 0); - if(passed || index < 0){ + if(move_num > resign && m.value < .1 && m.mcts < .1){ + printf("=%s resign\n\n", ids); + } else if(m.row == 19){ printf("=%s pass\n\n", ids); passed = 0; } else { - int row = index / 19; - int col = index % 19; + int row = m.row; + int col = m.col; - char *swap = two; + float *swap = two; two = one; one = swap; move_go(board, player, row, col); - board_to_string(one, board); + copy_cpu(19*19*3, board, 1, one, 1); row = 19 - row; if (col >= 8) ++col; printf("=%s %c%d\n\n", ids, 'A' + col, row); - //print_board(board, 1, 0); } } else if (!strcmp(buff, "p")){ @@ -661,6 +1063,27 @@ void engine_go(char *filename, char *weightfile, int multi) } else { printf("?%s unknown command\n\n", ids); } + } else if (!strcmp(buff, "kgs-genmove_cleanup")){ + char type[256]; + scanf("%s", type); + fprintf(stderr, "kgs-genmove_cleanup\n"); + char *line = fgetl(stdin); + free(line); + int i; + FILE *f = fopen("game.txt", "w"); + int count = print_game(board, f); + fprintf(f, "%s kgs-genmove_cleanup %s\n", ids, type); + fclose(f); + FILE *p = popen("./gnugo --mode gtp < game.txt", "r"); + for(i = 0; i < count; ++i){ + free(fgetl(p)); + free(fgetl(p)); + } + char *l = 0; + while((l = fgetl(p))){ + printf("%s\n", l); + free(l); + } } else { char *line = fgetl(stdin); free(line); @@ -669,19 +1092,22 @@ void engine_go(char *filename, char *weightfile, int multi) fflush(stdout); fflush(stderr); } + printf("%d %d %d\n",passed, black_stones_left, white_stones_left); } void test_go(char *cfg, char *weights, int multi) { + int i; network *net = load_network(cfg, weights, 0); set_batch_network(net, 1); srand(time(0)); - float *board = calloc(19*19, sizeof(float)); + float *board = calloc(19*19*3, sizeof(float)); + flip_board(board); float *move = calloc(19*19+1, sizeof(float)); int color = 1; while(1){ - int i; - predict_move(net, board, move, multi); + float result = predict_move2(net, board, move, multi); + printf("%.2f%% Win Chance\n", (result+1)/2*100); int indexes[nind]; int row, col; @@ -732,14 +1158,24 @@ void test_go(char *cfg, char *weights, int multi) row = (inverted)?19 - row : row-1; col = c - 'A'; if (col > 7 && noi) col -= 1; - if (num == 3) board[row*19 + col] = (g == 'b') ? color : -color; + if (num == 3) { + int mc = (g == 'b') ? 1 : -1; + if (mc == color) { + board[row*19 + col] = 1; + } else { + board[19*19 + row*19 + col] = 1; + } + } } else if(c == 'c'){ char g; int num = sscanf(line, "%c %c %d", &g, &c, &row); row = (inverted)?19 - row : row-1; col = c - 'A'; if (col > 7 && noi) col -= 1; - if (num == 3) board[row*19 + col] = 0; + if (num == 3) { + board[row*19 + col] = 0; + board[19*19 + row*19 + col] = 0; + } } } free(line); @@ -776,8 +1212,10 @@ float score_game(float *board) void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) { + mcts_tree *tree1 = 0; + mcts_tree *tree2 = 0; network *net = load_network(filename, weightfile, 0); - set_batch_network(net, 1); + //set_batch_network(net, 1); network *net2; if (f2) { @@ -792,18 +1230,24 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) srand(time(0)); char boards[600][93]; int count = 0; - set_batch_network(net, 1); - set_batch_network(net2, 1); - float *board = calloc(19*19, sizeof(float)); - char *one = calloc(91, sizeof(char)); - char *two = calloc(91, sizeof(char)); + //set_batch_network(net, 1); + //set_batch_network(net2, 1); + float *board = calloc(19*19*3, sizeof(float)); + flip_board(board); + float *one = calloc(19*19*3, sizeof(float)); + float *two = calloc(19*19*3, sizeof(float)); int done = 0; int player = 1; int p1 = 0; int p2 = 0; int total = 0; + float temp = .1; + int mcts_iters = 500; + float cpuct = 5; while(1){ if (done){ + tree1 = move_mcts(tree1, -1); + tree2 = move_mcts(tree2, -1); float score = score_game(board); if((score > 0) == (total%2==0)) ++p1; else ++p2; @@ -820,25 +1264,42 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) printf("\n"); } */ - memset(board, 0, 19*19*sizeof(float)); + memset(board, 0, 3*19*19*sizeof(float)); + flip_board(board); player = 1; done = 0; count = 0; fflush(stdout); fflush(stderr); } - print_board(stderr, board, 1, 0); + //print_board(stderr, board, 1, 0); //sleep(1); + + if ((total%2==0) == (player==1)){ + //mcts_iters = 4500; + cpuct = 5; + } else { + //mcts_iters = 500; + cpuct = 1; + } network *use = ((total%2==0) == (player==1)) ? net : net2; - int index = generate_move(use, player, board, multi, .4, 1, two, 0); - if(index < 0){ + mcts_tree *t = ((total%2==0) == (player==1)) ? tree1 : tree2; + t = run_mcts(t, use, board, two, player, mcts_iters, cpuct, 0); + move m = pick_move(t, temp, player); + if(((total%2==0) == (player==1))) tree1 = t; + else tree2 = t; + + tree1 = move_mcts(tree1, m.row*19 + m.col); + tree2 = move_mcts(tree2, m.row*19 + m.col); + + if(m.row == 19){ done = 1; continue; } - int row = index / 19; - int col = index % 19; + int row = m.row; + int col = m.col; - char *swap = two; + float *swap = two; two = one; one = swap; @@ -850,7 +1311,7 @@ void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) ++count; move_go(board, player, row, col); - board_to_string(one, board); + copy_cpu(19*19*3, board, 1, one, 1); player = -player; } @@ -893,11 +1354,17 @@ void run_go(int argc, char **argv) char *c2 = (argc > 5) ? argv[5] : 0; char *w2 = (argc > 6) ? argv[6] : 0; int multi = find_arg(argc, argv, "-multi"); + int anon = find_arg(argc, argv, "-anon"); + int iters = find_int_arg(argc, argv, "-iters", 500); + int resign = find_int_arg(argc, argv, "-resign", 175); + float cpuct = find_float_arg(argc, argv, "-cpuct", 5); + float temp = find_float_arg(argc, argv, "-temp", .1); + float time = find_float_arg(argc, argv, "-time", 0); if(0==strcmp(argv[2], "train")) train_go(cfg, weights, c2, gpus, ngpus, clear); else if(0==strcmp(argv[2], "valid")) valid_go(cfg, weights, multi, c2); else if(0==strcmp(argv[2], "self")) self_go(cfg, weights, c2, w2, multi); else if(0==strcmp(argv[2], "test")) test_go(cfg, weights, multi); - else if(0==strcmp(argv[2], "engine")) engine_go(cfg, weights, multi); + else if(0==strcmp(argv[2], "engine")) engine_go(cfg, weights, iters, time, temp, cpuct, anon, resign); } diff --git a/include/darknet.h b/include/darknet.h index b3dc89a4280..5fa2ec17c34 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -56,6 +56,10 @@ typedef enum{ LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN } ACTIVATION; +typedef enum{ + MULT, ADD, SUB, DIV +} BINARY_ACTIVATION; + typedef enum { CONVOLUTIONAL, DECONVOLUTIONAL, @@ -578,6 +582,8 @@ list *read_data_cfg(char *filename); list *read_cfg(char *filename); unsigned char *read_file(char *filename); data resize_data(data orig, int w, int h); +data *tile_data(data orig, int divs, int size); +data select_data(data *orig, int *inds); void forward_network(network *net); void backward_network(network *net); @@ -588,6 +594,7 @@ void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void copy_cpu(int N, float *X, int INCX, float *Y, int INCY); void scal_cpu(int N, float ALPHA, float *X, int INCX); void normalize_cpu(float *x, float *mean, float *variance, int batch, int filters, int spatial); +void softmax(float *input, int n, float temp, int stride, float *output); int best_3d_shift_r(image a, image b, int min, int max); #ifdef GPU @@ -744,12 +751,15 @@ void top_k(float *a, int n, int k, int *index); int *read_map(char *filename); void error(const char *s); int max_index(float *a, int n); +int max_int_index(int *a, int n); int sample_array(float *a, int n); +int *random_index_order(int min, int max); void free_list(list *l); float mse_array(float *a, int n); float variance_array(float *a, int n); float mag_array(float *a, int n); float mean_array(float *a, int n); +float sum_array(float *a, int n); void normalize_array(float *a, int n); int *read_intlist(char *s, int *n, int d); size_t rand_size_t(); diff --git a/python/darknet.py b/python/darknet.py index c8ec9be5b7f..d6dfd31ff85 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -31,6 +31,8 @@ class METADATA(Structure): _fields_ = [("classes", c_int), ("names", POINTER(c_char_p))] + + #lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL) lib = CDLL("libdarknet.so", RTLD_GLOBAL) lib.network_width.argtypes = [c_void_p] @@ -42,6 +44,10 @@ class METADATA(Structure): predict.argtypes = [c_void_p, POINTER(c_float)] predict.restype = POINTER(c_float) +make_image = lib.make_image +make_image.argtypes = [c_int, c_int, c_int] +make_image.restype = IMAGE + make_boxes = lib.make_boxes make_boxes.argtypes = [c_void_p] make_boxes.restype = POINTER(BOX) @@ -82,6 +88,9 @@ class METADATA(Structure): load_image.argtypes = [c_char_p, c_int, c_int] load_image.restype = IMAGE +rgbgr_image = lib.rgbgr_image +rgbgr_image.argtypes = [IMAGE] + predict_image = lib.network_predict_image predict_image.argtypes = [c_void_p, IMAGE] predict_image.restype = POINTER(c_float) diff --git a/src/activation_kernels.cu b/src/activation_kernels.cu index 80a849f73b2..5852eb58e0e 100644 --- a/src/activation_kernels.cu +++ b/src/activation_kernels.cu @@ -140,6 +140,41 @@ __device__ float gradient_kernel(float x, ACTIVATION a) return 0; } +__global__ void binary_gradient_array_kernel(float *x, float *dy, int n, int s, BINARY_ACTIVATION a, float *dx) +{ + int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + int i = id % s; + int b = id / s; + float x1 = x[b*s + i]; + float x2 = x[b*s + s/2 + i]; + if(id < n) { + float de = dy[id]; + dx[b*s + i] = x2*de; + dx[b*s + s/2 + i] = x1*de; + } +} + +extern "C" void binary_gradient_array_gpu(float *x, float *dx, int n, int size, BINARY_ACTIVATION a, float *y) +{ + binary_gradient_array_kernel<<>>(x, dx, n/2, size, a, y); + check_error(cudaPeekAtLastError()); +} +__global__ void binary_activate_array_kernel(float *x, int n, int s, BINARY_ACTIVATION a, float *y) +{ + int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + int i = id % s; + int b = id / s; + float x1 = x[b*s + i]; + float x2 = x[b*s + s/2 + i]; + if(id < n) y[id] = x1*x2; +} + +extern "C" void binary_activate_array_gpu(float *x, int n, int size, BINARY_ACTIVATION a, float *y) +{ + binary_activate_array_kernel<<>>(x, n/2, size, a, y); + check_error(cudaPeekAtLastError()); +} + __global__ void activate_array_kernel(float *x, int n, ACTIVATION a) { int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; diff --git a/src/data.c b/src/data.c index cddc7bc117d..935e6389515 100644 --- a/src/data.c +++ b/src/data.c @@ -1172,6 +1172,56 @@ data load_data_regression(char **paths, int n, int m, int min, int max, int size return d; } +data select_data(data *orig, int *inds) +{ + data d = {0}; + d.shallow = 1; + d.w = orig[0].w; + d.h = orig[0].h; + + d.X.rows = orig[0].X.rows; + d.y.rows = orig[0].X.rows; + + d.X.cols = orig[0].X.cols; + d.y.cols = orig[0].y.cols; + + d.X.vals = calloc(orig[0].X.rows, sizeof(float *)); + d.y.vals = calloc(orig[0].y.rows, sizeof(float *)); + int i; + for(i = 0; i < d.X.rows; ++i){ + d.X.vals[i] = orig[inds[i]].X.vals[i]; + d.y.vals[i] = orig[inds[i]].y.vals[i]; + } + return d; +} + +data *tile_data(data orig, int divs, int size) +{ + data *ds = calloc(divs*divs, sizeof(data)); + int i, j; + #pragma omp parallel for + for(i = 0; i < divs*divs; ++i){ + data d; + d.shallow = 0; + d.w = orig.w/divs * size; + d.h = orig.h/divs * size; + d.X.rows = orig.X.rows; + d.X.cols = d.w*d.h*3; + d.X.vals = calloc(d.X.rows, sizeof(float*)); + + d.y = copy_matrix(orig.y); + #pragma omp parallel for + for(j = 0; j < orig.X.rows; ++j){ + int x = (i%divs) * orig.w / divs - (d.w - orig.w/divs)/2; + int y = (i/divs) * orig.h / divs - (d.h - orig.h/divs)/2; + image im = float_to_image(orig.w, orig.h, 3, orig.X.vals[j]); + d.X.vals[j] = crop_image(im, x, y, d.w, d.h).data; + } + ds[i] = d; + } + return ds; +} + data resize_data(data orig, int w, int h) { data d = {0}; @@ -1181,9 +1231,10 @@ data resize_data(data orig, int w, int h) int i; d.X.rows = orig.X.rows; d.X.cols = w*h*3; - d.X.vals = calloc(d.X.rows, sizeof(float)); + d.X.vals = calloc(d.X.rows, sizeof(float*)); d.y = copy_matrix(orig.y); + #pragma omp parallel for for(i = 0; i < orig.X.rows; ++i){ image im = float_to_image(orig.w, orig.h, 3, orig.X.vals[i]); d.X.vals[i] = resize_image(im, w, h).data; @@ -1239,6 +1290,8 @@ data concat_data(data d1, data d2) d.shallow = 1; d.X = concat_matrix(d1.X, d2.X); d.y = concat_matrix(d1.y, d2.y); + d.w = d1.w; + d.h = d1.h; return d; } diff --git a/src/utils.c b/src/utils.c index b469ec55b42..9f1af1df59c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -91,6 +91,22 @@ void shuffle(void *arr, size_t n, size_t size) } } +int *random_index_order(int min, int max) +{ + int *inds = calloc(max-min, sizeof(int)); + int i; + for(i = min; i < max; ++i){ + inds[i] = i; + } + for(i = min; i < max-1; ++i){ + int swap = inds[i]; + int index = i + rand()%(max-i); + inds[i] = inds[index]; + inds[index] = swap; + } + return inds; +} + void del_arg(int argc, char **argv, int index) { int i; @@ -583,6 +599,20 @@ int sample_array(float *a, int n) return n-1; } +int max_int_index(int *a, int n) +{ + if(n <= 0) return -1; + int i, max_i = 0; + int max = a[0]; + for(i = 1; i < n; ++i){ + if(a[i] > max){ + max = a[i]; + max_i = i; + } + } + return max_i; +} + int max_index(float *a, int n) { if(n <= 0) return -1; diff --git a/src/utils.h b/src/utils.h index 4e4670754bb..b0db7abf824 100644 --- a/src/utils.h +++ b/src/utils.h @@ -44,7 +44,6 @@ int constrain_int(int a, int min, int max); float rand_uniform(float min, float max); float rand_scale(float s); int rand_int(int min, int max); -float sum_array(float *a, int n); void mean_arrays(float **a, int n, int els, float *avg); float dist_array(float *a, float *b, int n, int sub); float **one_hot_encode(float *a, int n, int k); From 1a63695c44d56a71a18dda97617bd68cb67800d5 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 7 Nov 2017 16:12:00 -0800 Subject: [PATCH 056/118] that attention stuff doesn't even work :_( --- examples/attention.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/attention.c b/examples/attention.c index 1afd8489316..cd1e579d375 100644 --- a/examples/attention.c +++ b/examples/attention.c @@ -299,7 +299,7 @@ void validate_attention_single(char *datacfg, char *filename, char *weightfile) float *pred = network_predict(net, tile.data); axpy_cpu(classes, 1., pred, 1, avgs, 1); show_image(tile, "tile"); - cvWaitKey(10); + //cvWaitKey(10); } if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 1, 1); From 16686cec576580489ab3c7c78183e6efeafae780 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 7 Nov 2017 16:22:09 -0800 Subject: [PATCH 057/118] SEE I TOTALLY LISTEN TO MY COMMUNITY SOMETIMES I'M LOOKING AT YOU ISSUE \#291 --- examples/detector.py | 1 + python/darknet.py | 3 +++ src/cuda.c | 2 ++ 3 files changed, 6 insertions(+) diff --git a/examples/detector.py b/examples/detector.py index aa565d61169..5b639a3ad61 100644 --- a/examples/detector.py +++ b/examples/detector.py @@ -8,6 +8,7 @@ import darknet as dn +dn.set_gpu(0) net = dn.load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0) meta = dn.load_meta("cfg/coco.data") r = dn.detect(net, meta, "data/dog.jpg") diff --git a/python/darknet.py b/python/darknet.py index d6dfd31ff85..f9aab1ee4f7 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -44,6 +44,9 @@ class METADATA(Structure): predict.argtypes = [c_void_p, POINTER(c_float)] predict.restype = POINTER(c_float) +set_gpu = lib.cuda_set_device +set_gpu.argtypes = [c_int] + make_image = lib.make_image make_image.argtypes = [c_int, c_int, c_int] make_image.restype = IMAGE diff --git a/src/cuda.c b/src/cuda.c index b5c0c3298f7..48aba6e4012 100644 --- a/src/cuda.c +++ b/src/cuda.c @@ -172,5 +172,7 @@ float cuda_mag_array(float *x_gpu, size_t n) free(temp); return m; } +#else +void cuda_set_device(int n){} #endif From 56be49aa4854b81b855f6a9daffce4b4ad1fbb9e Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 21 Nov 2017 11:34:46 -0800 Subject: [PATCH 058/118] I WISH I HAD SOME TESTS THOUGH --- examples/detector.py | 7 ++++--- examples/nightmare.c | 2 +- python/darknet.py | 4 +++- src/convolutional_kernels.cu | 2 +- src/convolutional_layer.c | 12 ++++++------ src/network.c | 1 + 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/examples/detector.py b/examples/detector.py index 5b639a3ad61..40bb365e682 100644 --- a/examples/detector.py +++ b/examples/detector.py @@ -7,11 +7,12 @@ sys.path.append(os.path.join(os.getcwd(),'python/')) import darknet as dn +import pdb dn.set_gpu(0) -net = dn.load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0) -meta = dn.load_meta("cfg/coco.data") -r = dn.detect(net, meta, "data/dog.jpg") +net = dn.load_net("cfg/yolo-thor.cfg", "/home/pjreddie/backup/yolo-thor_final.weights", 0) +meta = dn.load_meta("cfg/thor.data") +r = dn.detect(net, meta, "data/bedroom.jpg") print r # And then down here you could detect a lot more images like: diff --git a/examples/nightmare.c b/examples/nightmare.c index 572396feb36..be2179e4cec 100644 --- a/examples/nightmare.c +++ b/examples/nightmare.c @@ -62,7 +62,7 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa cuda_free(net->delta_gpu); net->delta_gpu = 0; #else - net->input = im.data; + copy_cpu(net->inputs, im.data, 1, net->input, 1); net->delta = delta.data; forward_network(net); copy_cpu(last.outputs, last.output, 1, last.delta, 1); diff --git a/python/darknet.py b/python/darknet.py index f9aab1ee4f7..deffa6123cc 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -13,7 +13,9 @@ def sample(probs): return len(probs)-1 def c_array(ctype, values): - return (ctype * len(values))(*values) + arr = (ctype*len(values))() + arr[:] = values + return arr class BOX(Structure): _fields_ = [("x", c_float), diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index dd516fd311c..45242a1c24a 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -236,7 +236,7 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) float *b = net.workspace; float *c = l.weight_updates_gpu + j*l.nweights/l.groups; - float *im = net.input+(i*l.groups + j)*l.c/l.groups*l.h*l.w; + float *im = net.input_gpu+(i*l.groups + j)*l.c/l.groups*l.h*l.w; im2col_gpu(im, l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, b); diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index 86930b58484..f197bcfe3d4 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -150,24 +150,24 @@ void cudnn_convolutional_setup(layer *l) l->weightDesc, l->convDesc, l->dstTensorDesc, - CUDNN_CONVOLUTION_FWD_PREFER_FASTEST, - 0, + CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT, + 4000000000, &l->fw_algo); cudnnGetConvolutionBackwardDataAlgorithm(cudnn_handle(), l->weightDesc, l->ddstTensorDesc, l->convDesc, l->dsrcTensorDesc, - CUDNN_CONVOLUTION_BWD_DATA_PREFER_FASTEST, - 0, + CUDNN_CONVOLUTION_BWD_DATA_SPECIFY_WORKSPACE_LIMIT, + 4000000000, &l->bd_algo); cudnnGetConvolutionBackwardFilterAlgorithm(cudnn_handle(), l->srcTensorDesc, l->ddstTensorDesc, l->convDesc, l->dweightDesc, - CUDNN_CONVOLUTION_BWD_FILTER_PREFER_FASTEST, - 0, + CUDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT, + 4000000000, &l->bf_algo); } #endif diff --git a/src/network.c b/src/network.c index 6425855dd59..1b4df6bc2ce 100644 --- a/src/network.c +++ b/src/network.c @@ -389,6 +389,7 @@ int resize_network(network *net, int w, int h) error("Cannot resize this type of layer"); } if(l.workspace_size > workspace_size) workspace_size = l.workspace_size; + if(l.workspace_size > 2000000000) assert(0); inputs = l.outputs; net->layers[i] = l; w = l.out_w; From 80d9bec20f0a44ab07616215c6eadb2d633492fe Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 26 Nov 2017 12:27:21 -0800 Subject: [PATCH 059/118] =?UTF-8?q?=F0=9F=8C=83=20=F0=9F=A4=94=20?= =?UTF-8?q?=F0=9F=92=AD=20=F0=9F=91=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/nightmare.c | 6 +++--- src/convolutional_kernels.cu | 2 +- src/parser.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/nightmare.c b/examples/nightmare.c index be2179e4cec..71d38334e6e 100644 --- a/examples/nightmare.c +++ b/examples/nightmare.c @@ -47,7 +47,7 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa #ifdef GPU net->delta_gpu = cuda_make_array(delta.data, im.w*im.h*im.c); - cuda_push_array(net->input_gpu, im.data, net->inputs); + copy_cpu(net->inputs, im.data, 1, net->input, 1); forward_network_gpu(net); copy_gpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1); @@ -62,6 +62,7 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa cuda_free(net->delta_gpu); net->delta_gpu = 0; #else + printf("\nnet: %d %d %d im: %d %d %d\n", net->w, net->h, net->inputs, im.w, im.h, im.c); copy_cpu(net->inputs, im.data, 1, net->input, 1); net->delta = delta.data; forward_network(net); @@ -308,8 +309,7 @@ void run_nightmare(int argc, char **argv) int reconstruct = find_arg(argc, argv, "-reconstruct"); int smooth_size = find_int_arg(argc, argv, "-smooth", 1); - network *net = parse_network_cfg(cfg); - load_weights(net, weights); + network *net = load_network(cfg, weights, 0); char *cfgbase = basecfg(cfg); char *imbase = basecfg(input); diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index 45242a1c24a..56043e78413 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -177,7 +177,7 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) if(l.smooth){ smooth_layer(l, 5, l.smooth); } - constrain_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1); + //constrain_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1); gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); diff --git a/src/parser.c b/src/parser.c index 14914bc908d..da7487b0fe1 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1110,7 +1110,7 @@ void load_weights_upto(network *net, char *filename, int start, int cutoff) fread(&major, sizeof(int), 1, fp); fread(&minor, sizeof(int), 1, fp); fread(&revision, sizeof(int), 1, fp); - if ((major*10 + minor) >= 2){ + if ((major*10 + minor) >= 2 && major < 1000 && minor < 1000){ fread(net->seen, sizeof(size_t), 1, fp); } else { int iseen = 0; From 6e7914530939aeaa4e6cc1a692b15e23d5173ae0 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 26 Dec 2017 10:52:21 -0800 Subject: [PATCH 060/118] MERRY CHRISTMAS I BROKE ALL YOUR DETECTION THINGS --- Makefile | 12 +- cfg/darknet.cfg | 10 +- cfg/tiny-yolo.cfg | 2 +- cfg/yolo.cfg | 10 +- examples/classifier.c | 53 +++- examples/coco.c | 53 ++-- examples/darknet.c | 3 - examples/detector.c | 159 +++++----- examples/lsd.c | 549 ++++++++++++++++----------------- examples/nightmare.c | 4 + examples/super.c | 2 + examples/yolo.c | 50 ++- include/darknet.h | 36 ++- src/blas.c | 22 ++ src/blas.h | 8 +- src/blas_kernels.cu | 89 +++++- src/box.c | 149 ++++----- src/convolutional_layer.c | 1 + src/cost_layer.c | 8 +- src/data.c | 1 + src/deconvolutional_kernels.cu | 12 +- src/deconvolutional_layer.c | 1 + src/demo.c | 69 +++-- src/detection_layer.c | 18 +- src/image.c | 13 +- src/logistic_layer.c | 72 +++++ src/logistic_layer.h | 15 + src/network.c | 71 +++-- src/parser.c | 51 ++- src/region_layer.c | 189 ++++++------ src/region_layer.h | 2 +- src/softmax_layer.c | 20 ++ src/upsample_layer.c | 99 ++++++ src/upsample_layer.h | 15 + src/utils.c | 9 + src/utils.h | 2 +- 36 files changed, 1178 insertions(+), 701 deletions(-) create mode 100644 src/logistic_layer.c create mode 100644 src/logistic_layer.h create mode 100644 src/upsample_layer.c create mode 100644 src/upsample_layer.h diff --git a/Makefile b/Makefile index 5f6f6e2d611..0ae99eccaa2 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -GPU=0 -CUDNN=0 -OPENCV=0 -OPENMP=0 +GPU=1 +CUDNN=1 +OPENCV=1 +OPENMP=1 DEBUG=0 ARCH= -gencode arch=compute_30,code=sm_30 \ @@ -57,8 +57,8 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o -EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o attention.o darknet.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o +EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o darknet.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o avgpool_layer_kernels.o diff --git a/cfg/darknet.cfg b/cfg/darknet.cfg index ccb4629ba9b..9bdee83b008 100644 --- a/cfg/darknet.cfg +++ b/cfg/darknet.cfg @@ -1,12 +1,12 @@ [net] # Train +# batch=128 +# subdivisions=1 +# Test batch=1 subdivisions=1 -# Test -# batch=1 -# subdivisions=1 -height=224 -width=224 +height=256 +width=256 channels=3 momentum=0.9 decay=0.0005 diff --git a/cfg/tiny-yolo.cfg b/cfg/tiny-yolo.cfg index 9a4a184f13b..37e71356220 100644 --- a/cfg/tiny-yolo.cfg +++ b/cfg/tiny-yolo.cfg @@ -120,7 +120,7 @@ filters=425 activation=linear [region] -anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 +anchors = 18.3274,21.6763, 59.9827,66.001, 106.83,175.179, 252.25,112.889, 312.657,293.385 bias_match=1 classes=80 coords=4 diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg index 088edf81573..b8a9f683d1c 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolo.cfg @@ -1,10 +1,10 @@ [net] # Testing -batch=1 -subdivisions=1 +# batch=1 +# subdivisions=1 # Training -# batch=64 -# subdivisions=8 +batch=64 +subdivisions=8 width=608 height=608 channels=3 @@ -239,7 +239,7 @@ activation=linear [region] -anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 +anchors = 18.3274,21.6763, 59.9827,66.001, 106.83,175.179, 252.25,112.889, 312.657,293.385 bias_match=1 classes=80 coords=4 diff --git a/examples/classifier.c b/examples/classifier.c index 8843e5484cb..4dda9516dd4 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -403,6 +403,7 @@ void validate_classifier_single(char *datacfg, char *filename, char *weightfile) if(indexes[j] == class) avg_topk += 1; } + printf("%s, %d, %f, %f, \n", paths[i], class, pred[0], pred[1]); printf("%d: top 1: %f, top %d: %f\n", i, avg_acc/(i+1), topk, avg_topk/(i+1)); } } @@ -704,6 +705,44 @@ void test_classifier(char *datacfg, char *cfgfile, char *weightfile, int target_ } } +void file_output_classifier(char *datacfg, char *filename, char *weightfile, char *listfile) +{ + int i,j; + network *net = load_network(filename, weightfile, 0); + set_batch_network(net, 1); + srand(time(0)); + + list *options = read_data_cfg(datacfg); + + //char *label_list = option_find_str(options, "names", "data/labels.list"); + int classes = option_find_int(options, "classes", 2); + + list *plist = get_paths(listfile); + + char **paths = (char **)list_to_array(plist); + int m = plist->size; + free_list(plist); + + for(i = 0; i < m; ++i){ + image im = load_image_color(paths[i], 0, 0); + image resized = resize_min(im, net->w); + image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h); + + float *pred = network_predict(net, crop.data); + if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 0, 1); + + if(resized.data != im.data) free_image(resized); + free_image(im); + free_image(crop); + + printf("%s", paths[i]); + for(j = 0; j < classes; ++j){ + printf("\t%g", pred[j]); + } + printf("\n"); + } +} + void threat_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename) { @@ -922,15 +961,26 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind srand(2222222); CvCapture * cap; + int w = 1280; + int h = 720; + if(filename){ cap = cvCaptureFromFile(filename); }else{ cap = cvCaptureFromCAM(cam_index); } + if(w){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); + } + if(h){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); + } + int top = option_find_int(options, "top", 1); - char *name_list = option_find_str(options, "names", 0); + char *label_list = option_find_str(options, "labels", 0); + char *name_list = option_find_str(options, "names", label_list); char **names = get_labels(name_list); int *indexes = calloc(top, sizeof(int)); @@ -998,6 +1048,7 @@ void run_classifier(int argc, char **argv) char *layer_s = (argc > 7) ? argv[7]: 0; int layer = layer_s ? atoi(layer_s) : -1; if(0==strcmp(argv[2], "predict")) predict_classifier(data, cfg, weights, filename, top); + else if(0==strcmp(argv[2], "fout")) file_output_classifier(data, cfg, weights, filename); else if(0==strcmp(argv[2], "try")) try_classifier(data, cfg, weights, filename, atoi(layer_s)); else if(0==strcmp(argv[2], "train")) train_classifier(data, cfg, weights, gpus, ngpus, clear); else if(0==strcmp(argv[2], "demo")) demo_classifier(data, cfg, weights, cam_index, filename); diff --git a/examples/coco.c b/examples/coco.c index 77e04bbf289..6d9638c47fe 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -94,14 +94,14 @@ void train_coco(char *cfgfile, char *weightfile) save_weights(net, buff); } -void print_cocos(FILE *fp, int image_id, box *boxes, float **probs, int num_boxes, int classes, int w, int h) +static void print_cocos(FILE *fp, int image_id, detection *dets, int num_boxes, int classes, int w, int h) { int i, j; for(i = 0; i < num_boxes; ++i){ - float xmin = boxes[i].x - boxes[i].w/2.; - float xmax = boxes[i].x + boxes[i].w/2.; - float ymin = boxes[i].y - boxes[i].h/2.; - float ymax = boxes[i].y + boxes[i].h/2.; + float xmin = dets[i].bbox.x - dets[i].bbox.w/2.; + float xmax = dets[i].bbox.x + dets[i].bbox.w/2.; + float ymin = dets[i].bbox.y - dets[i].bbox.h/2.; + float ymax = dets[i].bbox.y + dets[i].bbox.h/2.; if (xmin < 0) xmin = 0; if (ymin < 0) ymin = 0; @@ -114,7 +114,7 @@ void print_cocos(FILE *fp, int image_id, box *boxes, float **probs, int num_boxe float bh = ymax - ymin; for(j = 0; j < classes; ++j){ - if (probs[i][j]) fprintf(fp, "{\"image_id\":%d, \"category_id\":%d, \"bbox\":[%f, %f, %f, %f], \"score\":%f},\n", image_id, coco_ids[j], bx, by, bw, bh, probs[i][j]); + if (dets[i].prob[j]) fprintf(fp, "{\"image_id\":%d, \"category_id\":%d, \"bbox\":[%f, %f, %f, %f], \"score\":%f},\n", image_id, coco_ids[j], bx, by, bw, bh, dets[i].prob[j]); } } } @@ -140,17 +140,13 @@ void validate_coco(char *cfg, char *weights) layer l = net->layers[net->n-1]; int classes = l.classes; - int side = l.side; - int j; char buff[1024]; snprintf(buff, 1024, "%s/coco_results.json", base); FILE *fp = fopen(buff, "w"); fprintf(fp, "[\n"); - box *boxes = calloc(side*side*l.n, sizeof(box)); - float **probs = calloc(side*side*l.n, sizeof(float *)); - for(j = 0; j < side*side*l.n; ++j) probs[j] = calloc(classes, sizeof(float *)); + detection *dets = make_network_boxes(net); int m = plist->size; int i=0; @@ -199,9 +195,9 @@ void validate_coco(char *cfg, char *weights) network_predict(net, X); int w = val[t].w; int h = val[t].h; - get_detection_boxes(l, w, h, thresh, probs, boxes, 0); - if (nms) do_nms_sort(boxes, probs, side*side*l.n, classes, iou_thresh); - print_cocos(fp, image_id, boxes, probs, side*side*l.n, classes, w, h); + fill_network_boxes(net, w, h, thresh, 0, 0, 0, dets); + if (nms) do_nms_sort(dets, l.side*l.side*l.n, classes, iou_thresh); + print_cocos(fp, image_id, dets, l.side*l.side*l.n, classes, w, h); free_image(val[t]); free_image(val_resized[t]); } @@ -235,9 +231,7 @@ void validate_coco_recall(char *cfgfile, char *weightfile) snprintf(buff, 1024, "%s%s.txt", base, coco_classes[j]); fps[j] = fopen(buff, "w"); } - box *boxes = calloc(side*side*l.n, sizeof(box)); - float **probs = calloc(side*side*l.n, sizeof(float *)); - for(j = 0; j < side*side*l.n; ++j) probs[j] = calloc(classes, sizeof(float *)); + detection *dets = make_network_boxes(net); int m = plist->size; int i=0; @@ -245,7 +239,6 @@ void validate_coco_recall(char *cfgfile, char *weightfile) float thresh = .001; int nms = 0; float iou_thresh = .5; - float nms_thresh = .5; int total = 0; int correct = 0; @@ -258,8 +251,9 @@ void validate_coco_recall(char *cfgfile, char *weightfile) image sized = resize_image(orig, net->w, net->h); char *id = basecfg(path); network_predict(net, sized.data); - get_detection_boxes(l, 1, 1, thresh, probs, boxes, 1); - if (nms) do_nms(boxes, probs, side*side*l.n, 1, nms_thresh); + + fill_network_boxes(net, orig.w, orig.h, thresh, 0, 0, 1, dets); + if (nms) do_nms_obj(dets, side*side*l.n, 1, nms); char labelpath[4096]; find_replace(path, "images", "labels", labelpath); @@ -270,7 +264,7 @@ void validate_coco_recall(char *cfgfile, char *weightfile) int num_labels = 0; box_label *truth = read_boxes(labelpath, &num_labels); for(k = 0; k < side*side*l.n; ++k){ - if(probs[k][0] > thresh){ + if(dets[k].objectness > thresh){ ++proposals; } } @@ -279,8 +273,8 @@ void validate_coco_recall(char *cfgfile, char *weightfile) box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h}; float best_iou = 0; for(k = 0; k < side*side*l.n; ++k){ - float iou = box_iou(boxes[k], t); - if(probs[k][0] > thresh && iou > best_iou){ + float iou = box_iou(dets[k].bbox, t); + if(dets[k].objectness > thresh && iou > best_iou){ best_iou = iou; } } @@ -308,10 +302,7 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) clock_t time; char buff[256]; char *input = buff; - int j; - box *boxes = calloc(l.side*l.side*l.n, sizeof(box)); - float **probs = calloc(l.side*l.side*l.n, sizeof(float *)); - for(j = 0; j < l.side*l.side*l.n; ++j) probs[j] = calloc(l.classes, sizeof(float *)); + detection *dets = make_network_boxes(net); while(1){ if(filename){ strncpy(input, filename, 256); @@ -328,9 +319,11 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) time=clock(); network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - get_detection_boxes(l, 1, 1, thresh, probs, boxes, 0); - if (nms) do_nms_sort(boxes, probs, l.side*l.side*l.n, l.classes, nms); - draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, 0, coco_classes, alphabet, 80); + + fill_network_boxes(net, 1, 1, thresh, 0, 0, 0, dets); + if (nms) do_nms_sort(dets, l.side*l.side*l.n, l.classes, nms); + + draw_detections(im, dets, l.side*l.side*l.n, thresh, coco_classes, alphabet, 80); save_image(im, "prediction"); show_image(im, "predictions"); free_image(im); diff --git a/examples/darknet.c b/examples/darknet.c index b89f69aba65..c67f20a1090 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -12,7 +12,6 @@ extern void run_coco(int argc, char **argv); extern void run_captcha(int argc, char **argv); extern void run_nightmare(int argc, char **argv); extern void run_classifier(int argc, char **argv); -extern void run_attention(int argc, char **argv); extern void run_regressor(int argc, char **argv); extern void run_segmenter(int argc, char **argv); extern void run_char_rnn(int argc, char **argv); @@ -432,8 +431,6 @@ int main(int argc, char **argv) predict_classifier("cfg/imagenet1k.data", argv[2], argv[3], argv[4], 5); } else if (0 == strcmp(argv[1], "classifier")){ run_classifier(argc, argv); - } else if (0 == strcmp(argv[1], "attention")){ - run_attention(argc, argv); } else if (0 == strcmp(argv[1], "regressor")){ run_regressor(argc, argv); } else if (0 == strcmp(argv[1], "segmenter")){ diff --git a/examples/detector.c b/examples/detector.c index 155753310b9..ba0b71d0a40 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -2,6 +2,7 @@ static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90}; + void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) { list *options = read_data_cfg(datacfg); @@ -73,6 +74,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i free_data(train); load_thread = load_data(args); + #pragma omp parallel for for(i = 0; i < ngpus; ++i){ resize_network(nets[i], dim, dim); } @@ -84,28 +86,28 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i load_thread = load_data(args); /* - int k; - for(k = 0; k < l.max_boxes; ++k){ - box b = float_to_box(train.y.vals[10] + 1 + k*5); - if(!b.x) break; - printf("loaded: %f %f %f %f\n", b.x, b.y, b.w, b.h); - } - */ + int k; + for(k = 0; k < l.max_boxes; ++k){ + box b = float_to_box(train.y.vals[10] + 1 + k*5); + if(!b.x) break; + printf("loaded: %f %f %f %f\n", b.x, b.y, b.w, b.h); + } + */ /* - int zz; - for(zz = 0; zz < train.X.cols; ++zz){ - image im = float_to_image(net->w, net->h, 3, train.X.vals[zz]); - int k; - for(k = 0; k < l.max_boxes; ++k){ - box b = float_to_box(train.y.vals[zz] + k*5, 1); - printf("%f %f %f %f\n", b.x, b.y, b.w, b.h); - draw_bbox(im, b, 1, 1,0,0); - } - show_image(im, "truth11"); - cvWaitKey(0); - save_image(im, "truth11"); - } - */ + int zz; + for(zz = 0; zz < train.X.cols; ++zz){ + image im = float_to_image(net->w, net->h, 3, train.X.vals[zz]); + int k; + for(k = 0; k < l.max_boxes; ++k){ + box b = float_to_box(train.y.vals[zz] + k*5, 1); + printf("%f %f %f %f\n", b.x, b.y, b.w, b.h); + draw_bbox(im, b, 1, 1,0,0); + } + show_image(im, "truth11"); + cvWaitKey(0); + save_image(im, "truth11"); + } + */ printf("Loaded: %lf seconds\n", what_time_is_it_now()-time); @@ -158,15 +160,15 @@ static int get_coco_image_id(char *filename) return atoi(p+1); } -static void print_cocos(FILE *fp, char *image_path, box *boxes, float **probs, int num_boxes, int classes, int w, int h) +static void print_cocos(FILE *fp, char *image_path, detection *dets, int num_boxes, int classes, int w, int h) { int i, j; int image_id = get_coco_image_id(image_path); for(i = 0; i < num_boxes; ++i){ - float xmin = boxes[i].x - boxes[i].w/2.; - float xmax = boxes[i].x + boxes[i].w/2.; - float ymin = boxes[i].y - boxes[i].h/2.; - float ymax = boxes[i].y + boxes[i].h/2.; + float xmin = dets[i].bbox.x - dets[i].bbox.w/2.; + float xmax = dets[i].bbox.x + dets[i].bbox.w/2.; + float ymin = dets[i].bbox.y - dets[i].bbox.h/2.; + float ymax = dets[i].bbox.y + dets[i].bbox.h/2.; if (xmin < 0) xmin = 0; if (ymin < 0) ymin = 0; @@ -179,19 +181,19 @@ static void print_cocos(FILE *fp, char *image_path, box *boxes, float **probs, i float bh = ymax - ymin; for(j = 0; j < classes; ++j){ - if (probs[i][j]) fprintf(fp, "{\"image_id\":%d, \"category_id\":%d, \"bbox\":[%f, %f, %f, %f], \"score\":%f},\n", image_id, coco_ids[j], bx, by, bw, bh, probs[i][j]); + if (dets[i].prob[j]) fprintf(fp, "{\"image_id\":%d, \"category_id\":%d, \"bbox\":[%f, %f, %f, %f], \"score\":%f},\n", image_id, coco_ids[j], bx, by, bw, bh, dets[i].prob[j]); } } } -void print_detector_detections(FILE **fps, char *id, box *boxes, float **probs, int total, int classes, int w, int h) +void print_detector_detections(FILE **fps, char *id, detection *dets, int total, int classes, int w, int h) { int i, j; for(i = 0; i < total; ++i){ - float xmin = boxes[i].x - boxes[i].w/2. + 1; - float xmax = boxes[i].x + boxes[i].w/2. + 1; - float ymin = boxes[i].y - boxes[i].h/2. + 1; - float ymax = boxes[i].y + boxes[i].h/2. + 1; + float xmin = dets[i].bbox.x - dets[i].bbox.w/2. + 1; + float xmax = dets[i].bbox.x + dets[i].bbox.w/2. + 1; + float ymin = dets[i].bbox.y - dets[i].bbox.h/2. + 1; + float ymax = dets[i].bbox.y + dets[i].bbox.h/2. + 1; if (xmin < 1) xmin = 1; if (ymin < 1) ymin = 1; @@ -199,20 +201,20 @@ void print_detector_detections(FILE **fps, char *id, box *boxes, float **probs, if (ymax > h) ymax = h; for(j = 0; j < classes; ++j){ - if (probs[i][j]) fprintf(fps[j], "%s %f %f %f %f %f\n", id, probs[i][j], + if (dets[i].prob[j]) fprintf(fps[j], "%s %f %f %f %f %f\n", id, dets[i].prob[j], xmin, ymin, xmax, ymax); } } } -void print_imagenet_detections(FILE *fp, int id, box *boxes, float **probs, int total, int classes, int w, int h) +void print_imagenet_detections(FILE *fp, int id, detection *dets, int total, int classes, int w, int h) { int i, j; for(i = 0; i < total; ++i){ - float xmin = boxes[i].x - boxes[i].w/2.; - float xmax = boxes[i].x + boxes[i].w/2.; - float ymin = boxes[i].y - boxes[i].h/2.; - float ymax = boxes[i].y + boxes[i].h/2.; + float xmin = dets[i].bbox.x - dets[i].bbox.w/2.; + float xmax = dets[i].bbox.x + dets[i].bbox.w/2.; + float ymin = dets[i].bbox.y - dets[i].bbox.h/2.; + float ymax = dets[i].bbox.y + dets[i].bbox.h/2.; if (xmin < 0) xmin = 0; if (ymin < 0) ymin = 0; @@ -221,7 +223,7 @@ void print_imagenet_detections(FILE *fp, int id, box *boxes, float **probs, int for(j = 0; j < classes; ++j){ int class = j; - if (probs[i][class]) fprintf(fp, "%d %d %f %f %f %f %f\n", id, j+1, probs[i][class], + if (dets[i].prob[class]) fprintf(fp, "%d %d %f %f %f %f %f\n", id, j+1, dets[i].prob[class], xmin, ymin, xmax, ymax); } } @@ -277,10 +279,7 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char } } - - box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); - float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *)); + detection *dets = make_network_boxes(net); int m = plist->size; int i=0; @@ -334,14 +333,14 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char network_predict(net, input.data); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, net->w, net->h, thresh, probs, boxes, 0, 0, map, .5, 0); - if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); + fill_network_boxes(net, w, h, thresh, .5, map, 0, dets); + if (nms) do_nms_sort(dets, l.w*l.h*l.n, classes, nms); if (coco){ - print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); + print_cocos(fp, path, dets, l.w*l.h*l.n, classes, w, h); } else if (imagenet){ - print_imagenet_detections(fp, i+t-nthreads+1, boxes, probs, l.w*l.h*l.n, classes, w, h); + print_imagenet_detections(fp, i+t-nthreads+1, dets, l.w*l.h*l.n, classes, w, h); } else { - print_detector_detections(fps, id, boxes, probs, l.w*l.h*l.n, classes, w, h); + print_detector_detections(fps, id, dets, l.w*l.h*l.n, classes, w, h); } free(id); free_image(val[t]); @@ -410,10 +409,8 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out } } - - box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); - float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *)); + detection *dets = make_network_boxes(net); + int nboxes = num_boxes(net); int m = plist->size; int i=0; @@ -462,14 +459,14 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out network_predict(net, X); int w = val[t].w; int h = val[t].h; - get_region_boxes(l, w, h, net->w, net->h, thresh, probs, boxes, 0, 0, map, .5, 0); - if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, classes, nms); + fill_network_boxes(net, w, h, thresh, .5, map, 0, dets); + if (nms) do_nms_sort(dets, nboxes, classes, nms); if (coco){ - print_cocos(fp, path, boxes, probs, l.w*l.h*l.n, classes, w, h); + print_cocos(fp, path, dets, nboxes, classes, w, h); } else if (imagenet){ - print_imagenet_detections(fp, i+t-nthreads+1, boxes, probs, l.w*l.h*l.n, classes, w, h); + print_imagenet_detections(fp, i+t-nthreads+1, dets, nboxes, classes, w, h); } else { - print_detector_detections(fps, id, boxes, probs, l.w*l.h*l.n, classes, w, h); + print_detector_detections(fps, id, dets, nboxes, classes, w, h); } free(id); free_image(val[t]); @@ -498,12 +495,9 @@ void validate_detector_recall(char *cfgfile, char *weightfile) char **paths = (char **)list_to_array(plist); layer l = net->layers[net->n-1]; - int classes = l.classes; int j, k; - box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); - float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *)); + detection *dets = make_network_boxes(net); int m = plist->size; int i=0; @@ -516,6 +510,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) int correct = 0; int proposals = 0; float avg_iou = 0; + int nboxes = num_boxes(net); for(i = 0; i < m; ++i){ char *path = paths[i]; @@ -523,8 +518,8 @@ void validate_detector_recall(char *cfgfile, char *weightfile) image sized = resize_image(orig, net->w, net->h); char *id = basecfg(path); network_predict(net, sized.data); - get_region_boxes(l, sized.w, sized.h, net->w, net->h, thresh, probs, boxes, 0, 1, 0, .5, 1); - if (nms) do_nms(boxes, probs, l.w*l.h*l.n, 1, nms); + fill_network_boxes(net, sized.w, sized.h, thresh, .5, 0, 1, dets); + if (nms) do_nms_obj(dets, nboxes, 1, nms); char labelpath[4096]; find_replace(path, "images", "labels", labelpath); @@ -534,8 +529,8 @@ void validate_detector_recall(char *cfgfile, char *weightfile) int num_labels = 0; box_label *truth = read_boxes(labelpath, &num_labels); - for(k = 0; k < l.w*l.h*l.n; ++k){ - if(probs[k][0] > thresh){ + for(k = 0; k < nboxes; ++k){ + if(dets[k].objectness > thresh){ ++proposals; } } @@ -544,8 +539,8 @@ void validate_detector_recall(char *cfgfile, char *weightfile) box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h}; float best_iou = 0; for(k = 0; k < l.w*l.h*l.n; ++k){ - float iou = box_iou(boxes[k], t); - if(probs[k][0] > thresh && iou > best_iou){ + float iou = box_iou(dets[k].bbox, t); + if(dets[k].objectness > thresh && iou > best_iou){ best_iou = iou; } } @@ -562,6 +557,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile) } } + void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen) { list *options = read_data_cfg(datacfg); @@ -575,7 +571,6 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam double time; char buff[256]; char *input = buff; - int j; float nms=.3; while(1){ if(filename){ @@ -595,23 +590,18 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam //resize_network(net, sized.w, sized.h); layer l = net->layers[net->n-1]; - box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); - float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(l.classes + 1, sizeof(float *)); - float **masks = 0; - if (l.coords > 4){ - masks = calloc(l.w*l.h*l.n, sizeof(float*)); - for(j = 0; j < l.w*l.h*l.n; ++j) masks[j] = calloc(l.coords-4, sizeof(float *)); - } + int nboxes = num_boxes(net); + printf("%d\n", nboxes); float *X = sized.data; time=what_time_is_it_now(); network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time); - get_region_boxes(l, im.w, im.h, net->w, net->h, thresh, probs, boxes, masks, 0, 0, hier_thresh, 1); + detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1); //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); - if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); - draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, masks, names, alphabet, l.classes); + if (nms) do_nms_sort(dets, nboxes, l.classes, nms); + draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes); + free_detections(dets, num_boxes(net)); if(outfile){ save_image(im, outfile); } @@ -630,12 +620,19 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam free_image(im); free_image(sized); - free(boxes); - free_ptrs((void **)probs, l.w*l.h*l.n); if (filename) break; } } +void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, detection *dets) +{ + network_predict_image(net, im); + layer l = net->layers[net->n-1]; + int nboxes = num_boxes(net); + fill_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 0, dets); + if (nms) do_nms_sort(dets, nboxes, l.classes, nms); +} + void run_detector(int argc, char **argv) { char *prefix = find_char_arg(argc, argv, "-prefix", 0); diff --git a/examples/lsd.c b/examples/lsd.c index c5977483684..369f63da8e0 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -408,6 +408,8 @@ void test_dcgan(char *cfgfile, char *weightfile) for(i = 0; i < im.w*im.h*im.c; ++i){ im.data[i] = rand_normal(); } + float mag = mag_array(im.data, im.w*im.h*im.c); + //scale_array(im.data, im.w*im.h*im.c, 1./mag); float *X = im.data; time=clock(); @@ -426,21 +428,10 @@ void test_dcgan(char *cfgfile, char *weightfile) } } -void dcgan_batch(network gnet, network anet) -{ - //float *input = calloc(x_size, sizeof(float)); -} - void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images) { #ifdef GPU - //char *train_images = "/home/pjreddie/data/coco/train1.txt"; - //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; - //char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list"; - //char *train_images = "data/64.txt"; - //char *train_images = "data/alp.txt"; - //char *train_images = "data/cifar.txt"; char *backup_directory = "/home/pjreddie/backup/"; srand(time(0)); char *base = basecfg(cfg); @@ -498,7 +489,7 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, //data generated = copy_data(train); while (get_current_batch(gnet) < gnet->max_batches) { - start += 1; + start += 1; i += 1; time=clock(); pthread_join(load_thread, 0); @@ -513,8 +504,8 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, data gen = copy_data(train); for (j = 0; j < imgs; ++j) { - train.y.vals[j][0] = .95; - gen.y.vals[j][0] = .05; + train.y.vals[j][0] = 1; + gen.y.vals[j][0] = 0; } time=clock(); @@ -524,31 +515,35 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, for(z = 0; z < x_size; ++z){ gnet->input[z] = rand_normal(); } + for(z = 0; z < gnet->batch; ++z){ + float mag = mag_array(gnet->input + z*gnet->inputs, gnet->inputs); + scale_array(gnet->input + z*gnet->inputs, gnet->inputs, 1./mag); + } - cuda_push_array(gnet->input_gpu, gnet->input, x_size); - cuda_push_array(gnet->truth_gpu, gnet->truth, y_size); + //cuda_push_array(gnet->input_gpu, gnet->input, x_size); + //cuda_push_array(gnet->truth_gpu, gnet->truth, y_size); *gnet->seen += gnet->batch; - forward_network_gpu(gnet); + forward_network(gnet); fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); - fill_gpu(anet->truths*anet->batch, .95, anet->truth_gpu, 1); - copy_gpu(anet->inputs*anet->batch, imlayer.output_gpu, 1, anet->input_gpu, 1); + fill_cpu(anet->truths*anet->batch, 1, anet->truth, 1); + copy_cpu(anet->inputs*anet->batch, imlayer.output, 1, anet->input, 1); anet->delta_gpu = imerror; - forward_network_gpu(anet); - backward_network_gpu(anet); + forward_network(anet); + backward_network(anet); float genaloss = *anet->cost / anet->batch; printf("%f\n", genaloss); scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); - scal_gpu(imlayer.outputs*imlayer.batch, .00, gnet->layers[gnet->n-1].delta_gpu, 1); + scal_gpu(imlayer.outputs*imlayer.batch, 0, gnet->layers[gnet->n-1].delta_gpu, 1); printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); printf("features %f\n", cuda_mag_array(gnet->layers[gnet->n-1].delta_gpu, imlayer.outputs*imlayer.batch)); axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet->layers[gnet->n-1].delta_gpu, 1); - backward_network_gpu(gnet); + backward_network(gnet); for(k = 0; k < gnet->batch; ++k){ int index = j*gnet->batch + k; @@ -565,23 +560,25 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, //scale_image(im, .5); //translate_image(im2, 1); //scale_image(im2, .5); - #ifdef OPENCV +#ifdef OPENCV if(display){ image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]); image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); show_image(im, "gen"); show_image(im2, "train"); + save_image(im, "gen"); + save_image(im2, "train"); cvWaitKey(50); } - #endif +#endif -/* - if(aloss < .1){ - anet->learning_rate = 0; - } else if (aloss > .3){ - anet->learning_rate = orig_rate; - } - */ + /* + if(aloss < .1){ + anet->learning_rate = 0; + } else if (aloss > .3){ + anet->learning_rate = orig_rate; + } + */ update_network_gpu(gnet); @@ -747,7 +744,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle update_network_gpu(net); - #ifdef OPENCV +#ifdef OPENCV if(display){ image im = float_to_image(anet->w, anet->h, anet->c, gray.X.vals[0]); image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); @@ -755,7 +752,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle show_image(im2, "train"); cvWaitKey(50); } - #endif +#endif free_data(merge); free_data(train); free_data(gray); @@ -786,259 +783,259 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle } /* -void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfile, int clear) -{ + void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfile, int clear) + { #ifdef GPU - char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; - char *backup_directory = "/home/pjreddie/backup/"; - srand(time(0)); - char *base = basecfg(cfgfile); - printf("%s\n", base); - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - if(clear) *net->seen = 0; +char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; +char *backup_directory = "/home/pjreddie/backup/"; +srand(time(0)); +char *base = basecfg(cfgfile); +printf("%s\n", base); +network net = parse_network_cfg(cfgfile); +if(weightfile){ +load_weights(&net, weightfile); +} +if(clear) *net->seen = 0; - char *abase = basecfg(acfgfile); - network anet = parse_network_cfg(acfgfile); - if(aweightfile){ - load_weights(&anet, aweightfile); - } - if(clear) *anet->seen = 0; +char *abase = basecfg(acfgfile); +network anet = parse_network_cfg(acfgfile); +if(aweightfile){ +load_weights(&anet, aweightfile); +} +if(clear) *anet->seen = 0; + +int i, j, k; +layer imlayer = {0}; +for (i = 0; i < net->n; ++i) { +if (net->layers[i].out_c == 3) { +imlayer = net->layers[i]; +break; +} +} - int i, j, k; - layer imlayer = {0}; - for (i = 0; i < net->n; ++i) { - if (net->layers[i].out_c == 3) { - imlayer = net->layers[i]; - break; +printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); +int imgs = net->batch*net->subdivisions; +i = *net->seen/imgs; +data train, buffer; + + +list *plist = get_paths(train_images); +//int N = plist->size; +char **paths = (char **)list_to_array(plist); + +load_args args = {0}; +args.w = net->w; +args.h = net->h; +args.paths = paths; +args.n = imgs; +args.m = plist->size; +args.d = &buffer; + +args.min = net->min_crop; +args.max = net->max_crop; +args.angle = net->angle; +args.aspect = net->aspect; +args.exposure = net->exposure; +args.saturation = net->saturation; +args.hue = net->hue; +args.size = net->w; +args.type = CLASSIFICATION_DATA; +args.classes = 1; +char *ls[1] = {"coco"}; +args.labels = ls; + +pthread_t load_thread = load_data_in_thread(args); +clock_t time; + +network_state gstate = {0}; +gstate.index = 0; +gstate.net = net; +int x_size = get_network_input_size(net)*net->batch; +int y_size = 1*net->batch; +gstate.input = cuda_make_array(0, x_size); +gstate.truth = 0; +gstate.delta = 0; +gstate.train = 1; +float *X = calloc(x_size, sizeof(float)); +float *y = calloc(y_size, sizeof(float)); + +network_state astate = {0}; +astate.index = 0; +astate.net = anet; +int ay_size = get_network_output_size(anet)*anet->batch; +astate.input = 0; +astate.truth = 0; +astate.delta = 0; +astate.train = 1; + +float *imerror = cuda_make_array(0, imlayer.outputs); +float *ones_gpu = cuda_make_array(0, ay_size); +fill_gpu(ay_size, 1, ones_gpu, 1); + +float aloss_avg = -1; +float gloss_avg = -1; + +//data generated = copy_data(train); + +while (get_current_batch(net) < net->max_batches) { + i += 1; + time=clock(); + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data_in_thread(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + + data generated = copy_data(train); + time=clock(); + float gloss = 0; + + for(j = 0; j < net->subdivisions; ++j){ + get_next_batch(train, net->batch, j*net->batch, X, y); + cuda_push_array(gstate.input, X, x_size); + *net->seen += net->batch; + forward_network_gpu(net, gstate); + + fill_gpu(imlayer.outputs, 0, imerror, 1); + astate.input = imlayer.output_gpu; + astate.delta = imerror; + astate.truth = ones_gpu; + forward_network_gpu(anet, astate); + backward_network_gpu(anet, astate); + + scal_gpu(imlayer.outputs, 1, imerror, 1); + axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); + + backward_network_gpu(net, gstate); + + printf("features %f\n", cuda_mag_array(imlayer.delta_gpu, imlayer.outputs)); + printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); + + gloss += get_network_cost(net) /(net->subdivisions*net->batch); + + cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); + for(k = 0; k < net->batch; ++k){ + int index = j*net->batch + k; + copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); + generated.y.vals[index][0] = 0; } } - - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); - int imgs = net->batch*net->subdivisions; - i = *net->seen/imgs; - data train, buffer; - - - list *plist = get_paths(train_images); - //int N = plist->size; - char **paths = (char **)list_to_array(plist); - - load_args args = {0}; - args.w = net->w; - args.h = net->h; - args.paths = paths; - args.n = imgs; - args.m = plist->size; - args.d = &buffer; - - args.min = net->min_crop; - args.max = net->max_crop; - args.angle = net->angle; - args.aspect = net->aspect; - args.exposure = net->exposure; - args.saturation = net->saturation; - args.hue = net->hue; - args.size = net->w; - args.type = CLASSIFICATION_DATA; - args.classes = 1; - char *ls[1] = {"coco"}; - args.labels = ls; - - pthread_t load_thread = load_data_in_thread(args); - clock_t time; - - network_state gstate = {0}; - gstate.index = 0; - gstate.net = net; - int x_size = get_network_input_size(net)*net->batch; - int y_size = 1*net->batch; - gstate.input = cuda_make_array(0, x_size); - gstate.truth = 0; - gstate.delta = 0; - gstate.train = 1; - float *X = calloc(x_size, sizeof(float)); - float *y = calloc(y_size, sizeof(float)); - - network_state astate = {0}; - astate.index = 0; - astate.net = anet; - int ay_size = get_network_output_size(anet)*anet->batch; - astate.input = 0; - astate.truth = 0; - astate.delta = 0; - astate.train = 1; - - float *imerror = cuda_make_array(0, imlayer.outputs); - float *ones_gpu = cuda_make_array(0, ay_size); - fill_gpu(ay_size, 1, ones_gpu, 1); - - float aloss_avg = -1; - float gloss_avg = -1; - - //data generated = copy_data(train); - - while (get_current_batch(net) < net->max_batches) { - i += 1; - time=clock(); - pthread_join(load_thread, 0); - train = buffer; - load_thread = load_data_in_thread(args); - - printf("Loaded: %lf seconds\n", sec(clock()-time)); - - data generated = copy_data(train); - time=clock(); - float gloss = 0; - - for(j = 0; j < net->subdivisions; ++j){ - get_next_batch(train, net->batch, j*net->batch, X, y); - cuda_push_array(gstate.input, X, x_size); - *net->seen += net->batch; - forward_network_gpu(net, gstate); - - fill_gpu(imlayer.outputs, 0, imerror, 1); - astate.input = imlayer.output_gpu; - astate.delta = imerror; - astate.truth = ones_gpu; - forward_network_gpu(anet, astate); - backward_network_gpu(anet, astate); - - scal_gpu(imlayer.outputs, 1, imerror, 1); - axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1); - - backward_network_gpu(net, gstate); - - printf("features %f\n", cuda_mag_array(imlayer.delta_gpu, imlayer.outputs)); - printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs)); - - gloss += get_network_cost(net) /(net->subdivisions*net->batch); - - cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch); - for(k = 0; k < net->batch; ++k){ - int index = j*net->batch + k; - copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1); - generated.y.vals[index][0] = 0; - } - } - harmless_update_network_gpu(anet); - - data merge = concat_data(train, generated); - randomize_data(merge); - float aloss = train_network(anet, merge); - - update_network_gpu(net); - update_network_gpu(anet); - free_data(merge); - free_data(train); - free_data(generated); - if (aloss_avg < 0) aloss_avg = aloss; - aloss_avg = aloss_avg*.9 + aloss*.1; - gloss_avg = gloss_avg*.9 + gloss*.1; - - printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs); - if(i%1000==0){ - char buff[256]; - sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); - save_weights(net, buff); - sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); - save_weights(anet, buff); - } - if(i%100==0){ - char buff[256]; - sprintf(buff, "%s/%s.backup", backup_directory, base); - save_weights(net, buff); - sprintf(buff, "%s/%s.backup", backup_directory, abase); - save_weights(anet, buff); - } + harmless_update_network_gpu(anet); + + data merge = concat_data(train, generated); + randomize_data(merge); + float aloss = train_network(anet, merge); + + update_network_gpu(net); + update_network_gpu(anet); + free_data(merge); + free_data(train); + free_data(generated); + if (aloss_avg < 0) aloss_avg = aloss; + aloss_avg = aloss_avg*.9 + aloss*.1; + gloss_avg = gloss_avg*.9 + gloss*.1; + + printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs); + if(i%1000==0){ + char buff[256]; + sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); + save_weights(net, buff); + sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); + save_weights(anet, buff); } - char buff[256]; - sprintf(buff, "%s/%s_final.weights", backup_directory, base); - save_weights(net, buff); + if(i%100==0){ + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, base); + save_weights(net, buff); + sprintf(buff, "%s/%s.backup", backup_directory, abase); + save_weights(anet, buff); + } +} +char buff[256]; +sprintf(buff, "%s/%s_final.weights", backup_directory, base); +save_weights(net, buff); #endif } */ /* -void train_lsd(char *cfgfile, char *weightfile, int clear) -{ - char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; - char *backup_directory = "/home/pjreddie/backup/"; - srand(time(0)); - char *base = basecfg(cfgfile); - printf("%s\n", base); - float avg_loss = -1; - network net = parse_network_cfg(cfgfile); - if(weightfile){ - load_weights(&net, weightfile); - } - if(clear) *net->seen = 0; - printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); - int imgs = net->batch*net->subdivisions; - int i = *net->seen/imgs; - data train, buffer; - - - list *plist = get_paths(train_images); - //int N = plist->size; - char **paths = (char **)list_to_array(plist); - - load_args args = {0}; - args.w = net->w; - args.h = net->h; - args.paths = paths; - args.n = imgs; - args.m = plist->size; - args.d = &buffer; - - args.min = net->min_crop; - args.max = net->max_crop; - args.angle = net->angle; - args.aspect = net->aspect; - args.exposure = net->exposure; - args.saturation = net->saturation; - args.hue = net->hue; - args.size = net->w; - args.type = CLASSIFICATION_DATA; - args.classes = 1; - char *ls[1] = {"coco"}; - args.labels = ls; - - pthread_t load_thread = load_data_in_thread(args); - clock_t time; - //while(i*imgs < N*120){ - while(get_current_batch(net) < net->max_batches){ - i += 1; - time=clock(); - pthread_join(load_thread, 0); - train = buffer; - load_thread = load_data_in_thread(args); - - printf("Loaded: %lf seconds\n", sec(clock()-time)); - - time=clock(); - float loss = train_network(net, train); - if (avg_loss < 0) avg_loss = loss; - avg_loss = avg_loss*.9 + loss*.1; - - printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs); - if(i%1000==0){ - char buff[256]; - sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); - save_weights(net, buff); - } - if(i%100==0){ - char buff[256]; - sprintf(buff, "%s/%s.backup", backup_directory, base); - save_weights(net, buff); - } - free_data(train); - } - char buff[256]; - sprintf(buff, "%s/%s_final.weights", backup_directory, base); - save_weights(net, buff); + void train_lsd(char *cfgfile, char *weightfile, int clear) + { + char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt"; + char *backup_directory = "/home/pjreddie/backup/"; + srand(time(0)); + char *base = basecfg(cfgfile); + printf("%s\n", base); + float avg_loss = -1; + network net = parse_network_cfg(cfgfile); + if(weightfile){ + load_weights(&net, weightfile); + } + if(clear) *net->seen = 0; + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + int imgs = net->batch*net->subdivisions; + int i = *net->seen/imgs; + data train, buffer; + + + list *plist = get_paths(train_images); +//int N = plist->size; +char **paths = (char **)list_to_array(plist); + +load_args args = {0}; +args.w = net->w; +args.h = net->h; +args.paths = paths; +args.n = imgs; +args.m = plist->size; +args.d = &buffer; + +args.min = net->min_crop; +args.max = net->max_crop; +args.angle = net->angle; +args.aspect = net->aspect; +args.exposure = net->exposure; +args.saturation = net->saturation; +args.hue = net->hue; +args.size = net->w; +args.type = CLASSIFICATION_DATA; +args.classes = 1; +char *ls[1] = {"coco"}; +args.labels = ls; + +pthread_t load_thread = load_data_in_thread(args); +clock_t time; +//while(i*imgs < N*120){ +while(get_current_batch(net) < net->max_batches){ +i += 1; +time=clock(); +pthread_join(load_thread, 0); +train = buffer; +load_thread = load_data_in_thread(args); + +printf("Loaded: %lf seconds\n", sec(clock()-time)); + +time=clock(); +float loss = train_network(net, train); +if (avg_loss < 0) avg_loss = loss; +avg_loss = avg_loss*.9 + loss*.1; + +printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs); +if(i%1000==0){ +char buff[256]; +sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); +save_weights(net, buff); +} +if(i%100==0){ +char buff[256]; +sprintf(buff, "%s/%s.backup", backup_directory, base); +save_weights(net, buff); +} +free_data(train); +} +char buff[256]; +sprintf(buff, "%s/%s_final.weights", backup_directory, base); +save_weights(net, buff); } */ diff --git a/examples/nightmare.c b/examples/nightmare.c index 71d38334e6e..8ec6e966369 100644 --- a/examples/nightmare.c +++ b/examples/nightmare.c @@ -83,6 +83,10 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa */ //rate = rate / abs_mean(out.data, out.w*out.h*out.c); + image gray = make_image(out.w, out.h, out.c); + fill_image(gray, .5); + axpy_cpu(orig.w*orig.h*orig.c, -1, orig.data, 1, gray.data, 1); + axpy_cpu(orig.w*orig.h*orig.c, .1, gray.data, 1, out.data, 1); if(norm) normalize_array(out.data, out.w*out.h*out.c); axpy_cpu(orig.w*orig.h*orig.c, rate, out.data, 1, orig.data, 1); diff --git a/examples/super.c b/examples/super.c index 506b065e50d..79799d055a7 100644 --- a/examples/super.c +++ b/examples/super.c @@ -93,6 +93,8 @@ void test_super(char *cfgfile, char *weightfile, char *filename) image out = get_network_image(net); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); save_image(out, "out"); + show_image(out, "out"); + cvWaitKey(0); free_image(im); if (filename) break; diff --git a/examples/yolo.c b/examples/yolo.c index 9174b4013d6..af4b8b50e9e 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -74,14 +74,14 @@ void train_yolo(char *cfgfile, char *weightfile) save_weights(net, buff); } -void print_yolo_detections(FILE **fps, char *id, box *boxes, float **probs, int total, int classes, int w, int h) +void print_yolo_detections(FILE **fps, char *id, int total, int classes, int w, int h, detection *dets) { int i, j; for(i = 0; i < total; ++i){ - float xmin = boxes[i].x - boxes[i].w/2.; - float xmax = boxes[i].x + boxes[i].w/2.; - float ymin = boxes[i].y - boxes[i].h/2.; - float ymax = boxes[i].y + boxes[i].h/2.; + float xmin = dets[i].bbox.x - dets[i].bbox.w/2.; + float xmax = dets[i].bbox.x + dets[i].bbox.w/2.; + float ymin = dets[i].bbox.y - dets[i].bbox.h/2.; + float ymax = dets[i].bbox.y + dets[i].bbox.h/2.; if (xmin < 0) xmin = 0; if (ymin < 0) ymin = 0; @@ -89,7 +89,7 @@ void print_yolo_detections(FILE **fps, char *id, box *boxes, float **probs, int if (ymax > h) ymax = h; for(j = 0; j < classes; ++j){ - if (probs[i][j]) fprintf(fps[j], "%s %f %f %f %f %f\n", id, probs[i][j], + if (dets[i].prob[j]) fprintf(fps[j], "%s %f %f %f %f %f\n", id, dets[i].prob[j], xmin, ymin, xmax, ymax); } } @@ -118,9 +118,6 @@ void validate_yolo(char *cfg, char *weights) snprintf(buff, 1024, "%s%s.txt", base, voc_names[j]); fps[j] = fopen(buff, "w"); } - box *boxes = calloc(l.side*l.side*l.n, sizeof(box)); - float **probs = calloc(l.side*l.side*l.n, sizeof(float *)); - for(j = 0; j < l.side*l.side*l.n; ++j) probs[j] = calloc(classes, sizeof(float *)); int m = plist->size; int i=0; @@ -136,6 +133,7 @@ void validate_yolo(char *cfg, char *weights) image *buf = calloc(nthreads, sizeof(image)); image *buf_resized = calloc(nthreads, sizeof(image)); pthread_t *thr = calloc(nthreads, sizeof(pthread_t)); + detection *dets = make_network_boxes(net); load_args args = {0}; args.w = net->w; @@ -169,9 +167,9 @@ void validate_yolo(char *cfg, char *weights) network_predict(net, X); int w = val[t].w; int h = val[t].h; - get_detection_boxes(l, w, h, thresh, probs, boxes, 0); - if (nms) do_nms_sort(boxes, probs, l.side*l.side*l.n, classes, iou_thresh); - print_yolo_detections(fps, id, boxes, probs, l.side*l.side*l.n, classes, w, h); + fill_network_boxes(net, w, h, thresh, 0, 0, 0, dets); + if (nms) do_nms_sort(dets, l.side*l.side*l.n, classes, iou_thresh); + print_yolo_detections(fps, id, l.side*l.side*l.n, classes, w, h, dets); free(id); free_image(val[t]); free_image(val_resized[t]); @@ -202,9 +200,7 @@ void validate_yolo_recall(char *cfg, char *weights) snprintf(buff, 1024, "%s%s.txt", base, voc_names[j]); fps[j] = fopen(buff, "w"); } - box *boxes = calloc(side*side*l.n, sizeof(box)); - float **probs = calloc(side*side*l.n, sizeof(float *)); - for(j = 0; j < side*side*l.n; ++j) probs[j] = calloc(classes, sizeof(float *)); + detection *dets = make_network_boxes(net); int m = plist->size; int i=0; @@ -224,8 +220,9 @@ void validate_yolo_recall(char *cfg, char *weights) image sized = resize_image(orig, net->w, net->h); char *id = basecfg(path); network_predict(net, sized.data); - get_detection_boxes(l, orig.w, orig.h, thresh, probs, boxes, 1); - if (nms) do_nms(boxes, probs, side*side*l.n, 1, nms); + + fill_network_boxes(net, orig.w, orig.h, thresh, 0, 0, 1, dets); + if (nms) do_nms_obj(dets, side*side*l.n, 1, nms); char labelpath[4096]; find_replace(path, "images", "labels", labelpath); @@ -236,7 +233,7 @@ void validate_yolo_recall(char *cfg, char *weights) int num_labels = 0; box_label *truth = read_boxes(labelpath, &num_labels); for(k = 0; k < side*side*l.n; ++k){ - if(probs[k][0] > thresh){ + if(dets[k].objectness > thresh){ ++proposals; } } @@ -245,8 +242,8 @@ void validate_yolo_recall(char *cfg, char *weights) box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h}; float best_iou = 0; for(k = 0; k < side*side*l.n; ++k){ - float iou = box_iou(boxes[k], t); - if(probs[k][0] > thresh && iou > best_iou){ + float iou = box_iou(dets[k].bbox, t); + if(dets[k].objectness > thresh && iou > best_iou){ best_iou = iou; } } @@ -273,11 +270,8 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) clock_t time; char buff[256]; char *input = buff; - int j; float nms=.4; - box *boxes = calloc(l.side*l.side*l.n, sizeof(box)); - float **probs = calloc(l.side*l.side*l.n, sizeof(float *)); - for(j = 0; j < l.side*l.side*l.n; ++j) probs[j] = calloc(l.classes, sizeof(float *)); + detection *dets = make_network_boxes(net); while(1){ if(filename){ strncpy(input, filename, 256); @@ -294,9 +288,11 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) time=clock(); network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - get_detection_boxes(l, 1, 1, thresh, probs, boxes, 0); - if (nms) do_nms_sort(boxes, probs, l.side*l.side*l.n, l.classes, nms); - draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, 0, voc_names, alphabet, 20); + + fill_network_boxes(net, 1, 1, thresh, 0, 0, 0, dets); + if (nms) do_nms_sort(dets, l.side*l.side*l.n, l.classes, nms); + + draw_detections(im, dets, l.side*l.side*l.n, thresh, voc_names, alphabet, 20); save_image(im, "predictions"); show_image(im, "predictions"); diff --git a/include/darknet.h b/include/darknet.h index 5fa2ec17c34..0165284d396 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -85,6 +85,8 @@ typedef enum { XNOR, REGION, REORG, + UPSAMPLE, + LOGXENT, BLANK } LAYER_TYPE; @@ -166,12 +168,13 @@ struct layer{ int background; int rescore; int objectness; - int does_cost; int joint; int noadjust; int reorg; int log; int tanh; + int *mask; + int total; float alpha; float beta; @@ -228,6 +231,7 @@ struct layer{ float * delta; float * output; + float * loss; float * squared; float * norms; @@ -389,6 +393,7 @@ struct layer{ float * scale_change_gpu; float * output_gpu; + float * loss_gpu; float * delta_gpu; float * rand_gpu; float * squared_gpu; @@ -501,6 +506,15 @@ typedef struct{ float x, y, w, h; } box; +typedef struct detection{ + box bbox; + int classes; + float *prob; + float *mask; + float objectness; + int sort_class; +} detection; + typedef struct matrix{ int rows, cols; float **vals; @@ -593,6 +607,7 @@ void update_network(network *net); void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void copy_cpu(int N, float *X, int INCX, float *Y, int INCY); void scal_cpu(int N, float ALPHA, float *X, int INCX); +void fill_cpu(int N, float ALPHA, float * X, int INCX); void normalize_cpu(float *x, float *mean, float *variance, int batch, int filters, int spatial); void softmax(float *input, int n, float temp, int stride, float *output); @@ -644,7 +659,7 @@ void rgbgr_weights(layer l); image *get_weights(layer l); void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, int avg, float hier_thresh, int w, int h, int fps, int fullscreen); -void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness); +void get_detection_detections(layer l, int w, int h, float thresh, detection *dets); char *option_find_str(list *l, char *key, char *def); int option_find_int(list *l, char *key, int def); @@ -656,7 +671,7 @@ void save_weights_upto(network *net, char *filename, int cutoff); void load_weights_upto(network *net, char *filename, int start, int cutoff); void zero_objectness(layer l); -void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, float **masks, int only_objectness, int *map, float tree_thresh, int relative); +void get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets); void free_network(network *net); void set_batch_network(network *net, int b); void set_temp_network(network *net, float t); @@ -697,11 +712,10 @@ double what_time_is_it_now(); image rotate_image(image m, float rad); void visualize_network(network *net); float box_iou(box a, box b); -void do_nms(box *boxes, float **probs, int total, int classes, float thresh); data load_all_cifar10(); box_label *read_boxes(char *filename, int *n); box float_to_box(float *f, int stride); -void draw_detections(image im, int num, float thresh, box *boxes, float **probs, float **masks, char **names, image **alphabet, int classes); +void draw_detections(image im, detection *dets, int num, float thresh, char **names, image **alphabet, int classes); matrix network_predict_data(network *net, data test); image **load_alphabet(); @@ -711,15 +725,18 @@ float *network_predict(network *net, float *input); int network_width(network *net); int network_height(network *net); float *network_predict_image(network *net, image im); -void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, box *boxes, float **probs); +void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, detection *dets); int num_boxes(network *net); -box *make_boxes(network *net); +detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative); +void fill_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, detection *dets); +detection *make_network_boxes(network *net); +void free_detections(detection *dets, int n); void reset_network_state(network *net, int b); char **get_labels(char *filename); -void do_nms_sort(box *boxes, float **probs, int total, int classes, float thresh); -void do_nms_obj(box *boxes, float **probs, int total, int classes, float thresh); +void do_nms_obj(detection *dets, int total, int classes, float thresh); +void do_nms_sort(detection *dets, int total, int classes, float thresh); matrix make_matrix(int rows, int cols); @@ -758,6 +775,7 @@ void free_list(list *l); float mse_array(float *a, int n); float variance_array(float *a, int n); float mag_array(float *a, int n); +void scale_array(float *a, int n, float s); float mean_array(float *a, int n); float sum_array(float *a, int n); void normalize_array(float *a, int n); diff --git a/src/blas.c b/src/blas.c index d25c1969e0f..bd8b55346dc 100644 --- a/src/blas.c +++ b/src/blas.c @@ -241,6 +241,28 @@ void l1_cpu(int n, float *pred, float *truth, float *delta, float *error) } } +void softmax_x_ent_cpu(int n, float *pred, float *truth, float *delta, float *error) +{ + int i; + for(i = 0; i < n; ++i){ + float t = truth[i]; + float p = pred[i]; + error[i] = (t) ? -log(p) : 0; + delta[i] = t-p; + } +} + +void logistic_x_ent_cpu(int n, float *pred, float *truth, float *delta, float *error) +{ + int i; + for(i = 0; i < n; ++i){ + float t = truth[i]; + float p = pred[i]; + error[i] = -t*log(p) - (1-t)*log(1-p); + delta[i] = t-p; + } +} + void l2_cpu(int n, float *pred, float *truth, float *delta, float *error) { int i; diff --git a/src/blas.h b/src/blas.h index a8408f32c62..ec827e4dfa1 100644 --- a/src/blas.h +++ b/src/blas.h @@ -19,7 +19,6 @@ void constrain_gpu(int N, float ALPHA, float * X, int INCX); void pow_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void mul_cpu(int N, float *X, int INCX, float *Y, int INCY); -void fill_cpu(int N, float ALPHA, float * X, int INCX); float dot_cpu(int N, float *X, int INCX, float *Y, int INCY); int test_gpu_blas(); void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out); @@ -36,6 +35,8 @@ void normalize_delta_cpu(float *x, float *mean, float *variance, float *mean_del void smooth_l1_cpu(int n, float *pred, float *truth, float *delta, float *error); void l2_cpu(int n, float *pred, float *truth, float *delta, float *error); void l1_cpu(int n, float *pred, float *truth, float *delta, float *error); +void logistic_x_ent_cpu(int n, float *pred, float *truth, float *delta, float *error); +void softmax_x_ent_cpu(int n, float *pred, float *truth, float *delta, float *error); void weighted_sum_cpu(float *a, float *b, float *s, int num, float *c); void weighted_delta_cpu(float *a, float *b, float *s, float *da, float *db, float *ds, int n, float *dc); @@ -52,7 +53,7 @@ void copy_gpu(int N, float * X, int INCX, float * Y, int INCY); void copy_gpu_offset(int N, float * X, int OFFX, int INCX, float * Y, int OFFY, int INCY); void add_gpu(int N, float ALPHA, float * X, int INCX); void supp_gpu(int N, float ALPHA, float * X, int INCX); -void mask_gpu(int N, float * X, float mask_num, float * mask); +void mask_gpu(int N, float * X, float mask_num, float * mask, float val); void scale_mask_gpu(int N, float * X, float mask_num, float * mask, float scale); void const_gpu(int N, float ALPHA, float *X, int INCX); void pow_gpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); @@ -76,6 +77,8 @@ void scale_bias_gpu(float *output, float *biases, int batch, int n, int size); void add_bias_gpu(float *output, float *biases, int batch, int n, int size); void backward_bias_gpu(float *bias_updates, float *delta, int batch, int n, int size); +void logistic_x_ent_gpu(int n, float *pred, float *truth, float *delta, float *error); +void softmax_x_ent_gpu(int n, float *pred, float *truth, float *delta, float *error); void smooth_l1_gpu(int n, float *pred, float *truth, float *delta, float *error); void l2_gpu(int n, float *pred, float *truth, float *delta, float *error); void l1_gpu(int n, float *pred, float *truth, float *delta, float *error); @@ -93,6 +96,7 @@ void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rat void flatten_gpu(float *x, int spatial, int layers, int batch, int forward, float *out); void softmax_tree(float *input, int spatial, int batch, int stride, float temp, float *output, tree hier); +void upsample_gpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out); #endif #endif diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index a483f2ebbc6..b04c2461d42 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -446,12 +446,6 @@ __global__ void fill_kernel(int N, float ALPHA, float *X, int INCX) if(i < N) X[i*INCX] = ALPHA; } -__global__ void mask_kernel(int n, float *x, float mask_num, float *mask) -{ - int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; - if(i < n && mask[i] == mask_num) x[i] = mask_num; -} - __global__ void copy_kernel(int N, float *X, int OFFX, int INCX, float *Y, int OFFY, int INCY) { int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; @@ -621,21 +615,27 @@ extern "C" void reorg_gpu(float *x, int w, int h, int c, int batch, int stride, check_error(cudaPeekAtLastError()); } -__global__ void scale_mask_kernel(int n, float *x, float mask_num, float *mask, float scale) +__global__ void mask_kernel(int n, float *x, float mask_num, float *mask, float val) { int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; - if(i < n && mask[i] == mask_num) x[i] *= scale; + if(i < n && mask[i] == mask_num) x[i] = val; } -extern "C" void scale_mask_gpu(int N, float * X, float mask_num, float * mask, float scale) +extern "C" void mask_gpu(int N, float * X, float mask_num, float * mask, float val) { - scale_mask_kernel<<>>(N, X, mask_num, mask, scale); + mask_kernel<<>>(N, X, mask_num, mask, val); check_error(cudaPeekAtLastError()); } -extern "C" void mask_gpu(int N, float * X, float mask_num, float * mask) +__global__ void scale_mask_kernel(int n, float *x, float mask_num, float *mask, float scale) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < n && mask[i] == mask_num) x[i] *= scale; +} + +extern "C" void scale_mask_gpu(int N, float * X, float mask_num, float * mask, float scale) { - mask_kernel<<>>(N, X, mask_num, mask); + scale_mask_kernel<<>>(N, X, mask_num, mask, scale); check_error(cudaPeekAtLastError()); } @@ -734,6 +734,40 @@ extern "C" void smooth_l1_gpu(int n, float *pred, float *truth, float *delta, fl check_error(cudaPeekAtLastError()); } +__global__ void softmax_x_ent_kernel(int n, float *pred, float *truth, float *delta, float *error) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < n){ + float t = truth[i]; + float p = pred[i]; + error[i] = (t) ? -log(p) : 0; + delta[i] = t-p; + } +} + +extern "C" void softmax_x_ent_gpu(int n, float *pred, float *truth, float *delta, float *error) +{ + softmax_x_ent_kernel<<>>(n, pred, truth, delta, error); + check_error(cudaPeekAtLastError()); +} + +__global__ void logistic_x_ent_kernel(int n, float *pred, float *truth, float *delta, float *error) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < n){ + float t = truth[i]; + float p = pred[i]; + error[i] = -t*log(p) - (1-t)*log(1-p); + delta[i] = t-p; + } +} + +extern "C" void logistic_x_ent_gpu(int n, float *pred, float *truth, float *delta, float *error) +{ + logistic_x_ent_kernel<<>>(n, pred, truth, delta, error); + check_error(cudaPeekAtLastError()); +} + __global__ void l2_kernel(int n, float *pred, float *truth, float *delta, float *error) { int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; @@ -920,3 +954,34 @@ extern "C" void softmax_gpu(float *input, int n, int batch, int batch_offset, in softmax_kernel<<>>(input, n, batch, batch_offset, groups, group_offset, stride, temp, output); check_error(cudaPeekAtLastError()); } + + +__global__ void upsample_kernel(size_t N, float *x, int w, int h, int c, int batch, int stride, int forward, float *out) +{ + size_t i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i >= N) return; + int out_index = i; + int out_w = i%(w*stride); + i = i/(w*stride); + int out_h = i%(h*stride); + i = i/(h*stride); + int out_c = i%c; + i = i/c; + int b = i%batch; + + int in_w = out_w / stride; + int in_h = out_h / stride; + int in_c = out_c; + + int in_index = b*w*h*c + in_c*w*h + in_h*w + in_w; + + + if(forward) out[out_index] = x[in_index]; + else atomicAdd(x+in_index, out[out_index]); +} +extern "C" void upsample_gpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out) +{ + size_t size = w*h*c*batch*stride*stride; + upsample_kernel<<>>(size, in, w, h, c, batch, stride, forward, out); + check_error(cudaPeekAtLastError()); +} diff --git a/src/box.c b/src/box.c index 88ca71ac865..f0a3504d4c5 100644 --- a/src/box.c +++ b/src/box.c @@ -3,9 +3,83 @@ #include #include +int nms_comparator(const void *pa, const void *pb) +{ + detection a = *(detection *)pa; + detection b = *(detection *)pb; + float diff = 0; + if(b.sort_class >= 0){ + diff = a.prob[b.sort_class] - b.prob[b.sort_class]; + } else { + diff = a.objectness - b.objectness; + } + if(diff < 0) return 1; + else if(diff > 0) return -1; + return 0; +} + +void do_nms_obj(detection *dets, int total, int classes, float thresh) +{ + int i, j, k; + + for(i = 0; i < total; ++i){ + dets[i].sort_class = -1; + } + + qsort(dets, total, sizeof(detection), nms_comparator); + for(i = 0; i < total; ++i){ + if(dets[i].objectness == 0) continue; + box a = dets[i].bbox; + for(j = i+1; j < total; ++j){ + if(dets[j].objectness == 0) continue; + box b = dets[j].bbox; + if (box_iou(a, b) > thresh){ + dets[j].objectness = 0; + for(k = 0; k < classes; ++k){ + dets[j].prob[k] = 0; + } + } + } + } +} + + +void do_nms_sort(detection *dets, int total, int classes, float thresh) +{ + int i, j, k; + k = total-1; + for(i = 0; i <= k; ++i){ + if(dets[i].objectness == 0){ + detection swap = dets[i]; + dets[i] = dets[k]; + dets[k] = swap; + --k; + --i; + } + } + total = k+1; + + for(k = 0; k < classes; ++k){ + for(i = 0; i < total; ++i){ + dets[i].sort_class = k; + } + qsort(dets, total, sizeof(detection), nms_comparator); + for(i = 0; i < total; ++i){ + if(dets[i].prob[k] == 0) continue; + box a = dets[i].bbox; + for(j = i+1; j < total; ++j){ + box b = dets[j].bbox; + if (box_iou(a, b) > thresh){ + dets[j].prob[k] = 0; + } + } + } + } +} + box float_to_box(float *f, int stride) { - box b; + box b = {0}; b.x = f[0]; b.y = f[1*stride]; b.w = f[2*stride]; @@ -230,79 +304,6 @@ dbox diou(box a, box b) return dd; } -typedef struct{ - int index; - int class; - float **probs; -} sortable_bbox; - -int nms_comparator(const void *pa, const void *pb) -{ - sortable_bbox a = *(sortable_bbox *)pa; - sortable_bbox b = *(sortable_bbox *)pb; - float diff = a.probs[a.index][b.class] - b.probs[b.index][b.class]; - if(diff < 0) return 1; - else if(diff > 0) return -1; - return 0; -} - -void do_nms_obj(box *boxes, float **probs, int total, int classes, float thresh) -{ - int i, j, k; - sortable_bbox *s = calloc(total, sizeof(sortable_bbox)); - - for(i = 0; i < total; ++i){ - s[i].index = i; - s[i].class = classes; - s[i].probs = probs; - } - - qsort(s, total, sizeof(sortable_bbox), nms_comparator); - for(i = 0; i < total; ++i){ - if(probs[s[i].index][classes] == 0) continue; - box a = boxes[s[i].index]; - for(j = i+1; j < total; ++j){ - box b = boxes[s[j].index]; - if (box_iou(a, b) > thresh){ - for(k = 0; k < classes+1; ++k){ - probs[s[j].index][k] = 0; - } - } - } - } - free(s); -} - - -void do_nms_sort(box *boxes, float **probs, int total, int classes, float thresh) -{ - int i, j, k; - sortable_bbox *s = calloc(total, sizeof(sortable_bbox)); - - for(i = 0; i < total; ++i){ - s[i].index = i; - s[i].class = 0; - s[i].probs = probs; - } - - for(k = 0; k < classes; ++k){ - for(i = 0; i < total; ++i){ - s[i].class = k; - } - qsort(s, total, sizeof(sortable_bbox), nms_comparator); - for(i = 0; i < total; ++i){ - if(probs[s[i].index][k] == 0) continue; - box a = boxes[s[i].index]; - for(j = i+1; j < total; ++j){ - box b = boxes[s[j].index]; - if (box_iou(a, b) > thresh){ - probs[s[j].index][k] = 0; - } - } - } - } - free(s); -} void do_nms(box *boxes, float **probs, int total, int classes, float thresh) { diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index f197bcfe3d4..aca2da384dd 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -203,6 +203,7 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int // float scale = 1./sqrt(size*size*c); float scale = sqrt(2./(size*size*c/l.groups)); + //printf("convscale %f\n", scale); //scale = .02; //for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_uniform(-1, 1); for(i = 0; i < l.nweights; ++i) l.weights[i] = scale*rand_normal(); diff --git a/src/cost_layer.c b/src/cost_layer.c index 7ef1094b69b..ebf332fe80d 100644 --- a/src/cost_layer.c +++ b/src/cost_layer.c @@ -123,14 +123,11 @@ int float_abs_compare (const void * a, const void * b) void forward_cost_layer_gpu(cost_layer l, network net) { - if (!net.truth_gpu) return; + if (!net.truth) return; if(l.smooth){ scal_gpu(l.batch*l.inputs, (1-l.smooth), net.truth_gpu, 1); add_gpu(l.batch*l.inputs, l.smooth * 1./l.inputs, net.truth_gpu, 1); } - if (l.cost_type == MASKED) { - mask_gpu(l.batch*l.inputs, net.input_gpu, SECRET_NUM, net.truth_gpu); - } if(l.cost_type == SMOOTH){ smooth_l1_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); @@ -144,6 +141,9 @@ void forward_cost_layer_gpu(cost_layer l, network net) scale_mask_gpu(l.batch*l.inputs, l.delta_gpu, 0, net.truth_gpu, l.noobject_scale); scale_mask_gpu(l.batch*l.inputs, l.output_gpu, 0, net.truth_gpu, l.noobject_scale); } + if (l.cost_type == MASKED) { + mask_gpu(l.batch*l.inputs, net.delta_gpu, SECRET_NUM, net.truth_gpu, 0); + } if(l.ratio){ cuda_pull_array(l.delta_gpu, l.delta, l.batch*l.inputs); diff --git a/src/data.c b/src/data.c index 935e6389515..246528e8a27 100644 --- a/src/data.c +++ b/src/data.c @@ -506,6 +506,7 @@ void fill_truth(char *path, char **labels, int k, float *truth) if(strstr(path, labels[i])){ truth[i] = 1; ++count; + //printf("%s %s %d\n", path, labels[i], i); } } if(count != 1 && (k != 1 || count != 0)) printf("Too many or too few labels: %d, %s\n", count, path); diff --git a/src/deconvolutional_kernels.cu b/src/deconvolutional_kernels.cu index d7e29462662..8267dcfa25b 100644 --- a/src/deconvolutional_kernels.cu +++ b/src/deconvolutional_kernels.cu @@ -45,7 +45,7 @@ extern "C" void backward_deconvolutional_layer_gpu(layer l, network net) { int i; - constrain_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1); + //constrain_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1); gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); if(l.batch_normalize){ @@ -116,18 +116,16 @@ void update_deconvolutional_layer_gpu(layer l, update_args a) float decay = a.decay; int batch = a.batch; - int size = l.size*l.size*l.c*l.n; - if(a.adam){ - adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, size, batch, a.t); + adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.nweights, batch, a.t); adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); if(l.scales_gpu){ adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t); } }else{ - axpy_gpu(size, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); - axpy_gpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); - scal_gpu(size, momentum, l.weight_updates_gpu, 1); + axpy_gpu(l.nweights, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1); + axpy_gpu(l.nweights, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1); + scal_gpu(l.nweights, momentum, l.weight_updates_gpu, 1); axpy_gpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1); scal_gpu(l.n, momentum, l.bias_updates_gpu, 1); diff --git a/src/deconvolutional_layer.c b/src/deconvolutional_layer.c index 674ce6b3e9f..63e51ba69b8 100644 --- a/src/deconvolutional_layer.c +++ b/src/deconvolutional_layer.c @@ -39,6 +39,7 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size l.biases = calloc(n, sizeof(float)); l.bias_updates = calloc(n, sizeof(float)); float scale = .02; + printf("scale: %f\n", scale); for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_normal(); for(i = 0; i < n; ++i){ l.biases[i] = 0; diff --git a/src/demo.c b/src/demo.c index ec73abd5283..68294b430bf 100644 --- a/src/demo.c +++ b/src/demo.c @@ -17,8 +17,6 @@ static char **demo_names; static image **demo_alphabet; static int demo_classes; -static float **probs; -static box *boxes; static network *net; static image buff [3]; static image buff_letter[3]; @@ -31,13 +29,19 @@ static float demo_hier = .5; static int running = 0; static int demo_frame = 3; -static int demo_detections = 0; -static float **predictions; static int demo_index = 0; +static int demo_detections = 0; +//static float **predictions; +static detection **dets; +static detection *avg; +//static float *avg; static int demo_done = 0; -static float *avg; double demo_time; +detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative); +detection *make_network_boxes(network *net); +void fill_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, detection *dets); + void *detect_in_thread(void *ptr) { running = 1; @@ -45,26 +49,45 @@ void *detect_in_thread(void *ptr) layer l = net->layers[net->n-1]; float *X = buff_letter[(buff_index+2)%3].data; - float *prediction = network_predict(net, X); + network_predict(net, X); - memcpy(predictions[demo_index], prediction, l.outputs*sizeof(float)); - mean_arrays(predictions, demo_frame, l.outputs, avg); - l.output = avg; + /* if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); - } else if (l.type == REGION){ - get_region_boxes(l, buff[0].w, buff[0].h, net->w, net->h, demo_thresh, probs, boxes, 0, 0, 0, demo_hier, 1); + } else */ + if (l.type == REGION){ + fill_network_boxes(net, buff[0].w, buff[0].h, demo_thresh, demo_hier, 0, 1, dets[demo_index]); } else { error("Last layer must produce detections\n"); } - if (nms > 0) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); + + int i,j; + box zero = {0}; + int classes = l.classes; + for(i = 0; i < demo_detections; ++i){ + avg[i].objectness = 0; + avg[i].bbox = zero; + memset(avg[i].prob, 0, classes*sizeof(float)); + for(j = 0; j < demo_frame; ++j){ + axpy_cpu(classes, 1./demo_frame, dets[j][i].prob, 1, avg[i].prob, 1); + avg[i].objectness += dets[j][i].objectness * 1./demo_frame; + avg[i].bbox.x += dets[j][i].bbox.x * 1./demo_frame; + avg[i].bbox.y += dets[j][i].bbox.y * 1./demo_frame; + avg[i].bbox.w += dets[j][i].bbox.w * 1./demo_frame; + avg[i].bbox.h += dets[j][i].bbox.h * 1./demo_frame; + } + //copy_cpu(classes, dets[0][i].prob, 1, avg[i].prob, 1); + //avg[i].objectness = dets[0][i].objectness; + } + + if (nms > 0) do_nms_obj(avg, demo_detections, l.classes, nms); printf("\033[2J"); printf("\033[1;1H"); printf("\nFPS:%.1f\n",fps); printf("Objects:\n\n"); image display = buff[(buff_index+2) % 3]; - draw_detections(display, demo_detections, demo_thresh, boxes, probs, 0, demo_names, demo_alphabet, demo_classes); + draw_detections(display, avg, demo_detections, demo_thresh, demo_names, demo_alphabet, demo_classes); demo_index = (demo_index + 1)%demo_frame; running = 0; @@ -117,8 +140,7 @@ void *detect_loop(void *ptr) void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen) { - demo_frame = avg_frames; - predictions = calloc(demo_frame, sizeof(float*)); + //demo_frame = avg_frames; image **alphabet = load_alphabet(); demo_names = names; demo_alphabet = alphabet; @@ -152,16 +174,11 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(!cap) error("Couldn't connect to webcam.\n"); - layer l = net->layers[net->n-1]; - demo_detections = l.n*l.w*l.h; - int j; - - avg = (float *) calloc(l.outputs, sizeof(float)); - for(j = 0; j < demo_frame; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float)); - - boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box)); - probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes+1, sizeof(float)); + demo_detections = num_boxes(net); + avg = make_network_boxes(net); + dets = calloc(demo_frame, sizeof(detection*)); + int i; + for(i = 0; i < demo_frame; ++i) dets[i] = make_network_boxes(net); buff[0] = get_image_from_stream(cap); buff[1] = copy_image(buff[0]); @@ -203,6 +220,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch } } +/* void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen) { demo_frame = avg_frames; @@ -290,6 +308,7 @@ void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float th ++count; } } +*/ #else void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg, float hier, int w, int h, int frames, int fullscreen) { diff --git a/src/detection_layer.c b/src/detection_layer.c index 5c8a1cea3d3..015ee3173d4 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -222,7 +222,7 @@ void backward_detection_layer(const detection_layer l, network net) axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, net.delta, 1); } -void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box *boxes, int only_objectness) +void get_detection_detections(layer l, int w, int h, float thresh, detection *dets) { int i,j,n; float *predictions = l.output; @@ -235,17 +235,17 @@ void get_detection_boxes(layer l, int w, int h, float thresh, float **probs, box int p_index = l.side*l.side*l.classes + i*l.n + n; float scale = predictions[p_index]; int box_index = l.side*l.side*(l.classes + l.n) + (i*l.n + n)*4; - boxes[index].x = (predictions[box_index + 0] + col) / l.side * w; - boxes[index].y = (predictions[box_index + 1] + row) / l.side * h; - boxes[index].w = pow(predictions[box_index + 2], (l.sqrt?2:1)) * w; - boxes[index].h = pow(predictions[box_index + 3], (l.sqrt?2:1)) * h; + box b; + b.x = (predictions[box_index + 0] + col) / l.side * w; + b.y = (predictions[box_index + 1] + row) / l.side * h; + b.w = pow(predictions[box_index + 2], (l.sqrt?2:1)) * w; + b.h = pow(predictions[box_index + 3], (l.sqrt?2:1)) * h; + dets[index].bbox = b; + dets[index].objectness = scale; for(j = 0; j < l.classes; ++j){ int class_index = i*l.classes; float prob = scale*predictions[class_index+j]; - probs[index][j] = (prob > thresh) ? prob : 0; - } - if(only_objectness){ - probs[index][0] = scale; + dets[index].prob[j] = (prob > thresh) ? prob : 0; } } } diff --git a/src/image.c b/src/image.c index ac1b6296924..bcf49435661 100644 --- a/src/image.c +++ b/src/image.c @@ -235,7 +235,7 @@ image **load_alphabet() return alphabets; } -void draw_detections(image im, int num, float thresh, box *boxes, float **probs, float **masks, char **names, image **alphabet, int classes) +void draw_detections(image im, detection *dets, int num, float thresh, char **names, image **alphabet, int classes) { int i,j; @@ -243,7 +243,7 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, char labelstr[4096] = {0}; int class = -1; for(j = 0; j < classes; ++j){ - if (probs[i][j] > thresh){ + if (dets[i].prob[j] > thresh){ if (class < 0) { strcat(labelstr, names[j]); class = j; @@ -251,7 +251,7 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, strcat(labelstr, ", "); strcat(labelstr, names[j]); } - printf("%s: %.0f%%\n", names[j], probs[i][j]*100); + printf("%s: %.0f%%\n", names[j], dets[i].prob[j]*100); } } if(class >= 0){ @@ -276,7 +276,8 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, rgb[0] = red; rgb[1] = green; rgb[2] = blue; - box b = boxes[i]; + box b = dets[i].bbox; + //printf("%f %f %f %f\n", b.x, b.y, b.w, b.h); int left = (b.x-b.w/2.)*im.w; int right = (b.x+b.w/2.)*im.w; @@ -294,8 +295,8 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs, draw_label(im, top + width, left, label, rgb); free_image(label); } - if (masks){ - image mask = float_to_image(14, 14, 1, masks[i]); + if (dets[i].mask){ + image mask = float_to_image(14, 14, 1, dets[i].mask); image resized_mask = resize_image(mask, b.w*im.w, b.h*im.h); image tmask = threshold_image(resized_mask, .5); embed_image(tmask, im, left, top); diff --git a/src/logistic_layer.c b/src/logistic_layer.c new file mode 100644 index 00000000000..6e2835aa94c --- /dev/null +++ b/src/logistic_layer.c @@ -0,0 +1,72 @@ +#include "logistic_layer.h" +#include "activations.h" +#include "blas.h" +#include "cuda.h" + +#include +#include +#include +#include +#include + +layer make_logistic_layer(int batch, int inputs) +{ + fprintf(stderr, "logistic x entropy %4d\n", inputs); + layer l = {0}; + l.type = LOGXENT; + l.batch = batch; + l.inputs = inputs; + l.outputs = inputs; + l.loss = calloc(inputs*batch, sizeof(float)); + l.output = calloc(inputs*batch, sizeof(float)); + l.delta = calloc(inputs*batch, sizeof(float)); + l.cost = calloc(1, sizeof(float)); + + l.forward = forward_logistic_layer; + l.backward = backward_logistic_layer; + #ifdef GPU + l.forward_gpu = forward_logistic_layer_gpu; + l.backward_gpu = backward_logistic_layer_gpu; + + l.output_gpu = cuda_make_array(l.output, inputs*batch); + l.loss_gpu = cuda_make_array(l.loss, inputs*batch); + l.delta_gpu = cuda_make_array(l.delta, inputs*batch); + #endif + return l; +} + +void forward_logistic_layer(const layer l, network net) +{ + copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1); + activate_array(l.output, l.outputs*l.batch, LOGISTIC); + if(net.truth){ + logistic_x_ent_cpu(l.batch*l.inputs, l.output, net.truth, l.delta, l.loss); + l.cost[0] = sum_array(l.loss, l.batch*l.inputs); + } +} + +void backward_logistic_layer(const layer l, network net) +{ + axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, net.delta, 1); +} + +#ifdef GPU + +void forward_logistic_layer_gpu(const layer l, network net) +{ + copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); + activate_array_gpu(l.output_gpu, l.outputs*l.batch, LOGISTIC); + if(net.truth){ + logistic_x_ent_gpu(l.batch*l.inputs, l.output_gpu, net.truth_gpu, l.delta_gpu, l.loss_gpu); + cuda_pull_array(l.loss_gpu, l.loss, l.batch*l.inputs); + l.cost[0] = sum_array(l.loss, l.batch*l.inputs); + printf("hey: %f\n", l.cost[0]); + } +} + +void backward_logistic_layer_gpu(const layer layer, network net) +{ + axpy_gpu(layer.batch*layer.inputs, 1, layer.delta_gpu, 1, net.delta_gpu, 1); +} + +#endif diff --git a/src/logistic_layer.h b/src/logistic_layer.h new file mode 100644 index 00000000000..9c25bee3c2a --- /dev/null +++ b/src/logistic_layer.h @@ -0,0 +1,15 @@ +#ifndef LOGISTIC_LAYER_H +#define LOGISTIC_LAYER_H +#include "layer.h" +#include "network.h" + +layer make_logistic_layer(int batch, int inputs); +void forward_logistic_layer(const layer l, network net); +void backward_logistic_layer(const layer l, network net); + +#ifdef GPU +void forward_logistic_layer_gpu(const layer l, network net); +void backward_logistic_layer_gpu(const layer l, network net); +#endif + +#endif diff --git a/src/network.c b/src/network.c index 1b4df6bc2ce..b52db448082 100644 --- a/src/network.c +++ b/src/network.c @@ -26,6 +26,7 @@ #include "softmax_layer.h" #include "dropout_layer.h" #include "route_layer.h" +#include "upsample_layer.h" #include "shortcut_layer.h" #include "parser.h" #include "data.h" @@ -377,6 +378,8 @@ int resize_network(network *net, int w, int h) resize_region_layer(&l, w, h); }else if(l.type == ROUTE){ resize_route_layer(&l, net); + }else if(l.type == UPSAMPLE){ + resize_upsample_layer(&l, w, h); }else if(l.type == REORG){ resize_reorg_layer(&l, w, h); }else if(l.type == AVGPOOL){ @@ -412,7 +415,9 @@ int resize_network(network *net, int w, int h) cuda_free(net->truth_gpu); net->input_gpu = cuda_make_array(net->input, net->inputs*net->batch); net->truth_gpu = cuda_make_array(net->truth, net->truths*net->batch); - net->workspace = cuda_make_array(0, (workspace_size-1)/sizeof(float)+1); + if(workspace_size){ + net->workspace = cuda_make_array(0, (workspace_size-1)/sizeof(float)+1); + } }else { free(net->workspace); net->workspace = calloc(1, workspace_size); @@ -497,34 +502,62 @@ float *network_predict(network *net, float *input) int num_boxes(network *net) { - layer l = net->layers[net->n-1]; - return l.w*l.h*l.n; + int i; + int s = 0; + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; + if(l.type == REGION || l.type == DETECTION){ + s += l.w*l.h*l.n; + } + } + return s; } -box *make_boxes(network *net) +detection *make_network_boxes(network *net) +{ + layer l = net->layers[net->n - 1]; + int i; + int nboxes = num_boxes(net); + detection *dets = calloc(nboxes, sizeof(detection)); + for(i = 0; i < nboxes; ++i){ + dets[i].prob = calloc(l.classes, sizeof(float)); + if(l.coords > 4){ + dets[i].mask = calloc(l.coords-4, sizeof(float)); + } + } + return dets; +} +void fill_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, detection *dets) { - layer l = net->layers[net->n-1]; - box *boxes = calloc(l.w*l.h*l.n, sizeof(box)); - return boxes; + int j; + for(j = 0; j < net->n; ++j){ + layer l = net->layers[j]; + if(l.type == REGION){ + get_region_detections(l, w, h, net->w, net->h, thresh, map, hier, relative, dets); + dets += l.w*l.h*l.n; + } + if(l.type == DETECTION){ + get_detection_detections(l, w, h, thresh, dets); + dets += l.w*l.h*l.n; + } + } } -float **make_probs(network *net) +detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative) { - int j; - layer l = net->layers[net->n-1]; - float **probs = calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(l.classes + 1, sizeof(float *)); - return probs; + detection *dets = make_network_boxes(net); + fill_network_boxes(net, w, h, thresh, hier, map, relative, dets); + return dets; } -void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, box *boxes, float **probs) +void free_detections(detection *dets, int n) { - network_predict_image(net, im); - layer l = net->layers[net->n-1]; - if(l.type == REGION){ - get_region_boxes(l, im.w, im.h, net->w, net->h, thresh, probs, boxes, 0, 0, 0, hier_thresh, 0); - if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); + int i; + for(i = 0; i < n; ++i){ + free(dets[i].prob); + if(dets[i].mask) free(dets[i].mask); } + free(dets); } float *network_predict_image(network *net, image im) diff --git a/src/parser.c b/src/parser.c index da7487b0fe1..ce045c4b667 100644 --- a/src/parser.c +++ b/src/parser.c @@ -4,6 +4,7 @@ #include #include "activation_layer.h" +#include "logistic_layer.h" #include "activations.h" #include "avgpool_layer.h" #include "batchnorm_layer.h" @@ -27,6 +28,7 @@ #include "reorg_layer.h" #include "rnn_layer.h" #include "route_layer.h" +#include "upsample_layer.h" #include "shortcut_layer.h" #include "softmax_layer.h" #include "lstm_layer.h" @@ -53,6 +55,7 @@ LAYER_TYPE string_to_layer_type(char * type) if (strcmp(type, "[deconv]")==0 || strcmp(type, "[deconvolutional]")==0) return DECONVOLUTIONAL; if (strcmp(type, "[activation]")==0) return ACTIVE; + if (strcmp(type, "[logistic]")==0) return LOGXENT; if (strcmp(type, "[net]")==0 || strcmp(type, "[network]")==0) return NETWORK; if (strcmp(type, "[crnn]")==0) return CRNN; @@ -73,6 +76,7 @@ LAYER_TYPE string_to_layer_type(char * type) if (strcmp(type, "[soft]")==0 || strcmp(type, "[softmax]")==0) return SOFTMAX; if (strcmp(type, "[route]")==0) return ROUTE; + if (strcmp(type, "[upsample]")==0) return UPSAMPLE; return BLANK; } @@ -275,9 +279,27 @@ layer parse_region(list *options, size_params params) { int coords = option_find_int(options, "coords", 4); int classes = option_find_int(options, "classes", 20); - int num = option_find_int(options, "num", 1); + int total = option_find_int(options, "num", 1); + int num = total; - layer l = make_region_layer(params.batch, params.w, params.h, num, classes, coords); + char *a = option_find_str(options, "mask", 0); + int *mask = 0; + if(a){ + int len = strlen(a); + int n = 1; + int i; + for(i = 0; i < len; ++i){ + if (a[i] == ',') ++n; + } + mask = calloc(n, sizeof(int)); + for(i = 0; i < n; ++i){ + int val = atoi(a); + mask[i] = val; + a = strchr(a, ',')+1; + } + num = n; + } + layer l = make_region_layer(params.batch, params.w, params.h, num, total, mask, classes, coords); assert(l.outputs == params.inputs); l.log = option_find_int_quiet(options, "log", 0); @@ -297,7 +319,7 @@ layer parse_region(list *options, size_params params) l.coord_scale = option_find_float(options, "coord_scale", 1); l.object_scale = option_find_float(options, "object_scale", 1); l.noobject_scale = option_find_float(options, "noobject_scale", 1); - l.mask_scale = option_find_float(options, "mask_scale", 1); + l.mask_scale = option_find_float_quiet(options, "mask_scale", 1); l.class_scale = option_find_float(options, "class_scale", 1); l.bias_match = option_find_int_quiet(options, "bias_match",0); @@ -306,7 +328,7 @@ layer parse_region(list *options, size_params params) char *map_file = option_find_str(options, "map", 0); if (map_file) l.map = read_map(map_file); - char *a = option_find_str(options, "anchors", 0); + a = option_find_str(options, "anchors", 0); if(a){ int len = strlen(a); int n = 1; @@ -474,6 +496,15 @@ layer parse_shortcut(list *options, size_params params, network *net) } +layer parse_logistic(list *options, size_params params) +{ + layer l = make_logistic_layer(params.batch, params.inputs); + l.w = l.out_h = params.h; + l.w = l.out_w = params.w; + l.c = l.out_c = params.c; + return l; +} + layer parse_activation(list *options, size_params params) { char *activation_s = option_find_str(options, "activation", "linear"); @@ -491,6 +522,14 @@ layer parse_activation(list *options, size_params params) return l; } +layer parse_upsample(list *options, size_params params, network *net) +{ + + int stride = option_find_int(options, "stride",2); + layer l = make_upsample_layer(params.batch, params.w, params.h, params.c, stride); + return l; +} + route_layer parse_route(list *options, size_params params, network *net) { char *l = option_find(options, "layers"); @@ -673,6 +712,8 @@ network *parse_network_cfg(char *filename) l = parse_local(options, params); }else if(lt == ACTIVE){ l = parse_activation(options, params); + }else if(lt == LOGXENT){ + l = parse_logistic(options, params); }else if(lt == RNN){ l = parse_rnn(options, params); }else if(lt == GRU){ @@ -706,6 +747,8 @@ network *parse_network_cfg(char *filename) l = parse_avgpool(options, params); }else if(lt == ROUTE){ l = parse_route(options, params, net); + }else if(lt == UPSAMPLE){ + l = parse_upsample(options, params, net); }else if(lt == SHORTCUT){ l = parse_shortcut(options, params, net); }else if(lt == DROPOUT){ diff --git a/src/region_layer.c b/src/region_layer.c index 449957c3c56..8313b6095bc 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -10,12 +10,14 @@ #include #include -layer make_region_layer(int batch, int w, int h, int n, int classes, int coords) +layer make_region_layer(int batch, int w, int h, int n, int total, int *mask, int classes, int coords) { + int i; layer l = {0}; l.type = REGION; l.n = n; + l.total = total; l.batch = batch; l.h = h; l.w = w; @@ -26,15 +28,21 @@ layer make_region_layer(int batch, int w, int h, int n, int classes, int coords) l.classes = classes; l.coords = coords; l.cost = calloc(1, sizeof(float)); - l.biases = calloc(n*2, sizeof(float)); + l.biases = calloc(total*2, sizeof(float)); + if(mask) l.mask = mask; + else{ + l.mask = calloc(n, sizeof(int)); + for(i = 0; i < n; ++i){ + l.mask[i] = i; + } + } l.bias_updates = calloc(n*2, sizeof(float)); l.outputs = h*w*n*(classes + coords + 1); l.inputs = l.outputs; l.truths = 30*(l.coords + 1); l.delta = calloc(batch*l.outputs, sizeof(float)); l.output = calloc(batch*l.outputs, sizeof(float)); - int i; - for(i = 0; i < n*2; ++i){ + for(i = 0; i < total*2; ++i){ l.biases[i] = .5; } @@ -73,30 +81,37 @@ void resize_region_layer(layer *l, int w, int h) #endif } -box get_region_box(float *x, float *biases, int n, int index, int i, int j, int w, int h, int stride) +box get_region_box(float *x, float *biases, int n, int index, int i, int j, int lw, int lh, int w, int h, int stride) { box b; - b.x = (i + x[index + 0*stride]) / w; - b.y = (j + x[index + 1*stride]) / h; + b.x = (i + x[index + 0*stride]) / lw; + b.y = (j + x[index + 1*stride]) / lh; b.w = exp(x[index + 2*stride]) * biases[2*n] / w; b.h = exp(x[index + 3*stride]) * biases[2*n+1] / h; return b; } -float delta_region_box(box truth, float *x, float *biases, int n, int index, int i, int j, int w, int h, float *delta, float scale, int stride) +float delta_region_box(box truth, float *x, float *biases, int n, int index, int i, int j, int lw, int lh, int w, int h, float *delta, float scale, int stride) { - box pred = get_region_box(x, biases, n, index, i, j, w, h, stride); + box pred = get_region_box(x, biases, n, index, i, j, lw, lh, w, h, stride); float iou = box_iou(pred, truth); - float tx = (truth.x*w - i); - float ty = (truth.y*h - j); + float tx = (truth.x*lw - i); + float ty = (truth.y*lh - j); float tw = log(truth.w*w / biases[2*n]); float th = log(truth.h*h / biases[2*n + 1]); + //printf("%f %f %f %f\n", tx, ty, tw, th); + delta[index + 0*stride] = scale * (tx - x[index + 0*stride]); delta[index + 1*stride] = scale * (ty - x[index + 1*stride]); delta[index + 2*stride] = scale * (tw - x[index + 2*stride]); delta[index + 3*stride] = scale * (th - x[index + 3*stride]); + //printf("x: %f %f\n",tx , x[index + 0*stride]); + //printf("y: %f %f\n",ty , x[index + 1*stride]); + //printf("w: %f %f\n",tw , x[index + 2*stride]); + //printf("h: %f %f\n\n",th , x[index + 3*stride]); + //printf("%f %f %f %f\n", x[index + 0*stride], x[index + 1*stride], x[index + 2*stride], x[index + 3*stride]); return iou; } @@ -233,7 +248,7 @@ void forward_region_layer(const layer l, network net) for (i = 0; i < l.w; ++i) { for (n = 0; n < l.n; ++n) { int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); - box pred = get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); + box pred = get_region_box(l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.w*l.h); float best_iou = 0; for(t = 0; t < 30; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); @@ -251,14 +266,16 @@ void forward_region_layer(const layer l, network net) l.delta[obj_index] = 0; } +/* if(*(net.seen) < 12800){ box truth = {0}; truth.x = (i + .5)/l.w; truth.y = (j + .5)/l.h; - truth.w = l.biases[2*n]/l.w; - truth.h = l.biases[2*n+1]/l.h; - delta_region_box(truth, l.output, l.biases, n, box_index, i, j, l.w, l.h, l.delta, .01, l.w*l.h); + truth.w = l.biases[2*l.mask[n]]/net.w; + truth.h = l.biases[2*l.mask[n]+1]/net.h; + delta_region_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.delta, .01, l.w*l.h); } + */ } } } @@ -275,16 +292,11 @@ void forward_region_layer(const layer l, network net) truth_shift.x = 0; truth_shift.y = 0; //printf("index %d %d\n",i, j); - for(n = 0; n < l.n; ++n){ - int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); - box pred = get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); - if(l.bias_match){ - pred.w = l.biases[2*n]/l.w; - pred.h = l.biases[2*n+1]/l.h; - } + for(n = 0; n < l.total; ++n){ + box pred = {0}; + pred.w = l.biases[2*n]/net.w; + pred.h = l.biases[2*n+1]/net.h; //printf("pred: (%f, %f) %f x %f\n", pred.x, pred.y, pred.w, pred.h); - pred.x = 0; - pred.y = 0; float iou = box_iou(pred, truth_shift); if (iou > best_iou){ best_iou = iou; @@ -293,37 +305,41 @@ void forward_region_layer(const layer l, network net) } //printf("%d %f (%f, %f) %f x %f\n", best_n, best_iou, truth.x, truth.y, truth.w, truth.h); - int box_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 0); - float iou = delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, l.delta, l.coord_scale * (2 - truth.w*truth.h), l.w*l.h); - if(l.coords > 4){ - int mask_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 4); - delta_region_mask(net.truth + t*(l.coords + 1) + b*l.truths + 5, l.output, l.coords - 4, mask_index, l.delta, l.w*l.h, l.mask_scale); - } - if(iou > .5) recall += 1; - avg_iou += iou; - - //l.delta[best_index + 4] = iou - l.output[best_index + 4]; - int obj_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, l.coords); - avg_obj += l.output[obj_index]; - l.delta[obj_index] = l.object_scale * (1 - l.output[obj_index]); - if (l.rescore) { - l.delta[obj_index] = l.object_scale * (iou - l.output[obj_index]); - } - if(l.background){ - l.delta[obj_index] = l.object_scale * (0 - l.output[obj_index]); - } + int mask_n = int_index(l.mask, best_n, l.n); + //printf("%d %d\n", best_n, mask_n); + if(mask_n >= 0){ + int box_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 0); + float iou = delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, net.w, net.h, l.delta, l.coord_scale * (2 - truth.w*truth.h), l.w*l.h); + if(l.coords > 4){ + int mask_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4); + delta_region_mask(net.truth + t*(l.coords + 1) + b*l.truths + 5, l.output, l.coords - 4, mask_index, l.delta, l.w*l.h, l.mask_scale); + } + if(iou > .5) recall += 1; + avg_iou += iou; + + //l.delta[best_index + 4] = iou - l.output[best_index + 4]; + int obj_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, l.coords); + avg_obj += l.output[obj_index]; + l.delta[obj_index] = l.object_scale * (1 - l.output[obj_index]); + if (l.rescore) { + l.delta[obj_index] = l.object_scale * (iou - l.output[obj_index]); + } + if(l.background){ + l.delta[obj_index] = l.object_scale * (0 - l.output[obj_index]); + } - int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; - if (l.map) class = l.map[class]; - int class_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, l.coords + 1); - delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax); - ++count; - ++class_count; + int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; + if (l.map) class = l.map[class]; + int class_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, l.coords + 1); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax); + ++count; + ++class_count; + } } } //printf("\n"); *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2); - printf("Region Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\n", avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, count); + printf("Region %d Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\n", net.index, avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, count); } void backward_region_layer(const layer l, network net) @@ -339,7 +355,7 @@ void backward_region_layer(const layer l, network net) */ } -void correct_region_boxes(box *boxes, int n, int w, int h, int netw, int neth, int relative) +void correct_region_boxes(detection *dets, int n, int w, int h, int netw, int neth, int relative) { int i; int new_w=0; @@ -352,7 +368,7 @@ void correct_region_boxes(box *boxes, int n, int w, int h, int netw, int neth, i new_w = (w * neth)/h; } for (i = 0; i < n; ++i){ - box b = boxes[i]; + box b = dets[i].bbox; b.x = (b.x - (netw - new_w)/2./netw) / ((float)new_w/netw); b.y = (b.y - (neth - new_h)/2./neth) / ((float)new_h/neth); b.w *= (float)netw/new_w; @@ -363,11 +379,11 @@ void correct_region_boxes(box *boxes, int n, int w, int h, int netw, int neth, i b.y *= h; b.h *= h; } - boxes[i] = b; + dets[i].bbox = b; } } -void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, float **probs, box *boxes, float **masks, int only_objectness, int *map, float tree_thresh, int relative) +void get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets) { int i,j,n,z; float *predictions = l.output; @@ -399,17 +415,19 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f int col = i % l.w; for(n = 0; n < l.n; ++n){ int index = n*l.w*l.h + i; - for(j = 0; j < l.classes; ++j){ - probs[index][j] = 0; + for (j = 0; j < l.classes; ++j) { + dets[index].prob[j] = 0; } int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); int mask_index = entry_index(l, 0, n*l.w*l.h + i, 4); float scale = l.background ? 1 : predictions[obj_index]; - boxes[index] = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h, l.w*l.h); - if(masks){ + dets[index].bbox = get_region_box(predictions, l.biases, l.mask[n], box_index, col, row, l.w, l.h, netw, neth, l.w*l.h); + dets[index].objectness = scale > thresh ? scale : 0; + dets[index].classes = l.classes; + if(dets[index].mask){ for(j = 0; j < l.coords - 4; ++j){ - masks[index][j] = l.output[mask_index + j*l.w*l.h]; + dets[index].mask[j] = l.output[mask_index + j*l.w*l.h]; } } @@ -421,39 +439,24 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f for(j = 0; j < 200; ++j){ int class_index = entry_index(l, 0, n*l.w*l.h + i, l.coords + 1 + map[j]); float prob = scale*predictions[class_index]; - probs[index][j] = (prob > thresh) ? prob : 0; + dets[index].prob[j] = (prob > thresh) ? prob : 0; } } else { int j = hierarchy_top_prediction(predictions + class_index, l.softmax_tree, tree_thresh, l.w*l.h); - probs[index][j] = (scale > thresh) ? scale : 0; - probs[index][l.classes] = scale; + dets[index].prob[j] = (scale > thresh) ? scale : 0; } } else { - float max = 0; - for(j = 0; j < l.classes; ++j){ - int class_index = entry_index(l, 0, n*l.w*l.h + i, l.coords + 1 + j); - float prob = scale*predictions[class_index]; - probs[index][j] = (prob > thresh) ? prob : 0; - if(prob > max) max = prob; - // TODO REMOVE - // if (j == 56 ) probs[index][j] = 0; - /* - if (j != 0) probs[index][j] = 0; - int blacklist[] = {121, 497, 482, 504, 122, 518,481, 418, 542, 491, 914, 478, 120, 510,500}; - int bb; - for (bb = 0; bb < sizeof(blacklist)/sizeof(int); ++bb){ - if(index == blacklist[bb]) probs[index][j] = 0; - } - */ + if(dets[index].objectness){ + for(j = 0; j < l.classes; ++j){ + int class_index = entry_index(l, 0, n*l.w*l.h + i, l.coords + 1 + j); + float prob = scale*predictions[class_index]; + dets[index].prob[j] = (prob > thresh) ? prob : 0; + } } - probs[index][l.classes] = max; - } - if(only_objectness){ - probs[index][0] = scale; } } } - correct_region_boxes(boxes, l.w*l.h*l.n, w, h, netw, neth, relative); + correct_region_boxes(dets, l.w*l.h*l.n, w, h, netw, neth, relative); } #ifdef GPU @@ -479,17 +482,17 @@ void forward_region_layer_gpu(const layer l, network net) if (l.softmax_tree){ int index = entry_index(l, 0, 0, l.coords + 1); softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); - /* - int mmin = 9000; - int mmax = 0; - int i; - for(i = 0; i < l.softmax_tree->groups; ++i){ - int group_size = l.softmax_tree->group_size[i]; - if (group_size < mmin) mmin = group_size; - if (group_size > mmax) mmax = group_size; - } + /* + int mmin = 9000; + int mmax = 0; + int i; + for(i = 0; i < l.softmax_tree->groups; ++i){ + int group_size = l.softmax_tree->group_size[i]; + if (group_size < mmin) mmin = group_size; + if (group_size > mmax) mmax = group_size; + } //printf("%d %d %d \n", l.softmax_tree->groups, mmin, mmax); - */ + */ /* // TIMING CODE int zz; diff --git a/src/region_layer.h b/src/region_layer.h index f67f9016692..5aafe249a4c 100644 --- a/src/region_layer.h +++ b/src/region_layer.h @@ -5,7 +5,7 @@ #include "layer.h" #include "network.h" -layer make_region_layer(int batch, int h, int w, int n, int classes, int coords); +layer make_region_layer(int batch, int h, int w, int n, int total, int *mask, int classes, int coords); void forward_region_layer(const layer l, network net); void backward_region_layer(const layer l, network net); void resize_region_layer(layer *l, int w, int h); diff --git a/src/softmax_layer.c b/src/softmax_layer.c index 372b037c4e8..afcc6342483 100644 --- a/src/softmax_layer.c +++ b/src/softmax_layer.c @@ -18,8 +18,10 @@ softmax_layer make_softmax_layer(int batch, int inputs, int groups) l.groups = groups; l.inputs = inputs; l.outputs = inputs; + l.loss = calloc(inputs*batch, sizeof(float)); l.output = calloc(inputs*batch, sizeof(float)); l.delta = calloc(inputs*batch, sizeof(float)); + l.cost = calloc(1, sizeof(float)); l.forward = forward_softmax_layer; l.backward = backward_softmax_layer; @@ -28,6 +30,7 @@ softmax_layer make_softmax_layer(int batch, int inputs, int groups) l.backward_gpu = backward_softmax_layer_gpu; l.output_gpu = cuda_make_array(l.output, inputs*batch); + l.loss_gpu = cuda_make_array(l.loss, inputs*batch); l.delta_gpu = cuda_make_array(l.delta, inputs*batch); #endif return l; @@ -46,6 +49,11 @@ void forward_softmax_layer(const softmax_layer l, network net) } else { softmax_cpu(net.input, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output); } + + if(net.truth){ + softmax_x_ent_cpu(l.batch*l.inputs, l.output, net.truth, l.delta, l.loss); + l.cost[0] = sum_array(l.loss, l.batch*l.inputs); + } } void backward_softmax_layer(const softmax_layer l, network net) @@ -63,6 +71,8 @@ void pull_softmax_layer_output(const softmax_layer layer) void forward_softmax_layer_gpu(const softmax_layer l, network net) { if(l.softmax_tree){ + softmax_tree(net.input_gpu, 1, l.batch, l.inputs, l.temperature, l.output_gpu, *l.softmax_tree); + /* int i; int count = 0; for (i = 0; i < l.softmax_tree->groups; ++i) { @@ -70,6 +80,7 @@ void forward_softmax_layer_gpu(const softmax_layer l, network net) softmax_gpu(net.input_gpu + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output_gpu + count); count += group_size; } + */ } else { if(l.spatial){ softmax_gpu(net.input_gpu, l.c, l.batch*l.c, l.inputs/l.c, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu); @@ -77,6 +88,15 @@ void forward_softmax_layer_gpu(const softmax_layer l, network net) softmax_gpu(net.input_gpu, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output_gpu); } } + if(net.truth){ + softmax_x_ent_gpu(l.batch*l.inputs, l.output_gpu, net.truth_gpu, l.delta_gpu, l.loss_gpu); + if(l.softmax_tree){ + mask_gpu(l.batch*l.inputs, l.delta_gpu, SECRET_NUM, net.truth_gpu, 0); + mask_gpu(l.batch*l.inputs, l.loss_gpu, SECRET_NUM, net.truth_gpu, 0); + } + cuda_pull_array(l.loss_gpu, l.loss, l.batch*l.inputs); + l.cost[0] = sum_array(l.loss, l.batch*l.inputs); + } } void backward_softmax_layer_gpu(const softmax_layer layer, network net) diff --git a/src/upsample_layer.c b/src/upsample_layer.c new file mode 100644 index 00000000000..ab6a3b6ec5f --- /dev/null +++ b/src/upsample_layer.c @@ -0,0 +1,99 @@ +#include "upsample_layer.h" +#include "cuda.h" +#include "blas.h" + +#include + +layer make_upsample_layer(int batch, int w, int h, int c, int stride) +{ + layer l = {0}; + l.type = UPSAMPLE; + l.batch = batch; + l.w = w; + l.h = h; + l.c = c; + l.stride = stride; + l.out_w = w*stride; + l.out_h = h*stride; + l.out_c = c; + l.outputs = l.out_w*l.out_h*l.out_c; + l.inputs = l.w*l.h*l.c; + l.delta = calloc(l.outputs*batch, sizeof(float)); + l.output = calloc(l.outputs*batch, sizeof(float));; + + l.forward = forward_upsample_layer; + l.backward = backward_upsample_layer; + #ifdef GPU + l.forward_gpu = forward_upsample_layer_gpu; + l.backward_gpu = backward_upsample_layer_gpu; + + l.delta_gpu = cuda_make_array(l.delta, l.outputs*batch); + l.output_gpu = cuda_make_array(l.output, l.outputs*batch); + #endif + fprintf(stderr, "upsample %2dx %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c); + return l; +} + +void resize_upsample_layer(layer *l, int w, int h) +{ + l->w = w; + l->h = h; + l->out_w = w*l->stride; + l->out_h = h*l->stride; + l->outputs = l->out_w*l->out_h*l->out_c; + l->inputs = l->h*l->w*l->c; + l->delta = realloc(l->delta, l->outputs*l->batch*sizeof(float)); + l->output = realloc(l->output, l->outputs*l->batch*sizeof(float)); + +#ifdef GPU + cuda_free(l->output_gpu); + cuda_free(l->delta_gpu); + l->output_gpu = cuda_make_array(l->output, l->outputs*l->batch); + l->delta_gpu = cuda_make_array(l->delta, l->outputs*l->batch); +#endif + +} + +void forward_upsample_layer(const layer l, network net) +{ + int i, j, k, b; + for(b = 0; b < l.batch; ++b){ + for(k = 0; k < l.c; ++k){ + for(j = 0; j < l.h*l.stride; ++j){ + for(i = 0; i < l.w*l.stride; ++i){ + int in_index = b*l.inputs + k*l.w*l.h + (j/l.stride)*l.w + i/l.stride; + int out_index = b*l.inputs + k*l.w*l.h + j*l.w + i; + l.output[out_index] = net.input[in_index]; + } + } + } + } +} + +void backward_upsample_layer(const layer l, network net) +{ + int i, j, k, b; + for(b = 0; b < l.batch; ++b){ + for(k = 0; k < l.c; ++k){ + for(j = 0; j < l.h*l.stride; ++j){ + for(i = 0; i < l.w*l.stride; ++i){ + int in_index = b*l.inputs + k*l.w*l.h + (j/l.stride)*l.w + i/l.stride; + int out_index = b*l.inputs + k*l.w*l.h + j*l.w + i; + net.delta[in_index] += l.delta[out_index]; + } + } + } + } +} + +#ifdef GPU +void forward_upsample_layer_gpu(const layer l, network net) +{ + upsample_gpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); +} + +void backward_upsample_layer_gpu(const layer l, network net) +{ + upsample_gpu(net.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, l.delta_gpu); +} +#endif diff --git a/src/upsample_layer.h b/src/upsample_layer.h new file mode 100644 index 00000000000..86790d10883 --- /dev/null +++ b/src/upsample_layer.h @@ -0,0 +1,15 @@ +#ifndef UPSAMPLE_LAYER_H +#define UPSAMPLE_LAYER_H +#include "darknet.h" + +layer make_upsample_layer(int batch, int w, int h, int c, int stride); +void forward_upsample_layer(const layer l, network net); +void backward_upsample_layer(const layer l, network net); +void resize_upsample_layer(layer *l, int w, int h); + +#ifdef GPU +void forward_upsample_layer_gpu(const layer l, network net); +void backward_upsample_layer_gpu(const layer l, network net); +#endif + +#endif diff --git a/src/utils.c b/src/utils.c index 9f1af1df59c..4e4efc2c57e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -627,6 +627,15 @@ int max_index(float *a, int n) return max_i; } +int int_index(int *a, int val, int n) +{ + int i; + for(i = 0; i < n; ++i){ + if(a[i] == val) return i; + } + return -1; +} + int rand_int(int min, int max) { if (max < min){ diff --git a/src/utils.h b/src/utils.h index b0db7abf824..01823507f66 100644 --- a/src/utils.h +++ b/src/utils.h @@ -37,7 +37,6 @@ list *parse_csv_line(char *line); char *copy_string(char *s); int count_fields(char *line); float *parse_fields(char *line, int n); -void scale_array(float *a, int n, float s); void translate_array(float *a, int n, float s); float constrain(float min, float max, float a); int constrain_int(int a, int min, int max); @@ -49,6 +48,7 @@ float dist_array(float *a, float *b, int n, int sub); float **one_hot_encode(float *a, int n, int k); float sec(clock_t clocks); void print_statistics(float *a, int n); +int int_index(int *a, int val, int n); #endif From e3931c75cd0f1b95c91abead5144d829f494a39d Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 16 Jan 2018 14:30:00 -0800 Subject: [PATCH 061/118] NO FUCKING SPOILERS DOUG --- Makefile | 2 +- cfg/darknet.cfg | 12 ++-- cfg/darknet19.cfg | 26 ++++++-- examples/classifier.c | 2 + examples/lsd.c | 120 ++++++++++++++++++++++++++++++++--- include/darknet.h | 6 +- src/blas.c | 39 ++++++++++++ src/blas.h | 5 +- src/blas_kernels.cu | 67 ++++++++++++++++--- src/convolutional_kernels.cu | 3 + src/convolutional_layer.c | 2 +- src/cost_layer.c | 5 ++ src/data.c | 20 +++--- src/deconvolutional_layer.c | 24 ++++++- src/l2norm_layer.c | 63 ++++++++++++++++++ src/l2norm_layer.h | 15 +++++ src/logistic_layer.c | 5 +- src/network.c | 2 + src/parser.c | 31 ++++++--- src/region_layer.c | 8 +-- src/shortcut_layer.c | 23 ++++++- src/shortcut_layer.h | 1 + src/upsample_layer.c | 59 +++++++++-------- 23 files changed, 450 insertions(+), 90 deletions(-) create mode 100644 src/l2norm_layer.c create mode 100644 src/l2norm_layer.h diff --git a/Makefile b/Makefile index 0ae99eccaa2..f50f279d28e 100644 --- a/Makefile +++ b/Makefile @@ -57,7 +57,7 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o darknet.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ diff --git a/cfg/darknet.cfg b/cfg/darknet.cfg index 9bdee83b008..ec902830a78 100644 --- a/cfg/darknet.cfg +++ b/cfg/darknet.cfg @@ -1,10 +1,10 @@ [net] # Train -# batch=128 -# subdivisions=1 + batch=128 + subdivisions=1 # Test -batch=1 -subdivisions=1 +#batch=1 +#subdivisions=1 height=256 width=256 channels=3 @@ -88,7 +88,6 @@ activation=leaky [maxpool] size=2 stride=2 -padding=1 [convolutional] batch_normalize=1 @@ -110,6 +109,3 @@ activation=leaky [softmax] groups=1 -[cost] -type=sse - diff --git a/cfg/darknet19.cfg b/cfg/darknet19.cfg index bf73fb7b48a..f56a46e2e7a 100644 --- a/cfg/darknet19.cfg +++ b/cfg/darknet19.cfg @@ -1,17 +1,31 @@ [net] -batch=128 -subdivisions=1 -height=224 -width=224 +# Training +#batch=128 +#subdivisions=2 + +# Testing + batch=1 + subdivisions=1 + +height=256 +width=256 +min_crop=128 +max_crop=448 channels=3 momentum=0.9 decay=0.0005 -max_crop=448 +burn_in=1000 learning_rate=0.1 policy=poly power=4 -max_batches=1600000 +max_batches=800000 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 [convolutional] batch_normalize=1 diff --git a/examples/classifier.c b/examples/classifier.c index 4dda9516dd4..b09947cc625 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -578,6 +578,8 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi } image im = load_image_color(input, 0, 0); image r = letterbox_image(im, net->w, net->h); + //image r = resize_min(im, 320); + //printf("%d %d\n", r.w, r.h); //resize_network(net, r.w, r.h); //printf("%d %d\n", r.w, r.h); diff --git a/examples/lsd.c b/examples/lsd.c index 369f63da8e0..247f639ec8d 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -383,6 +383,92 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear } */ +void slerp(float *start, float *end, float s, int n, float *out) +{ + float omega = acos(dot_cpu(n, start, 1, end, 1)); + float so = sin(omega); + fill_cpu(n, 0, out, 1); + axpy_cpu(n, sin((1-s)*omega)/so, start, 1, out, 1); + axpy_cpu(n, sin(s*omega)/so, end, 1, out, 1); + + float mag = mag_array(out, n); + scale_array(out, n, 1./mag); +} + +image random_unit_vector_image(w, h, c) +{ + image im = make_image(w, h, c); + int i; + for(i = 0; i < im.w*im.h*im.c; ++i){ + im.data[i] = rand_normal(); + } + float mag = mag_array(im.data, im.w*im.h*im.c); + scale_array(im.data, im.w*im.h*im.c, 1./mag); + return im; +} + +void inter_dcgan(char *cfgfile, char *weightfile) +{ + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); + srand(2222222); + + clock_t time; + char buff[256]; + char *input = buff; + int i, imlayer = 0; + + for (i = 0; i < net->n; ++i) { + if (net->layers[i].out_c == 3) { + imlayer = i; + printf("%d\n", i); + break; + } + } + image start = random_unit_vector_image(net->w, net->h, net->c); + image end = random_unit_vector_image(net->w, net->h, net->c); + image im = make_image(net->w, net->h, net->c); + image orig = copy_image(start); + + int c = 0; + int count = 0; + int max_count = 15; + while(1){ + ++c; + + if(count == max_count){ + count = 0; + free_image(start); + start = end; + end = random_unit_vector_image(net->w, net->h, net->c); + if(c > 300){ + end = orig; + } + if(c>300 + max_count) return; + } + ++count; + + slerp(start.data, end.data, (float)count / max_count, im.w*im.h*im.c, im.data); + + float *X = im.data; + time=clock(); + network_predict(net, X); + image out = get_network_image_layer(net, imlayer); + //yuv_to_rgb(out); + normalize_image(out); + printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + //char buff[256]; + sprintf(buff, "out%05d", c); + show_image(out, "out"); + save_image(out, "out"); + save_image(out, buff); +#ifdef OPENCV + //cvWaitKey(0); +#endif + + } +} + void test_dcgan(char *cfgfile, char *weightfile) { network *net = load_network(cfgfile, weightfile, 0); @@ -409,7 +495,7 @@ void test_dcgan(char *cfgfile, char *weightfile) im.data[i] = rand_normal(); } float mag = mag_array(im.data, im.w*im.h*im.c); - //scale_array(im.data, im.w*im.h*im.c, 1./mag); + scale_array(im.data, im.w*im.h*im.c, 1./mag); float *X = im.data; time=clock(); @@ -429,7 +515,7 @@ void test_dcgan(char *cfgfile, char *weightfile) } -void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images) +void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch) { #ifdef GPU char *backup_directory = "/home/pjreddie/backup/"; @@ -441,7 +527,6 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, network *anet = load_network(acfg, aweight, clear); //float orig_rate = anet->learning_rate; - int start = 0; int i, j, k; layer imlayer = {0}; for (i = 0; i < gnet->n; ++i) { @@ -488,8 +573,8 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, //data generated = copy_data(train); - while (get_current_batch(gnet) < gnet->max_batches) { - start += 1; + if (maxbatch == 0) maxbatch = gnet->max_batches; + while (get_current_batch(gnet) < maxbatch) { i += 1; time=clock(); pthread_join(load_thread, 0); @@ -519,6 +604,13 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, float mag = mag_array(gnet->input + z*gnet->inputs, gnet->inputs); scale_array(gnet->input + z*gnet->inputs, gnet->inputs, 1./mag); } + /* + for(z = 0; z < 100; ++z){ + printf("%f, ", gnet->input[z]); + } + printf("\n"); + printf("input: %f %f\n", mean_array(gnet->input, x_size), variance_array(gnet->input, x_size)); + */ //cuda_push_array(gnet->input_gpu, gnet->input, x_size); //cuda_push_array(gnet->truth_gpu, gnet->truth, y_size); @@ -533,18 +625,26 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, backward_network(anet); float genaloss = *anet->cost / anet->batch; - printf("%f\n", genaloss); + //printf("%f\n", genaloss); scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); scal_gpu(imlayer.outputs*imlayer.batch, 0, gnet->layers[gnet->n-1].delta_gpu, 1); - printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); - printf("features %f\n", cuda_mag_array(gnet->layers[gnet->n-1].delta_gpu, imlayer.outputs*imlayer.batch)); + //printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch)); + //printf("features %f\n", cuda_mag_array(gnet->layers[gnet->n-1].delta_gpu, imlayer.outputs*imlayer.batch)); axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet->layers[gnet->n-1].delta_gpu, 1); backward_network(gnet); + /* + for(k = 0; k < gnet->n; ++k){ + layer l = gnet->layers[k]; + cuda_pull_array(l.output_gpu, l.output, l.outputs*l.batch); + printf("%d: %f %f\n", k, mean_array(l.output, l.outputs*l.batch), variance_array(l.output, l.outputs*l.batch)); + } + */ + for(k = 0; k < gnet->batch; ++k){ int index = j*gnet->batch + k; copy_cpu(gnet->outputs, gnet->output + k*gnet->outputs, 1, gen.X.vals[index], 1); @@ -1104,6 +1204,7 @@ void run_lsd(int argc, char **argv) int clear = find_arg(argc, argv, "-clear"); int display = find_arg(argc, argv, "-display"); + int batches = find_int_arg(argc, argv, "-b", 0); char *file = find_char_arg(argc, argv, "-file", "/home/pjreddie/data/imagenet/imagenet1k.train.list"); char *cfg = argv[3]; @@ -1115,9 +1216,10 @@ void run_lsd(int argc, char **argv) //else if(0==strcmp(argv[2], "train2")) train_lsd2(cfg, weights, acfg, aweights, clear); //else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear); //else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear); - if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear, display, file); + if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear, display, file, batches); else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear, display); else if(0==strcmp(argv[2], "gan")) test_dcgan(cfg, weights); + else if(0==strcmp(argv[2], "inter")) inter_dcgan(cfg, weights); else if(0==strcmp(argv[2], "test")) test_lsd(cfg, weights, filename, 0); else if(0==strcmp(argv[2], "color")) test_lsd(cfg, weights, filename, 1); /* diff --git a/include/darknet.h b/include/darknet.h index 0165284d396..d8bec786568 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -87,11 +87,12 @@ typedef enum { REORG, UPSAMPLE, LOGXENT, + L2NORM, BLANK } LAYER_TYPE; typedef enum{ - SSE, MASKED, L1, SEG, SMOOTH + SSE, MASKED, L1, SEG, SMOOTH,WGAN } COST_TYPE; typedef struct{ @@ -162,6 +163,7 @@ struct layer{ float shift; float ratio; float learning_rate_scale; + float clip; int softmax; int classes; int coords; @@ -475,6 +477,7 @@ typedef struct network{ int train; int index; float *cost; + float clip; #ifdef GPU float *input_gpu; @@ -604,6 +607,7 @@ void backward_network(network *net); void update_network(network *net); +float dot_cpu(int N, float *X, int INCX, float *Y, int INCY); void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void copy_cpu(int N, float *X, int INCX, float *Y, int INCY); void scal_cpu(int N, float ALPHA, float *X, int INCX); diff --git a/src/blas.c b/src/blas.c index bd8b55346dc..d1d01cf23ae 100644 --- a/src/blas.c +++ b/src/blas.c @@ -123,6 +123,27 @@ void variance_cpu(float *x, float *mean, int batch, int filters, int spatial, fl } } +void l2normalize_cpu(float *x, float *dx, int batch, int filters, int spatial) +{ + int b,f,i; + for(b = 0; b < batch; ++b){ + for(i = 0; i < spatial; ++i){ + float sum = 0; + for(f = 0; f < filters; ++f){ + int index = b*filters*spatial + f*spatial + i; + sum += powf(x[index], 2); + } + sum = sqrtf(sum); + for(f = 0; f < filters; ++f){ + int index = b*filters*spatial + f*spatial + i; + x[index] /= sum; + dx[index] = (1 - x[index]) / sum; + } + } + } +} + + void normalize_cpu(float *x, float *mean, float *variance, int batch, int filters, int spatial) { int b, f, i; @@ -310,3 +331,21 @@ void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, i } } +void upsample_cpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out) +{ + int i, j, k, b; + for(b = 0; b < batch; ++b){ + for(k = 0; k < c; ++k){ + for(j = 0; j < h*stride; ++j){ + for(i = 0; i < w*stride; ++i){ + int in_index = b*w*h*c + k*w*h + (j/stride)*w + i/stride; + int out_index = b*w*h*c + k*w*h + j*w + i; + if(forward) out[out_index] = in[in_index]; + else in[in_index] += out[out_index]; + } + } + } + } +} + + diff --git a/src/blas.h b/src/blas.h index ec827e4dfa1..99e348bec33 100644 --- a/src/blas.h +++ b/src/blas.h @@ -19,7 +19,6 @@ void constrain_gpu(int N, float ALPHA, float * X, int INCX); void pow_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void mul_cpu(int N, float *X, int INCX, float *Y, int INCY); -float dot_cpu(int N, float *X, int INCX, float *Y, int INCY); int test_gpu_blas(); void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out); @@ -31,6 +30,7 @@ void backward_scale_cpu(float *x_norm, float *delta, int batch, int n, int size, void mean_delta_cpu(float *delta, float *variance, int batch, int filters, int spatial, float *mean_delta); void variance_delta_cpu(float *x, float *delta, float *mean, float *variance, int batch, int filters, int spatial, float *variance_delta); void normalize_delta_cpu(float *x, float *mean, float *variance, float *mean_delta, float *variance_delta, int batch, int filters, int spatial, float *delta); +void l2normalize_cpu(float *x, float *dx, int batch, int filters, int spatial); void smooth_l1_cpu(int n, float *pred, float *truth, float *delta, float *error); void l2_cpu(int n, float *pred, float *truth, float *delta, float *error); @@ -42,6 +42,7 @@ void weighted_delta_cpu(float *a, float *b, float *s, float *da, float *db, floa void softmax(float *input, int n, float temp, int stride, float *output); void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output); +void upsample_cpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out); #ifdef GPU #include "cuda.h" @@ -62,6 +63,7 @@ void mul_gpu(int N, float *X, int INCX, float *Y, int INCY); void mean_gpu(float *x, int batch, int filters, int spatial, float *mean); void variance_gpu(float *x, float *mean, int batch, int filters, int spatial, float *variance); void normalize_gpu(float *x, float *mean, float *variance, int batch, int filters, int spatial); +void l2normalize_gpu(float *x, float *dx, int batch, int filters, int spatial); void normalize_delta_gpu(float *x, float *mean, float *variance, float *mean_delta, float *variance_delta, int batch, int filters, int spatial, float *delta); @@ -82,6 +84,7 @@ void softmax_x_ent_gpu(int n, float *pred, float *truth, float *delta, float *er void smooth_l1_gpu(int n, float *pred, float *truth, float *delta, float *error); void l2_gpu(int n, float *pred, float *truth, float *delta, float *error); void l1_gpu(int n, float *pred, float *truth, float *delta, float *error); +void wgan_gpu(int n, float *pred, float *truth, float *delta, float *error); void weighted_delta_gpu(float *a, float *b, float *s, float *da, float *db, float *ds, int num, float *dc); void weighted_sum_gpu(float *a, float *b, float *s, int num, float *c); void mult_add_into_gpu(int num, float *a, float *b, float *c); diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index b04c2461d42..56b311f1cb2 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -164,8 +164,11 @@ __global__ void adam_kernel(int N, float *x, float *m, float *v, float B1, float { int index = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if (index >= N) return; + + float mhat = m[index] / (1.f - powf(B1, t)); + float vhat = v[index] / (1.f - powf(B2, t)); - x[index] = x[index] + (rate * sqrtf(1.f-powf(B2, t)) / (1.f-powf(B1, t)) * m[index] / (sqrtf(v[index]) + eps)); + x[index] = x[index] + rate * mhat / (sqrtf(vhat) + eps); } extern "C" void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rate, float eps, int t) @@ -466,6 +469,35 @@ extern "C" void normalize_gpu(float *x, float *mean, float *variance, int batch, check_error(cudaPeekAtLastError()); } +__global__ void l2norm_kernel(int N, float *x, float *dx, int batch, int filters, int spatial) +{ + int index = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if (index >= N) return; + int b = index / spatial; + int i = index % spatial; + int f; + float sum = 0; + for(f = 0; f < filters; ++f){ + int index = b*filters*spatial + f*spatial + i; + sum += powf(x[index], 2); + } + sum = sqrtf(sum); + if(sum == 0) sum = 1; + //printf("%f\n", sum); + for(f = 0; f < filters; ++f){ + int index = b*filters*spatial + f*spatial + i; + x[index] /= sum; + dx[index] = (1 - x[index]) / sum; + } +} + +extern "C" void l2normalize_gpu(float *x, float *dx, int batch, int filters, int spatial) +{ + size_t N = batch*spatial; + l2norm_kernel<<>>(N, x, dx, batch, filters, spatial); + check_error(cudaPeekAtLastError()); +} + __global__ void fast_mean_kernel(float *x, int batch, int filters, int spatial, float *mean) { const int threads = BLOCK; @@ -757,7 +789,7 @@ __global__ void logistic_x_ent_kernel(int n, float *pred, float *truth, float *d if(i < n){ float t = truth[i]; float p = pred[i]; - error[i] = -t*log(p) - (1-t)*log(1-p); + error[i] = -t*log(p+.0000001) - (1-t)*log(1-p+.0000001); delta[i] = t-p; } } @@ -800,6 +832,21 @@ extern "C" void l1_gpu(int n, float *pred, float *truth, float *delta, float *er check_error(cudaPeekAtLastError()); } +__global__ void wgan_kernel(int n, float *pred, float *truth, float *delta, float *error) +{ + int i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; + if(i < n){ + error[i] = truth[i] ? -pred[i] : pred[i]; + delta[i] = (truth[i] > 0) ? 1 : -1; + } +} + +extern "C" void wgan_gpu(int n, float *pred, float *truth, float *delta, float *error) +{ + wgan_kernel<<>>(n, pred, truth, delta, error); + check_error(cudaPeekAtLastError()); +} + @@ -926,13 +973,13 @@ extern "C" void softmax_tree(float *input, int spatial, int batch, int stride, f int *tree_groups_size = cuda_make_int_array(hier.group_size, hier.groups); int *tree_groups_offset = cuda_make_int_array(hier.group_offset, hier.groups); /* - static int *tree_groups_size = 0; - static int *tree_groups_offset = 0; - if(!tree_groups_size){ - tree_groups_size = cuda_make_int_array(hier.group_size, hier.groups); - tree_groups_offset = cuda_make_int_array(hier.group_offset, hier.groups); - } - */ + static int *tree_groups_size = 0; + static int *tree_groups_offset = 0; + if(!tree_groups_size){ + tree_groups_size = cuda_make_int_array(hier.group_size, hier.groups); + tree_groups_offset = cuda_make_int_array(hier.group_offset, hier.groups); + } + */ int num = spatial*batch*hier.groups; softmax_tree_kernel<<>>(input, spatial, batch, stride, temp, output, hier.groups, tree_groups_size, tree_groups_offset); check_error(cudaPeekAtLastError()); @@ -976,7 +1023,7 @@ __global__ void upsample_kernel(size_t N, float *x, int w, int h, int c, int bat int in_index = b*w*h*c + in_c*w*h + in_h*w + in_w; - if(forward) out[out_index] = x[in_index]; + if(forward) out[out_index] += x[in_index]; else atomicAdd(x+in_index, out[out_index]); } extern "C" void upsample_gpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out) diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index 56043e78413..8fa2ab2ef5d 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -314,6 +314,9 @@ void update_convolutional_layer_gpu(layer l, update_args a) scal_gpu(l.n, momentum, l.scale_updates_gpu, 1); } } + if(l.clip){ + constrain_gpu(l.nweights, l.clip, l.weights_gpu, 1); + } } diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index aca2da384dd..e4fb9bde047 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -322,7 +322,7 @@ convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int l.workspace_size = get_workspace_size(l); l.activation = activation; - fprintf(stderr, "conv %5d %2d x%2d /%2d %4d x%4d x%4d -> %4d x%4d x%4d\n", n, size, size, stride, w, h, c, l.out_w, l.out_h, l.out_c); + fprintf(stderr, "conv %5d %2d x%2d /%2d %4d x%4d x%4d -> %4d x%4d x%4d %5.3f BFLOPs\n", n, size, size, stride, w, h, c, l.out_w, l.out_h, l.out_c, (2.0 * l.n * l.size*l.size*l.c/l.groups * l.out_h*l.out_w)/1000000000.); return l; } diff --git a/src/cost_layer.c b/src/cost_layer.c index ebf332fe80d..2138ff2617a 100644 --- a/src/cost_layer.c +++ b/src/cost_layer.c @@ -14,6 +14,7 @@ COST_TYPE get_cost_type(char *s) if (strcmp(s, "masked")==0) return MASKED; if (strcmp(s, "smooth")==0) return SMOOTH; if (strcmp(s, "L1")==0) return L1; + if (strcmp(s, "wgan")==0) return WGAN; fprintf(stderr, "Couldn't find cost type %s, going with SSE\n", s); return SSE; } @@ -31,6 +32,8 @@ char *get_cost_string(COST_TYPE a) return "smooth"; case L1: return "L1"; + case WGAN: + return "wgan"; } return "sse"; } @@ -133,6 +136,8 @@ void forward_cost_layer_gpu(cost_layer l, network net) smooth_l1_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); } else if (l.cost_type == L1){ l1_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); + } else if (l.cost_type == WGAN){ + wgan_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); } else { l2_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu); } diff --git a/src/data.c b/src/data.c index 246528e8a27..9c691465154 100644 --- a/src/data.c +++ b/src/data.c @@ -230,7 +230,7 @@ void fill_truth_swag(char *path, float *truth, int classes, int flip, float dx, int id; int i; - for (i = 0; i < count && i < 30; ++i) { + for (i = 0; i < count && i < 90; ++i) { x = boxes[i].x; y = boxes[i].y; w = boxes[i].w; @@ -424,6 +424,7 @@ void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, float x,y,w,h; int id; int i; + int sub = 0; for (i = 0; i < count; ++i) { x = boxes[i].x; @@ -432,13 +433,16 @@ void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, h = boxes[i].h; id = boxes[i].id; - if ((w < .001 || h < .001)) continue; + if ((w < .001 || h < .001)) { + ++sub; + continue; + } - truth[i*5+0] = x; - truth[i*5+1] = y; - truth[i*5+2] = w; - truth[i*5+3] = h; - truth[i*5+4] = id; + truth[(i-sub)*5+0] = x; + truth[(i-sub)*5+1] = y; + truth[(i-sub)*5+2] = w; + truth[(i-sub)*5+3] = h; + truth[(i-sub)*5+4] = id; } free(boxes); } @@ -907,7 +911,7 @@ data load_data_swag(char **paths, int n, int classes, float jitter) d.X.vals = calloc(d.X.rows, sizeof(float*)); d.X.cols = h*w*3; - int k = (4+classes)*30; + int k = (4+classes)*90; d.y = make_matrix(1, k); int dw = w*jitter; diff --git a/src/deconvolutional_layer.c b/src/deconvolutional_layer.c index 63e51ba69b8..00c0e85771d 100644 --- a/src/deconvolutional_layer.c +++ b/src/deconvolutional_layer.c @@ -15,6 +15,22 @@ static size_t get_workspace_size(layer l){ return (size_t)l.h*l.w*l.size*l.size*l.n*sizeof(float); } +void bilinear_init(layer l) +{ + int i,j,f; + float center = (l.size-1) / 2.; + for(f = 0; f < l.n; ++f){ + for(j = 0; j < l.size; ++j){ + for(i = 0; i < l.size; ++i){ + float val = (1 - fabs(i - center)) * (1 - fabs(j - center)); + int c = f%l.c; + int ind = f*l.size*l.size*l.c + c*l.size*l.size + j*l.size + i; + l.weights[ind] = val; + } + } + } +} + layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int adam) { @@ -38,9 +54,11 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size l.biases = calloc(n, sizeof(float)); l.bias_updates = calloc(n, sizeof(float)); + //float scale = n/(size*size*c); + //printf("scale: %f\n", scale); float scale = .02; - printf("scale: %f\n", scale); for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_normal(); + //bilinear_init(l); for(i = 0; i < n; ++i){ l.biases[i] = 0; } @@ -52,6 +70,8 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size l.outputs = l.out_w * l.out_h * l.out_c; l.inputs = l.w * l.h * l.c; + scal_cpu(l.nweights, (float)l.out_w*l.out_h/(l.w*l.h), l.weights, 1); + l.output = calloc(l.batch*l.outputs, sizeof(float)); l.delta = calloc(l.batch*l.outputs, sizeof(float)); @@ -122,7 +142,7 @@ layer make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size l.mean_delta_gpu = cuda_make_array(0, n); l.variance_delta_gpu = cuda_make_array(0, n); - l.scales_gpu = cuda_make_array(0, n); + l.scales_gpu = cuda_make_array(l.scales, n); l.scale_updates_gpu = cuda_make_array(0, n); l.x_gpu = cuda_make_array(0, l.batch*l.out_h*l.out_w*n); diff --git a/src/l2norm_layer.c b/src/l2norm_layer.c new file mode 100644 index 00000000000..d099479b4c0 --- /dev/null +++ b/src/l2norm_layer.c @@ -0,0 +1,63 @@ +#include "l2norm_layer.h" +#include "activations.h" +#include "blas.h" +#include "cuda.h" + +#include +#include +#include +#include +#include + +layer make_l2norm_layer(int batch, int inputs) +{ + fprintf(stderr, "l2norm %4d\n", inputs); + layer l = {0}; + l.type = L2NORM; + l.batch = batch; + l.inputs = inputs; + l.outputs = inputs; + l.output = calloc(inputs*batch, sizeof(float)); + l.scales = calloc(inputs*batch, sizeof(float)); + l.delta = calloc(inputs*batch, sizeof(float)); + + l.forward = forward_l2norm_layer; + l.backward = backward_l2norm_layer; + #ifdef GPU + l.forward_gpu = forward_l2norm_layer_gpu; + l.backward_gpu = backward_l2norm_layer_gpu; + + l.output_gpu = cuda_make_array(l.output, inputs*batch); + l.scales_gpu = cuda_make_array(l.output, inputs*batch); + l.delta_gpu = cuda_make_array(l.delta, inputs*batch); + #endif + return l; +} + +void forward_l2norm_layer(const layer l, network net) +{ + copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1); + l2normalize_cpu(l.output, l.scales, l.batch, l.out_c, l.out_w*l.out_h); +} + +void backward_l2norm_layer(const layer l, network net) +{ + //axpy_cpu(l.inputs*l.batch, 1, l.scales, 1, l.delta, 1); + axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, net.delta, 1); +} + +#ifdef GPU + +void forward_l2norm_layer_gpu(const layer l, network net) +{ + copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); + l2normalize_gpu(l.output_gpu, l.scales_gpu, l.batch, l.out_c, l.out_w*l.out_h); +} + +void backward_l2norm_layer_gpu(const layer l, network net) +{ + axpy_gpu(l.batch*l.inputs, 1, l.scales_gpu, 1, l.delta_gpu, 1); + axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); +} + +#endif diff --git a/src/l2norm_layer.h b/src/l2norm_layer.h new file mode 100644 index 00000000000..1ca6f710f01 --- /dev/null +++ b/src/l2norm_layer.h @@ -0,0 +1,15 @@ +#ifndef L2NORM_LAYER_H +#define L2NORM_LAYER_H +#include "layer.h" +#include "network.h" + +layer make_l2norm_layer(int batch, int inputs); +void forward_l2norm_layer(const layer l, network net); +void backward_l2norm_layer(const layer l, network net); + +#ifdef GPU +void forward_l2norm_layer_gpu(const layer l, network net); +void backward_l2norm_layer_gpu(const layer l, network net); +#endif + +#endif diff --git a/src/logistic_layer.c b/src/logistic_layer.c index 6e2835aa94c..b2b3d6b1ccf 100644 --- a/src/logistic_layer.c +++ b/src/logistic_layer.c @@ -60,13 +60,12 @@ void forward_logistic_layer_gpu(const layer l, network net) logistic_x_ent_gpu(l.batch*l.inputs, l.output_gpu, net.truth_gpu, l.delta_gpu, l.loss_gpu); cuda_pull_array(l.loss_gpu, l.loss, l.batch*l.inputs); l.cost[0] = sum_array(l.loss, l.batch*l.inputs); - printf("hey: %f\n", l.cost[0]); } } -void backward_logistic_layer_gpu(const layer layer, network net) +void backward_logistic_layer_gpu(const layer l, network net) { - axpy_gpu(layer.batch*layer.inputs, 1, layer.delta_gpu, 1, net.delta_gpu, 1); + axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); } #endif diff --git a/src/network.c b/src/network.c index b52db448082..f4966211624 100644 --- a/src/network.c +++ b/src/network.c @@ -378,6 +378,8 @@ int resize_network(network *net, int w, int h) resize_region_layer(&l, w, h); }else if(l.type == ROUTE){ resize_route_layer(&l, net); + }else if(l.type == SHORTCUT){ + resize_shortcut_layer(&l, w, h); }else if(l.type == UPSAMPLE){ resize_upsample_layer(&l, w, h); }else if(l.type == REORG){ diff --git a/src/parser.c b/src/parser.c index ce045c4b667..00767f076ab 100644 --- a/src/parser.c +++ b/src/parser.c @@ -5,6 +5,7 @@ #include "activation_layer.h" #include "logistic_layer.h" +#include "l2norm_layer.h" #include "activations.h" #include "avgpool_layer.h" #include "batchnorm_layer.h" @@ -56,6 +57,7 @@ LAYER_TYPE string_to_layer_type(char * type) || strcmp(type, "[deconvolutional]")==0) return DECONVOLUTIONAL; if (strcmp(type, "[activation]")==0) return ACTIVE; if (strcmp(type, "[logistic]")==0) return LOGXENT; + if (strcmp(type, "[l2norm]")==0) return L2NORM; if (strcmp(type, "[net]")==0 || strcmp(type, "[network]")==0) return NETWORK; if (strcmp(type, "[crnn]")==0) return CRNN; @@ -307,7 +309,7 @@ layer parse_region(list *options, size_params params) l.softmax = option_find_int(options, "softmax", 0); l.background = option_find_int_quiet(options, "background", 0); - l.max_boxes = option_find_int_quiet(options, "max",30); + l.max_boxes = option_find_int_quiet(options, "max",90); l.jitter = option_find_float(options, "jitter", .2); l.rescore = option_find_int_quiet(options, "rescore",0); @@ -356,7 +358,7 @@ detection_layer parse_detection(list *options, size_params params) layer.softmax = option_find_int(options, "softmax", 0); layer.sqrt = option_find_int(options, "sqrt", 0); - layer.max_boxes = option_find_int_quiet(options, "max",30); + layer.max_boxes = option_find_int_quiet(options, "max",90); layer.coord_scale = option_find_float(options, "coord_scale", 1); layer.forced = option_find_int(options, "forced", 0); layer.object_scale = option_find_float(options, "object_scale", 1); @@ -496,10 +498,20 @@ layer parse_shortcut(list *options, size_params params, network *net) } +layer parse_l2norm(list *options, size_params params) +{ + layer l = make_l2norm_layer(params.batch, params.inputs); + l.h = l.out_h = params.h; + l.w = l.out_w = params.w; + l.c = l.out_c = params.c; + return l; +} + + layer parse_logistic(list *options, size_params params) { layer l = make_logistic_layer(params.batch, params.inputs); - l.w = l.out_h = params.h; + l.h = l.out_h = params.h; l.w = l.out_w = params.w; l.c = l.out_c = params.c; return l; @@ -512,12 +524,9 @@ layer parse_activation(list *options, size_params params) layer l = make_activation_layer(params.batch, params.inputs, activation); - l.out_h = params.h; - l.out_w = params.w; - l.out_c = params.c; - l.h = params.h; - l.w = params.w; - l.c = params.c; + l.h = l.out_h = params.h; + l.w = l.out_w = params.w; + l.c = l.out_c = params.c; return l; } @@ -614,6 +623,7 @@ void parse_net_options(list *options, network *net) net->max_ratio = option_find_float_quiet(options, "max_ratio", (float) net->max_crop / net->w); net->min_ratio = option_find_float_quiet(options, "min_ratio", (float) net->min_crop / net->w); net->center = option_find_int_quiet(options, "center",0); + net->clip = option_find_float_quiet(options, "clip", 0); net->angle = option_find_float_quiet(options, "angle", 0); net->aspect = option_find_float_quiet(options, "aspect", 1); @@ -714,6 +724,8 @@ network *parse_network_cfg(char *filename) l = parse_activation(options, params); }else if(lt == LOGXENT){ l = parse_logistic(options, params); + }else if(lt == L2NORM){ + l = parse_l2norm(options, params); }else if(lt == RNN){ l = parse_rnn(options, params); }else if(lt == GRU){ @@ -762,6 +774,7 @@ network *parse_network_cfg(char *filename) }else{ fprintf(stderr, "Type not recognized: %s\n", s->type); } + l.clip = net->clip; l.truth = option_find_int_quiet(options, "truth", 0); l.onlyforward = option_find_int_quiet(options, "onlyforward", 0); l.stopbackward = option_find_int_quiet(options, "stopbackward", 0); diff --git a/src/region_layer.c b/src/region_layer.c index 8313b6095bc..7cf6be8dc9f 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -39,7 +39,7 @@ layer make_region_layer(int batch, int w, int h, int n, int total, int *mask, in l.bias_updates = calloc(n*2, sizeof(float)); l.outputs = h*w*n*(classes + coords + 1); l.inputs = l.outputs; - l.truths = 30*(l.coords + 1); + l.truths = 90*(l.coords + 1); l.delta = calloc(batch*l.outputs, sizeof(float)); l.output = calloc(batch*l.outputs, sizeof(float)); for(i = 0; i < total*2; ++i){ @@ -213,7 +213,7 @@ void forward_region_layer(const layer l, network net) for (b = 0; b < l.batch; ++b) { if(l.softmax_tree){ int onlyclass = 0; - for(t = 0; t < 30; ++t){ + for(t = 0; t < l.max_boxes; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; @@ -250,7 +250,7 @@ void forward_region_layer(const layer l, network net) int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); box pred = get_region_box(l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.w*l.h); float best_iou = 0; - for(t = 0; t < 30; ++t){ + for(t = 0; t < l.max_boxes; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; float iou = box_iou(pred, truth); @@ -279,7 +279,7 @@ void forward_region_layer(const layer l, network net) } } } - for(t = 0; t < 30; ++t){ + for(t = 0; t < l.max_boxes; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; diff --git a/src/shortcut_layer.c b/src/shortcut_layer.c index 0818ca7edc1..e1b9bc52b47 100644 --- a/src/shortcut_layer.c +++ b/src/shortcut_layer.c @@ -8,7 +8,7 @@ layer make_shortcut_layer(int batch, int index, int w, int h, int c, int w2, int h2, int c2) { - fprintf(stderr,"Shortcut Layer: %d\n", index); + fprintf(stderr, "res %3d %4d x%4d x%4d -> %4d x%4d x%4d\n",index, w2,h2,c2, w,h,c); layer l = {0}; l.type = SHORTCUT; l.batch = batch; @@ -38,6 +38,27 @@ layer make_shortcut_layer(int batch, int index, int w, int h, int c, int w2, int return l; } +void resize_shortcut_layer(layer *l, int w, int h) +{ + assert(l->w == l->out_w); + assert(l->h == l->out_h); + l->w = l->out_w = w; + l->h = l->out_h = h; + l->outputs = w*h*l->out_c; + l->inputs = l->outputs; + l->delta = realloc(l->delta, l->outputs*l->batch*sizeof(float)); + l->output = realloc(l->output, l->outputs*l->batch*sizeof(float)); + +#ifdef GPU + cuda_free(l->output_gpu); + cuda_free(l->delta_gpu); + l->output_gpu = cuda_make_array(l->output, l->outputs*l->batch); + l->delta_gpu = cuda_make_array(l->delta, l->outputs*l->batch); +#endif + +} + + void forward_shortcut_layer(const layer l, network net) { copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1); diff --git a/src/shortcut_layer.h b/src/shortcut_layer.h index 32e4ebdcfbf..5f684fc1ead 100644 --- a/src/shortcut_layer.h +++ b/src/shortcut_layer.h @@ -7,6 +7,7 @@ layer make_shortcut_layer(int batch, int index, int w, int h, int c, int w2, int h2, int c2); void forward_shortcut_layer(const layer l, network net); void backward_shortcut_layer(const layer l, network net); +void resize_shortcut_layer(layer *l, int w, int h); #ifdef GPU void forward_shortcut_layer_gpu(const layer l, network net); diff --git a/src/upsample_layer.c b/src/upsample_layer.c index ab6a3b6ec5f..2f5d1d0c4d9 100644 --- a/src/upsample_layer.c +++ b/src/upsample_layer.c @@ -12,10 +12,16 @@ layer make_upsample_layer(int batch, int w, int h, int c, int stride) l.w = w; l.h = h; l.c = c; - l.stride = stride; l.out_w = w*stride; l.out_h = h*stride; l.out_c = c; + if(stride < 0){ + stride = -stride; + l.reverse=1; + l.out_w = w/stride; + l.out_h = h/stride; + } + l.stride = stride; l.outputs = l.out_w*l.out_h*l.out_c; l.inputs = l.w*l.h*l.c; l.delta = calloc(l.outputs*batch, sizeof(float)); @@ -30,7 +36,8 @@ layer make_upsample_layer(int batch, int w, int h, int c, int stride) l.delta_gpu = cuda_make_array(l.delta, l.outputs*batch); l.output_gpu = cuda_make_array(l.output, l.outputs*batch); #endif - fprintf(stderr, "upsample %2dx %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c); + if(l.reverse) fprintf(stderr, "downsample %2dx %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c); + else fprintf(stderr, "upsample %2dx %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c); return l; } @@ -40,6 +47,10 @@ void resize_upsample_layer(layer *l, int w, int h) l->h = h; l->out_w = w*l->stride; l->out_h = h*l->stride; + if(l->reverse){ + l->out_w = w/l->stride; + l->out_h = h/l->stride; + } l->outputs = l->out_w*l->out_h*l->out_c; l->inputs = l->h*l->w*l->c; l->delta = realloc(l->delta, l->outputs*l->batch*sizeof(float)); @@ -56,44 +67,40 @@ void resize_upsample_layer(layer *l, int w, int h) void forward_upsample_layer(const layer l, network net) { - int i, j, k, b; - for(b = 0; b < l.batch; ++b){ - for(k = 0; k < l.c; ++k){ - for(j = 0; j < l.h*l.stride; ++j){ - for(i = 0; i < l.w*l.stride; ++i){ - int in_index = b*l.inputs + k*l.w*l.h + (j/l.stride)*l.w + i/l.stride; - int out_index = b*l.inputs + k*l.w*l.h + j*l.w + i; - l.output[out_index] = net.input[in_index]; - } - } - } + fill_cpu(l.outputs*l.batch, 0, l.output, 1); + if(l.reverse){ + upsample_cpu(l.output, l.out_w, l.out_h, l.c, l.batch, l.stride, 0, net.input); + }else{ + upsample_cpu(net.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output); } } void backward_upsample_layer(const layer l, network net) { - int i, j, k, b; - for(b = 0; b < l.batch; ++b){ - for(k = 0; k < l.c; ++k){ - for(j = 0; j < l.h*l.stride; ++j){ - for(i = 0; i < l.w*l.stride; ++i){ - int in_index = b*l.inputs + k*l.w*l.h + (j/l.stride)*l.w + i/l.stride; - int out_index = b*l.inputs + k*l.w*l.h + j*l.w + i; - net.delta[in_index] += l.delta[out_index]; - } - } - } + if(l.reverse){ + upsample_cpu(l.delta, l.out_w, l.out_h, l.c, l.batch, l.stride, 1, net.delta); + }else{ + upsample_cpu(net.delta, l.w, l.h, l.c, l.batch, l.stride, 0, l.delta); } } #ifdef GPU void forward_upsample_layer_gpu(const layer l, network net) { - upsample_gpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); + fill_gpu(l.outputs*l.batch, 0, l.output_gpu, 1); + if(l.reverse){ + upsample_gpu(l.output_gpu, l.out_w, l.out_h, l.c, l.batch, l.stride, 0, net.input_gpu); + }else{ + upsample_gpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); + } } void backward_upsample_layer_gpu(const layer l, network net) { - upsample_gpu(net.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, l.delta_gpu); + if(l.reverse){ + upsample_gpu(l.delta_gpu, l.out_w, l.out_h, l.c, l.batch, l.stride, 1, net.delta_gpu); + }else{ + upsample_gpu(net.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, l.delta_gpu); + } } #endif From 4c0382d4232a4b1a5e1a177aea26dbbeb17a5107 Mon Sep 17 00:00:00 2001 From: Alexey Kamenev Date: Thu, 18 Jan 2018 13:50:47 -0800 Subject: [PATCH 062/118] Fixed YOLOv1 training. --- src/detection_layer.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/detection_layer.c b/src/detection_layer.c index 5c8a1cea3d3..a2a3c842966 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -260,9 +260,7 @@ void forward_detection_layer_gpu(const detection_layer l, network net) return; } - //float *in_cpu = calloc(l.batch*l.inputs, sizeof(float)); - //float *truth_cpu = 0; - + cuda_pull_array(net.input_gpu, net.input, l.batch*l.inputs); forward_detection_layer(l, net); cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); cuda_push_array(l.delta_gpu, l.delta, l.batch*l.inputs); From b40bbdc7b230060fcef067d3b045b0f9bfc1cd23 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 22 Jan 2018 18:09:36 -0800 Subject: [PATCH 063/118] CARLY RAE JEPSEN IS THE BEST POP ARTIST OF ALL TIME DON'T @ ME --- examples/classifier.c | 39 +++++++--- examples/detector.c | 174 ++++++++++++++++++++++++++++++++++++++++++ examples/regressor.c | 24 ++++-- include/darknet.h | 4 + python/darknet.py | 53 ++++++++----- src/data.c | 37 +++++---- src/data.h | 2 +- src/image.c | 32 +++++++- src/image.h | 2 - src/region_layer.c | 2 +- 10 files changed, 311 insertions(+), 58 deletions(-) diff --git a/examples/classifier.c b/examples/classifier.c index b09947cc625..2f50a3572a0 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -44,11 +44,15 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, list *options = read_data_cfg(datacfg); char *backup_directory = option_find_str(options, "backup", "/backup/"); + int tag = option_find_int_quiet(options, "tag", 0); char *label_list = option_find_str(options, "labels", "data/labels.list"); char *train_list = option_find_str(options, "train", "data/train.list"); int classes = option_find_int(options, "classes", 2); - char **labels = get_labels(label_list); + char **labels; + if(!tag){ + labels = get_labels(label_list); + } list *plist = get_paths(train_list); char **paths = (char **)list_to_array(plist); printf("%d\n", plist->size); @@ -76,7 +80,11 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, args.n = imgs; args.m = N; args.labels = labels; - args.type = CLASSIFICATION_DATA; + if (tag){ + args.type = TAG_DATA; + } else { + args.type = CLASSIFICATION_DATA; + } data train; data buffer; @@ -385,15 +393,13 @@ void validate_classifier_single(char *datacfg, char *filename, char *weightfile) } } image im = load_image_color(paths[i], 0, 0); - image resized = resize_min(im, net->w); - image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h); + image crop = center_crop_image(im, net->w, net->h); //show_image(im, "orig"); //show_image(crop, "cropped"); //cvWaitKey(0); float *pred = network_predict(net, crop.data); if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 1, 1); - if(resized.data != im.data) free_image(resized); free_image(im); free_image(crop); top_k(pred, classes, topk, indexes); @@ -955,6 +961,8 @@ void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_inde void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename) { #ifdef OPENCV + char *base = basecfg(cfgfile); + image **alphabet = load_alphabet(); printf("Classifier Demo\n"); network *net = load_network(cfgfile, weightfile, 0); set_batch_network(net, 1); @@ -988,8 +996,8 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind int *indexes = calloc(top, sizeof(int)); if(!cap) error("Couldn't connect to webcam.\n"); - cvNamedWindow("Classifier", CV_WINDOW_NORMAL); - cvResizeWindow("Classifier", 512, 512); + cvNamedWindow(base, CV_WINDOW_NORMAL); + cvResizeWindow(base, 512, 512); float fps = 0; int i; @@ -998,8 +1006,8 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind gettimeofday(&tval_before, NULL); image in = get_image_from_stream(cap); - image in_s = resize_image(in, net->w, net->h); - show_image(in, "Classifier"); + //image in_s = resize_image(in, net->w, net->h); + image in_s = letterbox_image(in, net->w, net->h); float *predictions = network_predict(net, in_s.data); if(net->hierarchy) hierarchy_predictions(predictions, net->outputs, net->hierarchy, 1, 1); @@ -1009,11 +1017,24 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind printf("\033[1;1H"); printf("\nFPS:%.0f\n",fps); + int lh = in.h*.03; + int toph = 3*lh; + + float rgb[3] = {1,1,1}; for(i = 0; i < top; ++i){ + printf("%d\n", toph); int index = indexes[i]; printf("%.1f%%: %s\n", predictions[index]*100, names[index]); + + char buff[1024]; + sprintf(buff, "%3.1f%%: %s\n", predictions[index]*100, names[index]); + image label = get_label(alphabet, buff, lh); + draw_label(in, toph, lh, label, rgb); + toph += 2*lh; + free_image(label); } + show_image(in, base); free_image(in_s); free_image(in); diff --git a/examples/detector.c b/examples/detector.c index ba0b71d0a40..5bf8ac40738 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -624,6 +624,177 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam } } +void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip) +{ + image **alphabet = load_alphabet(); + char *base = basecfg(cfgfile); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); + list *options = read_data_cfg(datacfg); + + srand(2222222); + CvCapture * cap; + + int w = 1280; + int h = 720; + + if(filename){ + cap = cvCaptureFromFile(filename); + }else{ + cap = cvCaptureFromCAM(cam_index); + } + + if(w){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); + } + if(h){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); + } + + int top = option_find_int(options, "top", 1); + + char *label_list = option_find_str(options, "labels", 0); + char *name_list = option_find_str(options, "names", label_list); + char **names = get_labels(name_list); + + int *indexes = calloc(top, sizeof(int)); + + if(!cap) error("Couldn't connect to webcam.\n"); + cvNamedWindow(base, CV_WINDOW_NORMAL); + cvResizeWindow(base, 512, 512); + float fps = 0; + int i; + int count = 0; + float nms = .45; + + while(1){ + image in = get_image_from_stream(cap); + //image in_s = resize_image(in, net->w, net->h); + image in_s = letterbox_image(in, net->w, net->h); + layer l = net->layers[net->n-1]; + + int nboxes = num_boxes(net); + + float *X = in_s.data; + network_predict(net, X); + detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 0); + //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); + if (nms) do_nms_sort(dets, nboxes, l.classes, nms); + + for(i = 0; i < nboxes; ++i){ + if(dets[i].prob[class] > thresh){ + box b = dets[i].bbox; + int left = b.x-b.w/2.; + int top = b.y-b.h/2.; + censor_image(in, left, top, b.w, b.h); + } + } + show_image(in, base); + cvWaitKey(10); + free_detections(dets, num_boxes(net)); + + + free_image(in_s); + free_image(in); + + + float curr = 0; + fps = .9*fps + .1*curr; + for(i = 0; i < skip; ++i){ + image in = get_image_from_stream(cap); + free_image(in); + } + } +} + +void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip) +{ + image **alphabet = load_alphabet(); + char *base = basecfg(cfgfile); + network *net = load_network(cfgfile, weightfile, 0); + set_batch_network(net, 1); + list *options = read_data_cfg(datacfg); + + srand(2222222); + CvCapture * cap; + + int w = 1280; + int h = 720; + + if(filename){ + cap = cvCaptureFromFile(filename); + }else{ + cap = cvCaptureFromCAM(cam_index); + } + + if(w){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); + } + if(h){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); + } + + int top = option_find_int(options, "top", 1); + + char *label_list = option_find_str(options, "labels", 0); + char *name_list = option_find_str(options, "names", label_list); + char **names = get_labels(name_list); + + int *indexes = calloc(top, sizeof(int)); + + if(!cap) error("Couldn't connect to webcam.\n"); + cvNamedWindow(base, CV_WINDOW_NORMAL); + cvResizeWindow(base, 512, 512); + float fps = 0; + int i; + int count = 0; + float nms = .45; + + while(1){ + image in = get_image_from_stream(cap); + //image in_s = resize_image(in, net->w, net->h); + image in_s = letterbox_image(in, net->w, net->h); + layer l = net->layers[net->n-1]; + + int nboxes = num_boxes(net); + show_image(in, base); + + float *X = in_s.data; + network_predict(net, X); + detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 1); + //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); + if (nms) do_nms_sort(dets, nboxes, l.classes, nms); + + for(i = 0; i < nboxes; ++i){ + if(dets[i].prob[class] > thresh){ + box b = dets[i].bbox; + int size = b.w*in.w > b.h*in.h ? b.w*in.w : b.h*in.h; + int dx = b.x*in.w-size/2.; + int dy = b.y*in.h-size/2.; + image bim = crop_image(in, dx, dy, size, size); + char buff[2048]; + sprintf(buff, "results/extract/%07d", count); + ++count; + save_image(bim, buff); + free_image(bim); + } + } + free_detections(dets, num_boxes(net)); + + + free_image(in_s); + free_image(in); + + + float curr = 0; + fps = .9*fps + .1*curr; + for(i = 0; i < skip; ++i){ + image in = get_image_from_stream(cap); + free_image(in); + } + } +} + void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, detection *dets) { network_predict_image(net, im); @@ -674,12 +845,15 @@ void run_detector(int argc, char **argv) int width = find_int_arg(argc, argv, "-w", 0); int height = find_int_arg(argc, argv, "-h", 0); int fps = find_int_arg(argc, argv, "-fps", 0); + int class = find_int_arg(argc, argv, "-class", 0); char *datacfg = argv[3]; char *cfg = argv[4]; char *weights = (argc > 5) ? argv[5] : 0; char *filename = (argc > 6) ? argv[6]: 0; if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen); + else if(0==strcmp(argv[2], "extract")) extract_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip); + else if(0==strcmp(argv[2], "censor")) censor_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip); else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear); else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile); else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile); diff --git a/examples/regressor.c b/examples/regressor.c index 00c55aae506..60a9f2b942b 100644 --- a/examples/regressor.c +++ b/examples/regressor.c @@ -32,6 +32,7 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, char *backup_directory = option_find_str(options, "backup", "/backup/"); char *train_list = option_find_str(options, "train", "data/train.list"); + int classes = option_find_int(options, "classes", 1); list *plist = get_paths(train_list); char **paths = (char **)list_to_array(plist); @@ -43,9 +44,10 @@ void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, args.w = net->w; args.h = net->h; args.threads = 32; + args.classes = classes; - args.min = net->min_crop; - args.max = net->max_crop; + args.min = net->min_ratio*net->w; + args.max = net->max_ratio*net->w; args.angle = net->angle; args.aspect = net->aspect; args.exposure = net->exposure; @@ -160,6 +162,10 @@ void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_inde }else{ cap = cvCaptureFromCAM(cam_index); } + list *options = read_data_cfg(datacfg); + int classes = option_find_int(options, "classes", 1); + char *name_list = option_find_str(options, "names", 0); + char **names = get_labels(name_list); if(!cap) error("Couldn't connect to webcam.\n"); cvNamedWindow("Regressor", CV_WINDOW_NORMAL); @@ -171,19 +177,23 @@ void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_inde gettimeofday(&tval_before, NULL); image in = get_image_from_stream(cap); - image in_s = letterbox_image(in, net->w, net->h); - show_image(in, "Regressor"); + image crop = center_crop_image(in, net->w, net->h); + grayscale_image_3c(crop); + show_image(crop, "Regressor"); - float *predictions = network_predict(net, in_s.data); + float *predictions = network_predict(net, crop.data); printf("\033[2J"); printf("\033[1;1H"); printf("\nFPS:%.0f\n",fps); - printf("People: %f\n", predictions[0]); + int i; + for(i = 0; i < classes; ++i){ + printf("%s: %f\n", names[i], predictions[i]); + } - free_image(in_s); free_image(in); + free_image(crop); cvWaitKey(10); diff --git a/include/darknet.h b/include/darknet.h index d8bec786568..ea37a62deed 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -637,6 +637,8 @@ float train_networks(network **nets, int n, data d, int interval); void sync_nets(network **nets, int n, int interval); void harmless_update_network_gpu(network *net); #endif +image get_label(image **characters, char *string, int size); +void draw_label(image a, int r, int c, image label, const float *rgb); void save_image_png(image im, const char *name); void get_next_batch(data d, int n, int offset, float *X, float *y); void grayscale_image_3c(image im); @@ -683,8 +685,10 @@ image load_image(char *filename, int w, int h, int c); image load_image_color(char *filename, int w, int h); image make_image(int w, int h, int c); image resize_image(image im, int w, int h); +void censor_image(image im, int dx, int dy, int w, int h); image letterbox_image(image im, int w, int h); image crop_image(image im, int dx, int dy, int w, int h); +image center_crop_image(image im, int w, int h); image resize_min(image im, int min); image resize_max(image im, int max); image threshold_image(image im, float thresh); diff --git a/python/darknet.py b/python/darknet.py index deffa6123cc..675d20249ee 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -23,6 +23,15 @@ class BOX(Structure): ("w", c_float), ("h", c_float)] +class DETECTION(Structure): + _fields_ = [("bbox", BOX), + ("classes", c_int), + ("prob", POINTER(c_float)), + ("mask", POINTER(c_float)), + ("objectness", c_float), + ("sort_class", c_int)] + + class IMAGE(Structure): _fields_ = [("w", c_int), ("h", c_int), @@ -53,9 +62,16 @@ class METADATA(Structure): make_image.argtypes = [c_int, c_int, c_int] make_image.restype = IMAGE -make_boxes = lib.make_boxes -make_boxes.argtypes = [c_void_p] -make_boxes.restype = POINTER(BOX) +get_network_boxes = lib.get_network_boxes +get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int] +get_network_boxes.restype = POINTER(DETECTION) + +make_network_boxes = lib.make_network_boxes +make_network_boxes.argtypes = [c_void_p] +make_network_boxes.restype = POINTER(DETECTION) + +free_detections = lib.free_detections +free_detections.argtypes = [POINTER(DETECTION), c_int] free_ptrs = lib.free_ptrs free_ptrs.argtypes = [POINTER(c_void_p), c_int] @@ -64,12 +80,8 @@ class METADATA(Structure): num_boxes.argtypes = [c_void_p] num_boxes.restype = c_int -make_probs = lib.make_probs -make_probs.argtypes = [c_void_p] -make_probs.restype = POINTER(POINTER(c_float)) - -detect = lib.network_predict -detect.argtypes = [c_void_p, IMAGE, c_float, c_float, c_float, POINTER(BOX), POINTER(POINTER(c_float))] +network_predict = lib.network_predict +network_predict.argtypes = [c_void_p, POINTER(c_float)] reset_rnn = lib.reset_rnn reset_rnn.argtypes = [c_void_p] @@ -78,6 +90,12 @@ class METADATA(Structure): load_net.argtypes = [c_char_p, c_char_p, c_int] load_net.restype = c_void_p +do_nms_obj = lib.do_nms_obj +do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float] + +do_nms_sort = lib.do_nms_sort +do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float] + free_image = lib.free_image free_image.argtypes = [IMAGE] @@ -100,9 +118,6 @@ class METADATA(Structure): predict_image.argtypes = [c_void_p, IMAGE] predict_image.restype = POINTER(c_float) -network_detect = lib.network_detect -network_detect.argtypes = [c_void_p, IMAGE, c_float, c_float, c_float, POINTER(BOX), POINTER(POINTER(c_float))] - def classify(net, meta, im): out = predict_image(net, im) res = [] @@ -113,18 +128,20 @@ def classify(net, meta, im): def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45): im = load_image(image, 0, 0) - boxes = make_boxes(net) - probs = make_probs(net) num = num_boxes(net) - network_detect(net, im, thresh, hier_thresh, nms, boxes, probs) + predict_image(net, im) + dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0) + if (nms): do_nms_obj(dets, num, meta.classes, nms); + res = [] for j in range(num): for i in range(meta.classes): - if probs[j][i] > 0: - res.append((meta.names[i], probs[j][i], (boxes[j].x, boxes[j].y, boxes[j].w, boxes[j].h))) + if dets[j].prob[i] > 0: + b = dets[j].bbox + res.append((meta.names[i], dets[j].prob[i], (b.x, b.y, b.w, b.h))) res = sorted(res, key=lambda x: -x[1]) free_image(im) - free_ptrs(cast(probs, POINTER(c_void_p)), num) + free_detections(dets, num) return res if __name__ == "__main__": diff --git a/src/data.c b/src/data.c index 9c691465154..d2159ceae03 100644 --- a/src/data.c +++ b/src/data.c @@ -548,19 +548,22 @@ void fill_hierarchy(float *truth, int k, tree *hierarchy) } } -matrix load_regression_labels_paths(char **paths, int n) +matrix load_regression_labels_paths(char **paths, int n, int k) { - matrix y = make_matrix(n, 1); - int i; + matrix y = make_matrix(n, k); + int i,j; for(i = 0; i < n; ++i){ char labelpath[4096]; - find_replace(paths[i], "images", "targets", labelpath); - find_replace(labelpath, "JPEGImages", "targets", labelpath); + find_replace(paths[i], "images", "labels", labelpath); + find_replace(labelpath, "JPEGImages", "labels", labelpath); find_replace(labelpath, ".jpg", ".txt", labelpath); + find_replace(labelpath, ".JPG", ".txt", labelpath); find_replace(labelpath, ".png", ".txt", labelpath); FILE *file = fopen(labelpath, "r"); - fscanf(file, "%f", &(y.vals[i][0])); + for(j = 0; j < k; ++j){ + fscanf(file, "%f", &(y.vals[i][j])); + } fclose(file); } return y; @@ -583,18 +586,14 @@ matrix load_tags_paths(char **paths, int n, int k) { matrix y = make_matrix(n, k); int i; - int count = 0; + //int count = 0; for(i = 0; i < n; ++i){ char label[4096]; - find_replace(paths[i], "imgs", "labels", label); - find_replace(label, "_iconl.jpeg", ".txt", label); + find_replace(paths[i], "images", "labels", label); + find_replace(label, ".jpg", ".txt", label); FILE *file = fopen(label, "r"); - if(!file){ - find_replace(label, "labels", "labels2", label); - file = fopen(label, "r"); - if(!file) continue; - } - ++count; + if (!file) continue; + //++count; int tag; while(fscanf(file, "%d", &tag) == 1){ if(tag < k){ @@ -603,7 +602,7 @@ matrix load_tags_paths(char **paths, int n, int k) } fclose(file); } - printf("%d/%d\n", count, n); + //printf("%d/%d\n", count, n); return y; } @@ -1010,7 +1009,7 @@ void *load_thread(void *ptr) if (a.type == OLD_CLASSIFICATION_DATA){ *a.d = load_data_old(a.paths, a.n, a.m, a.labels, a.classes, a.w, a.h); } else if (a.type == REGRESSION_DATA){ - *a.d = load_data_regression(a.paths, a.n, a.m, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure); + *a.d = load_data_regression(a.paths, a.n, a.m, a.classes, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } else if (a.type == CLASSIFICATION_DATA){ *a.d = load_data_augment(a.paths, a.n, a.m, a.labels, a.classes, a.hierarchy, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure, a.center); } else if (a.type == SUPER_DATA){ @@ -1166,13 +1165,13 @@ data load_data_super(char **paths, int n, int m, int w, int h, int scale) return d; } -data load_data_regression(char **paths, int n, int m, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure) +data load_data_regression(char **paths, int n, int m, int k, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure) { if(m) paths = get_random_paths(paths, n, m); data d = {0}; d.shallow = 0; d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure, 0); - d.y = load_regression_labels_paths(paths, n); + d.y = load_regression_labels_paths(paths, n, k); if(m) free(paths); return d; } diff --git a/src/data.h b/src/data.h index 931b99b2780..781906f8743 100644 --- a/src/data.h +++ b/src/data.h @@ -29,7 +29,7 @@ data load_data_tag(char **paths, int n, int m, int k, int min, int max, int size matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center); data load_data_super(char **paths, int n, int m, int w, int h, int scale); data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center); -data load_data_regression(char **paths, int n, int m, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); +data load_data_regression(char **paths, int n, int m, int classes, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure); data load_go(char *filename); diff --git a/src/image.c b/src/image.c index bcf49435661..b78d40209f9 100644 --- a/src/image.c +++ b/src/image.c @@ -131,6 +131,7 @@ image tile_images(image a, image b, int dx) image get_label(image **characters, char *string, int size) { + size = size/10; if(size > 7) size = 7; image label = make_empty_image(0,0,0); while(*string){ @@ -291,7 +292,7 @@ void draw_detections(image im, detection *dets, int num, float thresh, char **na draw_box_width(im, left, top, right, bot, width, red, green, blue); if (alphabet) { - image label = get_label(alphabet, labelstr, (im.h*.03)/10); + image label = get_label(alphabet, labelstr, (im.h*.03)); draw_label(im, top + width, left, label, rgb); free_image(label); } @@ -395,6 +396,35 @@ void ghost_image(image source, image dest, int dx, int dy) } } +void blocky_image(image im, int s) +{ + int i,j,k; + for(k = 0; k < im.c; ++k){ + for(j = 0; j < im.h; ++j){ + for(i = 0; i < im.w; ++i){ + im.data[i + im.w*(j + im.h*k)] = im.data[i/s*s + im.w*(j/s*s + im.h*k)]; + } + } + } +} + +void censor_image(image im, int dx, int dy, int w, int h) +{ + int i,j,k; + int s = 32; + if(dx < 0) dx = 0; + if(dy < 0) dy = 0; + + for(k = 0; k < im.c; ++k){ + for(j = dy; j < dy + h && j < im.h; ++j){ + for(i = dx; i < dx + w && i < im.w; ++i){ + im.data[i + im.w*(j + im.h*k)] = im.data[i/s*s + im.w*(j/s*s + im.h*k)]; + //im.data[i + j*im.w + k*im.w*im.h] = 0; + } + } + } +} + void embed_image(image source, image dest, int dx, int dy) { int x,y,k; diff --git a/src/image.h b/src/image.h index 4ff0eacb773..789cf18da01 100644 --- a/src/image.h +++ b/src/image.h @@ -22,12 +22,10 @@ void show_image_cv(image p, const char *name, IplImage *disp); float get_color(int c, int x, int max); void draw_box(image a, int x1, int y1, int x2, int y2, float r, float g, float b); void draw_bbox(image a, box bbox, int w, float r, float g, float b); -void draw_label(image a, int r, int c, image label, const float *rgb); void write_label(image a, int r, int c, image *characters, char *string, float *rgb); image image_distance(image a, image b); void scale_image(image m, float s); image rotate_crop_image(image im, float rad, float s, int w, int h, float dx, float dy, float aspect); -image center_crop_image(image im, int w, int h); image random_crop_image(image im, int w, int h); image random_augment_image(image im, float angle, float aspect, int low, int high, int w, int h); augment_args random_augment_args(image im, float angle, float aspect, int low, int high, int w, int h); diff --git a/src/region_layer.c b/src/region_layer.c index 7cf6be8dc9f..cfe72d4018a 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -582,7 +582,7 @@ void backward_region_layer_gpu(const layer l, network net) gradient_array_gpu(l.output_gpu + index, (l.coords - 4)*l.w*l.h, LOGISTIC, l.delta_gpu + index); } index = entry_index(l, b, n*l.w*l.h, l.coords); - if(!l.background) gradient_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); + //if(!l.background) gradient_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); } } axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); From 558ec9c64c34d52e9b85f9324fbffb44a2936789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=98=81=EC=83=81=EC=9D=B8=EC=8B=9D=EA=B8=B0=EC=88=A0=20C?= =?UTF-8?q?ell=20=EC=9D=B4=EA=B4=91=EA=B5=AD?= Date: Fri, 9 Feb 2018 14:22:14 +0900 Subject: [PATCH 064/118] coordinate calcuration fiex in place_image(). change data type from int to float, for bilienar interpolation --- src/image.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/image.c b/src/image.c index ac1b6296924..ab1e8da20e1 100644 --- a/src/image.c +++ b/src/image.c @@ -749,8 +749,8 @@ void place_image(image im, int w, int h, int dx, int dy, image canvas) for(c = 0; c < im.c; ++c){ for(y = 0; y < h; ++y){ for(x = 0; x < w; ++x){ - int rx = ((float)x / w) * im.w; - int ry = ((float)y / h) * im.h; + float rx = ((float)x / w) * im.w; + float ry = ((float)y / h) * im.h; float val = bilinear_interpolate(im, rx, ry, c); set_pixel(canvas, x + dx, y + dy, c, val); } From 691debd32f428ace0457e8c91710e2ecdad942ee Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 9 Feb 2018 12:45:11 -0500 Subject: [PATCH 065/118] Updated stb_image. --- src/stb_image.h | 2720 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 1871 insertions(+), 849 deletions(-) diff --git a/src/stb_image.h b/src/stb_image.h index d0fa9c21eaf..f090ed3aa22 100644 --- a/src/stb_image.h +++ b/src/stb_image.h @@ -1,5 +1,5 @@ -/* stb_image - v2.06 - public domain image loader - http://nothings.org/stb_image.h - no warranty implied; use at your own risk +/* stb_image - v2.18 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk Do this: #define STB_IMAGE_IMPLEMENTATION @@ -21,17 +21,20 @@ avoid problematic images and only need the trivial interface JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) - PNG 1/2/4/8-bit-per-channel (16 bpc not supported) + PNG 1/2/4/8/16-bit-per-channel TGA (not sure what subset, if a subset) BMP non-1bpp, non-RLE - PSD (composited view only, no extra channels) + PSD (composited view only, no extra channels, 8/16 bit-per-channel) GIF (*comp always reports as 4-channel) HDR (radiance rgbE format) PIC (Softimage PIC) PNM (PPM and PGM binary only) + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - decode from arbitrary I/O callbacks - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) @@ -39,176 +42,64 @@ Full documentation under "DOCUMENTATION" below. - Revision 2.00 release notes: - - - Progressive JPEG is now supported. - - - PPM and PGM binary formats are now supported, thanks to Ken Miller. - - - x86 platforms now make use of SSE2 SIMD instructions for - JPEG decoding, and ARM platforms can use NEON SIMD if requested. - This work was done by Fabian "ryg" Giesen. SSE2 is used by - default, but NEON must be enabled explicitly; see docs. - - With other JPEG optimizations included in this version, we see - 2x speedup on a JPEG on an x86 machine, and a 1.5x speedup - on a JPEG on an ARM machine, relative to previous versions of this - library. The same results will not obtain for all JPGs and for all - x86/ARM machines. (Note that progressive JPEGs are significantly - slower to decode than regular JPEGs.) This doesn't mean that this - is the fastest JPEG decoder in the land; rather, it brings it - closer to parity with standard libraries. If you want the fastest - decode, look elsewhere. (See "Philosophy" section of docs below.) - - See final bullet items below for more info on SIMD. - - - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing - the memory allocator. Unlike other STBI libraries, these macros don't - support a context parameter, so if you need to pass a context in to - the allocator, you'll have to store it in a global or a thread-local - variable. - - - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and - STBI_NO_LINEAR. - STBI_NO_HDR: suppress implementation of .hdr reader format - STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API - - - You can suppress implementation of any of the decoders to reduce - your code footprint by #defining one or more of the following - symbols before creating the implementation. - - STBI_NO_JPEG - STBI_NO_PNG - STBI_NO_BMP - STBI_NO_PSD - STBI_NO_TGA - STBI_NO_GIF - STBI_NO_HDR - STBI_NO_PIC - STBI_NO_PNM (.ppm and .pgm) - - - You can request *only* certain decoders and suppress all other ones - (this will be more forward-compatible, as addition of new decoders - doesn't require you to disable them explicitly): - - STBI_ONLY_JPEG - STBI_ONLY_PNG - STBI_ONLY_BMP - STBI_ONLY_PSD - STBI_ONLY_TGA - STBI_ONLY_GIF - STBI_ONLY_HDR - STBI_ONLY_PIC - STBI_ONLY_PNM (.ppm and .pgm) - - Note that you can define multiples of these, and you will get all - of them ("only x" and "only y" is interpreted to mean "only x&y"). - - - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still - want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB - - - Compilation of all SIMD code can be suppressed with - #define STBI_NO_SIMD - It should not be necessary to disable SIMD unless you have issues - compiling (e.g. using an x86 compiler which doesn't support SSE - intrinsics or that doesn't support the method used to detect - SSE2 support at run-time), and even those can be reported as - bugs so I can refine the built-in compile-time checking to be - smarter. - - - The old STBI_SIMD system which allowed installing a user-defined - IDCT etc. has been removed. If you need this, don't upgrade. My - assumption is that almost nobody was doing this, and those who - were will find the built-in SIMD more satisfactory anyway. - - - RGB values computed for JPEG images are slightly different from - previous versions of stb_image. (This is due to using less - integer precision in SIMD.) The C code has been adjusted so - that the same RGB values will be computed regardless of whether - SIMD support is available, so your app should always produce - consistent results. But these results are slightly different from - previous versions. (Specifically, about 3% of available YCbCr values - will compute different RGB results from pre-1.49 versions by +-1; - most of the deviating values are one smaller in the G channel.) - - - If you must produce consistent results with previous versions of - stb_image, #define STBI_JPEG_OLD and you will get the same results - you used to; however, you will not get the SIMD speedups for - the YCbCr-to-RGB conversion step (although you should still see - significant JPEG speedup from the other changes). - - Please note that STBI_JPEG_OLD is a temporary feature; it will be - removed in future versions of the library. It is only intended for - near-term back-compatibility use. - - - Latest revision history: - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) additional corruption checking - stbi_set_flip_vertically_on_load - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD - progressive JPEG - PGM/PPM support - STBI_MALLOC,STBI_REALLOC,STBI_FREE - STBI_NO_*, STBI_ONLY_* - GIF bugfix - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted) - optimize PNG - fix bug in interlaced PNG with user-specified channel count +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED See end of file for full revision history. ============================ Contributors ========================= - Image formats Bug fixes & warning fixes - Sean Barrett (jpeg, png, bmp) Marc LeBlanc - Nicolas Schulz (hdr, psd) Christpher Lloyd - Jonathan Dummer (tga) Dave Moore - Jean-Marc Lienher (gif) Won Chun - Tom Seddon (pic) the Horde3D community - Thatcher Ulrich (psd) Janez Zemva - Ken Miller (pgm, ppm) Jonathan Blow - Laurent Gomila - Aruelien Pocheville - Extensions, features Ryamond Barbiero - Jetro Lauha (stbi_info) David Woo - Martin "SpartanJ" Golini (stbi_info) Martin Golini - James "moose2000" Brown (iPhone PNG) Roy Eltham - Ben "Disch" Wenger (io callbacks) Luke Graham - Omar Cornut (1/2/4-bit PNG) Thomas Ruf - Nicolas Guillemot (vertical flip) John Bartholomew - Ken Hamada - Optimizations & bugfixes Cort Stratton - Fabian "ryg" Giesen Blazej Dariusz Roszkowski - Arseny Kapoulkine Thibault Reuille - Paul Du Bois - Guillaume George - If your name should be here but Jerry Jansson - isn't, let Sean know. Hayaki Saito - Johan Duparc - Ronny Chevalier - Michal Cichon - Tero Hanninen - Sergio Gonzalez - Cass Everitt - Engin Manap - Martins Mozeiko - Joseph Thomson - Phil Jordan - -License: - This software is in the public domain. Where that dedication is not - recognized, you are granted a perpetual, irrevocable license to copy - and modify this file however you want. - + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine + John-Mark Allen + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan + Dave Moore Roy Eltham Hayaki Saito Nathan Reed + Won Chun Luke Graham Johan Duparc Nick Verigakis + the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar + Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex + Ryamond Barbiero Paul Du Bois Engin Manap github:grim210 + Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw + Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus + Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo + Christian Floisand Kevin Schmidt github:darealshinji + Blazej Dariusz Roszkowski github:Michaelangel007 */ #ifndef STBI_INCLUDE_STB_IMAGE_H @@ -217,10 +108,8 @@ // DOCUMENTATION // // Limitations: -// - no 16-bit-per-channel PNG // - no 12-bit-per-channel JPEG // - no JPEGs with arithmetic coding -// - no 1-bit BMP // - GIF always returns *comp=4 // // Basic usage (see HDR discussion below for HDR usage): @@ -233,10 +122,10 @@ // stbi_image_free(data) // // Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *comp -- outputs # of image components in image file -// int req_comp -- if non-zero, # of image components requested in result +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result // // The return value from an image loader is an 'unsigned char *' which points // to the pixel data, or NULL on an allocation failure or if the image is @@ -244,11 +133,12 @@ // with each pixel consisting of N interleaved 8-bit components; the first // pixel pointed to is top-left-most in the image. There is no padding between // image scanlines or between pixels, regardless of format. The number of -// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. -// If req_comp is non-zero, *comp has the number of components that _would_ -// have been output otherwise. E.g. if you set req_comp to 4, you will always -// get RGBA output, but you can check *comp to see if it's trivially opaque -// because e.g. there were only 3 channels in the source image. +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. // // An output image with N components has the following components interleaved // in this order in each pixel: @@ -260,10 +150,10 @@ // 4 red, green, blue, alpha // // If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *comp will be unchanged. The function stbi_failure_reason() -// can be queried for an extremely brief, end-user unfriendly explanation -// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid -// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly // more user-friendly ones. // // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. @@ -282,13 +172,13 @@ // and for best performance I may provide less-easy-to-use APIs that give higher // performance, in addition to the easy to use ones. Nevertheless, it's important // to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all. +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. // // Some secondary priorities arise directly from the first two, some of which // make more explicit reasons why performance can't be emphasized. // // - Portable ("ease of use") -// - Small footprint ("easy to maintain") +// - Small source code footprint ("easy to maintain") // - No dependencies ("ease of use") // // =========================================================================== @@ -320,13 +210,6 @@ // (at least this is true for iOS and Android). Therefore, the NEON support is // toggled by a build flag: define STBI_NEON to get NEON loops. // -// The output of the JPEG decoder is slightly different from versions where -// SIMD support was introduced (that is, for versions before 1.49). The -// difference is only +-1 in the 8-bit RGB channels, and only on a small -// fraction of pixels. You can force the pre-1.49 behavior by defining -// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path -// and hence cost some performance. -// // If for some reason you do not want to use any of SIMD code, or if // you have issues compiling it, you can disable it entirely by // defining STBI_NO_SIMD. @@ -382,6 +265,41 @@ // says there's premultiplied data (currently only happens in iPhone images, // and only if iPhone convert-to-rgb processing is on). // +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// #ifndef STBI_NO_STDIO @@ -392,7 +310,7 @@ enum { - STBI_default = 0, // only used for req_comp + STBI_default = 0, // only used for desired_channels STBI_grey = 1, STBI_grey_alpha = 2, @@ -401,6 +319,7 @@ enum }; typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; #ifdef __cplusplus extern "C" { @@ -428,34 +347,60 @@ typedef struct int (*eof) (void *user); // returns nonzero if we are at end of file/data } stbi_io_callbacks; -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); -STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp); -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp); +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + #ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); // for stbi_load_from_file, file pointer is left pointing immediately after image #endif +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// #ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); #endif #endif #ifndef STBI_NO_HDR STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif +#endif // STBI_NO_HDR #ifndef STBI_NO_LINEAR STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_HDR +#endif // STBI_NO_LINEAR // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); @@ -476,11 +421,14 @@ STBIDEF void stbi_image_free (void *retval_from_stbi_load); // get image dimensions & components without fully decoding STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); #ifndef STBI_NO_STDIO -STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); - +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); #endif @@ -561,9 +509,10 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch #include // ptrdiff_t on osx #include #include +#include #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp +#include // ldexp, pow #endif #ifndef STBI_NO_STDIO @@ -619,18 +568,22 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) #endif -#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC) +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) // ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) // ok #else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC." +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." #endif #ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p,sz) realloc(p,sz) -#define STBI_FREE(p) free(p) +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) #endif // x86/x64 detection @@ -640,12 +593,14 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define STBI__X86_TARGET #endif -#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// NOTE: not clear do we actually need this for the 64-bit path? +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) // gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// (but compiling with -msse2 allows the compiler to use SSE2 everywhere; -// this is just broken and gcc are jerks for not fixing it properly -// http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. #define STBI_NO_SIMD #endif @@ -664,7 +619,7 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define STBI_NO_SIMD #endif -#if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET) +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) #define STBI_SSE2 #include @@ -693,7 +648,7 @@ static int stbi__cpuid3(void) #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name -static int stbi__sse2_available() +static int stbi__sse2_available(void) { int info3 = stbi__cpuid3(); return ((info3 >> 26) & 1) != 0; @@ -701,16 +656,12 @@ static int stbi__sse2_available() #else // assume GCC-style if not VC++ #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -static int stbi__sse2_available() +static int stbi__sse2_available(void) { -#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later - // GCC 4.8+ has a nice way to do this - return __builtin_cpu_supports("sse2"); -#else - // portable way to do this, preferably without using GCC inline ASM? - // just bail for now. - return 0; -#endif + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; } #endif #endif @@ -749,7 +700,7 @@ typedef struct stbi_uc buffer_start[128]; stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original; + stbi_uc *img_buffer_original, *img_buffer_original_end; } stbi__context; @@ -761,7 +712,7 @@ static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) s->io.read = NULL; s->read_from_callbacks = 0; s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = (stbi_uc *) buffer+len; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; } // initialize a callback-based context @@ -773,6 +724,7 @@ static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void * s->read_from_callbacks = 1; s->img_buffer_original = s->buffer_start; stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; } #ifndef STBI_NO_STDIO @@ -814,59 +766,76 @@ static void stbi__rewind(stbi__context *s) // but we just rewind to the beginning of the initial buffer, because // we only use it after doing 'test', which only ever looks at at most 92 bytes s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; } +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + #ifndef STBI_NO_JPEG static int stbi__jpeg_test(stbi__context *s); -static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PNG static int stbi__png_test(stbi__context *s); -static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); #endif #ifndef STBI_NO_BMP static int stbi__bmp_test(stbi__context *s); -static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_TGA static int stbi__tga_test(stbi__context *s); -static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PSD static int stbi__psd_test(stbi__context *s); -static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); #endif #ifndef STBI_NO_HDR static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PIC static int stbi__pic_test(stbi__context *s); -static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_GIF static int stbi__gif_test(stbi__context *s); -static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PNM static int stbi__pnm_test(stbi__context *s); -static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); #endif @@ -889,6 +858,81 @@ static void *stbi__malloc(size_t size) return STBI_MALLOC(size); } +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + // stbi__err - error // stbi__errpf - error returning pointer to float // stbi__errpuc - error returning pointer to unsigned char @@ -901,8 +945,8 @@ static void *stbi__malloc(size_t size) #define stbi__err(x,y) stbi__err(x) #endif -#define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL)) -#define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) STBIDEF void stbi_image_free(void *retval_from_stbi_load) { @@ -924,33 +968,38 @@ STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) stbi__vertically_flip_on_load = flag_true_if_should_flip; } -static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) { + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp); + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp); + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp); + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp); + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp); + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); #endif #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp); + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp); + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_HDR if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp); + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); } #endif @@ -958,58 +1007,138 @@ static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *com #ifndef STBI_NO_TGA // test tga last because it's a crappy test! if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp); + return stbi__tga_load(s,x,y,comp,req_comp, ri); #endif return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); } -static unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) { - unsigned char *result = stbi__load_main(s, x, y, comp, req_comp); + int i; + int img_len = w * h * channels; + stbi_uc *reduced; - if (stbi__vertically_flip_on_load && result != NULL) { - int w = *x, h = *y; - int depth = req_comp ? req_comp : *comp; - int row,col,z; - stbi_uc temp; - - // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once - for (row = 0; row < (h>>1); row++) { - for (col = 0; col < w; col++) { - for (z = 0; z < depth; z++) { - temp = result[(row * w + col) * depth + z]; - result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; - result[((h - row - 1) * w + col) * depth + z] = temp; - } - } + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; } } +} - return result; +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 8) { + STBI_ASSERT(ri.bits_per_channel == 16); + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; } +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 16) { + STBI_ASSERT(ri.bits_per_channel == 8); + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) || !defined(STBI_NO_LINEAR) static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) { if (stbi__vertically_flip_on_load && result != NULL) { - int w = *x, h = *y; - int depth = req_comp ? req_comp : *comp; - int row,col,z; - float temp; - - // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once - for (row = 0; row < (h>>1); row++) { - for (col = 0; col < w; col++) { - for (z = 0; z < depth; z++) { - temp = result[(row * w + col) * depth + z]; - result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; - result[((h - row - 1) * w + col) * depth + z] = temp; - } - } - } + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); } } - +#endif #ifndef STBI_NO_STDIO @@ -1041,28 +1170,83 @@ STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req unsigned char *result; stbi__context s; stbi__start_file(&s,f); - result = stbi__load_flip(&s,x,y,comp,req_comp); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); if (result) { // need to 'unget' all the characters in the IO buffer fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); } return result; } + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + #endif //!STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_mem(&s,buffer,len); - return stbi__load_flip(&s,x,y,comp,req_comp); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); } STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_flip(&s,x,y,comp,req_comp); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; } +#endif #ifndef STBI_NO_LINEAR static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) @@ -1070,13 +1254,14 @@ static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int unsigned char *data; #ifndef STBI_NO_HDR if (stbi__hdr_test(s)) { - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp); + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); if (hdr_data) stbi__float_postprocess(hdr_data,x,y,comp,req_comp); return hdr_data; } #endif - data = stbi__load_flip(s, x, y, comp, req_comp); + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); if (data) return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); @@ -1146,13 +1331,18 @@ STBIDEF int stbi_is_hdr (char const *filename) return result; } -STBIDEF int stbi_is_hdr_from_file(FILE *f) +STBIDEF int stbi_is_hdr_from_file(FILE *f) { #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; stbi__context s; stbi__start_file(&s,f); - return stbi__hdr_test(&s); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; #else + STBI_NOTUSED(f); return 0; #endif } @@ -1165,18 +1355,21 @@ STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); return stbi__hdr_test(&s); #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); return 0; #endif } -static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; +#ifndef STBI_NO_LINEAR static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; -#ifndef STBI_NO_LINEAR STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } #endif +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } @@ -1285,17 +1478,23 @@ static stbi__uint32 stbi__get32be(stbi__context *s) return (z << 16) + stbi__get16be(s); } +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else static int stbi__get16le(stbi__context *s) { int z = stbi__get8(s); return z + (stbi__get8(s) << 8); } +#endif +#ifndef STBI_NO_BMP static stbi__uint32 stbi__get32le(stbi__context *s) { stbi__uint32 z = stbi__get16le(s); return z + (stbi__get16le(s) << 16); } +#endif #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings @@ -1324,7 +1523,7 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r if (req_comp == img_n) return data; STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - good = (unsigned char *) stbi__malloc(req_comp * x * y); + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); if (good == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); @@ -1334,26 +1533,75 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r unsigned char *src = data + j * x * img_n ; unsigned char *dest = good + j * x * req_comp; - #define COMBO(a,b) ((a)*8+(b)) - #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) // convert source image with img_n components to one with req_comp components; // avoid switch per pixel, so use switch per scanline and massive macros - switch (COMBO(img_n, req_comp)) { - CASE(1,2) dest[0]=src[0], dest[1]=255; break; - CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; - CASE(2,1) dest[0]=src[0]; break; - CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; - CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; - CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; - CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break; - CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; - CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; - CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; default: STBI_ASSERT(0); } - #undef CASE + #undef STBI__CASE } STBI_FREE(data); @@ -1364,7 +1612,9 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) { int i,k,n; - float *output = (float *) stbi__malloc(x * y * comp * sizeof(float)); + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; @@ -1384,7 +1634,9 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) { int i,k,n; - stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp); + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; @@ -1449,7 +1701,7 @@ typedef struct stbi__context *s; stbi__huffman huff_dc[4]; stbi__huffman huff_ac[4]; - stbi_uc dequant[4][64]; + stbi__uint16 dequant[4][64]; stbi__int16 fast_ac[4][1 << FAST_BITS]; // sizes for components, interleaved MCUs @@ -1485,6 +1737,9 @@ typedef struct int succ_high; int succ_low; int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; int scan_n, order[4]; int restart_interval, todo; @@ -1497,7 +1752,8 @@ typedef struct static int stbi__build_huffman(stbi__huffman *h, int *count) { - int i,j,k=0,code; + int i,j,k=0; + unsigned int code; // build size list for each symbol (from JPEG spec) for (i=0; i < 16; ++i) for (j=0; j < count[i]; ++j) @@ -1513,7 +1769,7 @@ static int stbi__build_huffman(stbi__huffman *h, int *count) if (h->size[k] == j) { while (h->size[k] == j) h->code[k++] = (stbi__uint16) (code++); - if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); } // compute largest code + 1 for this size, preshifted as needed later h->maxcode[j] = code << (16-j); @@ -1554,10 +1810,10 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) // magnitude code followed by receive_extend code int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); int m = 1 << (magbits - 1); - if (k < m) k += (-1 << magbits) + 1; + if (k < m) k += (~0U << magbits) + 1; // if the result is small enough, we can fit it in fast_ac table if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); } } } @@ -1566,9 +1822,10 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) static void stbi__grow_buffer_unsafe(stbi__jpeg *j) { do { - int b = j->nomore ? 0 : stbi__get8(j->s); + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); if (b == 0xff) { int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes if (c != 0) { j->marker = (unsigned char) c; j->nomore = 1; @@ -1581,7 +1838,7 @@ static void stbi__grow_buffer_unsafe(stbi__jpeg *j) } // (1 << n) - 1 -static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; // decode a jpeg huffman value from the bitstream stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) @@ -1634,7 +1891,7 @@ stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) } // bias[n] = (-1<s); if (x != 0xff) return STBI__MARKER_none; while (x == 0xff) - x = stbi__get8(j->s); + x = stbi__get8(j->s); // consume repeated 0xff fill bytes return x; } @@ -2417,7 +2674,7 @@ static void stbi__jpeg_reset(stbi__jpeg *j) j->code_bits = 0; j->code_buffer = 0; j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; j->marker = STBI__MARKER_none; j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; j->eob_run = 0; @@ -2549,7 +2806,7 @@ static int stbi__parse_entropy_coded_data(stbi__jpeg *z) } } -static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant) +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) { int i; for (i=0; i < 64; ++i) @@ -2591,13 +2848,14 @@ static int stbi__process_marker(stbi__jpeg *z, int m) L = stbi__get16be(z->s)-2; while (L > 0) { int q = stbi__get8(z->s); - int p = q >> 4; + int p = q >> 4, sixteen = (p != 0); int t = q & 15,i; - if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG"); + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s); - L -= 65; + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); } return L==0; @@ -2630,12 +2888,50 @@ static int stbi__process_marker(stbi__jpeg *z, int m) } return L==0; } + // check for comment block or APP blocks if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - stbi__skip(z->s, stbi__get16be(z->s)-2); + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); return 1; } - return 0; + + return stbi__err("unknown marker","Corrupt JPEG"); } // after we see SOS @@ -2678,6 +2974,28 @@ static int stbi__process_scan_header(stbi__jpeg *z) return 1; } +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + static int stbi__process_frame_header(stbi__jpeg *z, int scan) { stbi__context *s = z->s; @@ -2687,7 +3005,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires c = stbi__get8(s); - if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); s->img_n = c; for (i=0; i < c; ++i) { z->img_comp[i].data = NULL; @@ -2696,11 +3014,12 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + z->rgb = 0; for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; z->img_comp[i].id = stbi__get8(s); - if (z->img_comp[i].id != i+1) // JFIF requires - if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! - return stbi__err("bad component ID","Corrupt JPEG"); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; q = stbi__get8(s); z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); @@ -2709,7 +3028,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) if (scan != STBI__SCAN_load) return 1; - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); for (i=0; i < s->img_n; ++i) { if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; @@ -2721,6 +3040,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_v_max = v_max; z->img_mcu_w = h_max * 8; z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; @@ -2732,28 +3052,27 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) // the bogus oversized data from using interleaved MCUs and their // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); - - if (z->img_comp[i].raw_data == NULL) { - for(--i; i >= 0; --i) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].data = NULL; - } - return stbi__err("outofmem", "Out of memory"); - } + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); // align blocks for idct using mmx/sse z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - z->img_comp[i].linebuf = NULL; if (z->progressive) { - z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3; - z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3; - z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15); + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } else { - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; } } @@ -2772,6 +3091,8 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) { int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 z->marker = STBI__MARKER_none; // initialize cached marker to empty m = stbi__get_marker(z); if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); @@ -2813,12 +3134,15 @@ static int stbi__decode_jpeg_image(stbi__jpeg *j) if (x == 255) { j->marker = stbi__get8(j->s); break; - } else if (x != 0) { - return stbi__err("junk before marker", "Corrupt JPEG"); } } // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); } else { if (!stbi__process_marker(j, m)) return 0; } @@ -3037,38 +3361,9 @@ static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_ return out; } -#ifdef STBI_JPEG_OLD -// this is the same YCbCr-to-RGB calculation that stb_image has used -// historically before the algorithm changes in 1.49 -#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 16) + 32768; // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr*float2fixed(1.40200f); - g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); - b = y_fixed + cb*float2fixed(1.77200f); - r >>= 16; - g >>= 16; - b >>= 16; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#else // this is a reduced-precision calculation of YCbCr-to-RGB introduced // to make sure the code produces the same results in both SIMD and scalar -#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) { int i; @@ -3077,9 +3372,9 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc int r,g,b; int cr = pcr[i] - 128; int cb = pcb[i] - 128; - r = y_fixed + cr* float2fixed(1.40200f); - g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* float2fixed(1.77200f); + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); r >>= 20; g >>= 20; b >>= 20; @@ -3093,7 +3388,6 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc out += step; } } -#endif #if defined(STBI_SSE2) || defined(STBI_NEON) static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) @@ -3212,9 +3506,9 @@ static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc cons int r,g,b; int cr = pcr[i] - 128; int cb = pcb[i] - 128; - r = y_fixed + cr* float2fixed(1.40200f); - g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* float2fixed(1.77200f); + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); r >>= 20; g >>= 20; b >>= 20; @@ -3240,18 +3534,14 @@ static void stbi__setup_jpeg(stbi__jpeg *j) #ifdef STBI_SSE2 if (stbi__sse2_available()) { j->idct_block_kernel = stbi__idct_simd; - #ifndef STBI_JPEG_OLD j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - #endif j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; } #endif #ifdef STBI_NEON j->idct_block_kernel = stbi__idct_simd; - #ifndef STBI_JPEG_OLD j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - #endif j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; #endif } @@ -3259,23 +3549,7 @@ static void stbi__setup_jpeg(stbi__jpeg *j) // clean up the temporary component buffers static void stbi__cleanup_jpeg(stbi__jpeg *j) { - int i; - for (i=0; i < j->s->img_n; ++i) { - if (j->img_comp[i].raw_data) { - STBI_FREE(j->img_comp[i].raw_data); - j->img_comp[i].raw_data = NULL; - j->img_comp[i].data = NULL; - } - if (j->img_comp[i].raw_coeff) { - STBI_FREE(j->img_comp[i].raw_coeff); - j->img_comp[i].raw_coeff = 0; - j->img_comp[i].coeff = 0; - } - if (j->img_comp[i].linebuf) { - STBI_FREE(j->img_comp[i].linebuf); - j->img_comp[i].linebuf = NULL; - } - } + stbi__free_jpeg_components(j, j->s->img_n, 0); } typedef struct @@ -3288,9 +3562,16 @@ typedef struct int ypos; // which pre-expansion row we're on } stbi__resample; +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) { - int n, decode_n; + int n, decode_n, is_rgb; z->s->img_n = 0; // make stbi__cleanup_jpeg safe // validate req_comp @@ -3300,9 +3581,11 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n; + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - if (z->s->img_n == 3 && n < 3) + if (z->s->img_n == 3 && n < 3 && !is_rgb) decode_n = 1; else decode_n = z->s->img_n; @@ -3339,7 +3622,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp } // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1); + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } // now go ahead and resample @@ -3362,7 +3645,39 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (n >= 3) { stbi_uc *y = coutput[0]; if (z->s->img_n == 3) { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } } else for (i=0; i < z->s->img_x; ++i) { out[0] = out[1] = out[2] = y[i]; @@ -3370,37 +3685,70 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp out += n; } } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } } } stbi__cleanup_jpeg(z); *out_x = z->s->img_x; *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n; // report original components, not output + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output return output; } } -static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { - stbi__jpeg j; - j.s = s; - stbi__setup_jpeg(&j); - return load_jpeg_image(&j, x,y,comp,req_comp); + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; } static int stbi__jpeg_test(stbi__context *s) { int r; - stbi__jpeg j; - j.s = s; - stbi__setup_jpeg(&j); - r = stbi__decode_jpeg_header(&j, STBI__SCAN_type); + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); stbi__rewind(s); + STBI_FREE(j); return r; } @@ -3412,15 +3760,18 @@ static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) } if (x) *x = j->s->img_x; if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; return 1; } static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) { - stbi__jpeg j; - j.s = s; - return stbi__jpeg_info_raw(&j, x, y, comp); + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; } #endif @@ -3466,7 +3817,7 @@ stbi_inline static int stbi__bit_reverse(int v, int bits) return stbi__bitreverse16(v) >> (16-bits); } -static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) { int i,k=0; int code, next_code[16], sizes[17]; @@ -3501,10 +3852,10 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) z->size [c] = (stbi_uc ) s; z->value[c] = (stbi__uint16) i; if (s <= STBI__ZFAST_BITS) { - int k = stbi__bit_reverse(next_code[s],s); - while (k < (1 << STBI__ZFAST_BITS)) { - z->fast[k] = fastv; - k += (1 << s); + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); } } ++next_code[s]; @@ -3543,7 +3894,7 @@ static void stbi__fill_bits(stbi__zbuf *z) { do { STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); - z->code_buffer |= stbi__zget8(z) << z->num_bits; + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; z->num_bits += 8; } while (z->num_bits <= 24); } @@ -3593,14 +3944,15 @@ stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes { char *q; - int cur, limit; + int cur, limit, old_limit; z->zout = zout; if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); cur = (int) (z->zout - z->zout_start); - limit = (int) (z->zout_end - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); while (cur + n > limit) limit *= 2; - q = (char *) STBI_REALLOC(z->zout_start, limit); + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); if (q == NULL) return stbi__err("outofmem", "Out of memory"); z->zout_start = q; z->zout = q + cur; @@ -3608,18 +3960,18 @@ static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room return 1; } -static int stbi__zlength_base[31] = { +static const int stbi__zlength_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; -static int stbi__zlength_extra[31]= +static const int stbi__zlength_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; -static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; -static int stbi__zdist_extra[32] = +static const int stbi__zdist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; static int stbi__parse_huffman_block(stbi__zbuf *a) @@ -3666,7 +4018,7 @@ static int stbi__parse_huffman_block(stbi__zbuf *a) static int stbi__compute_huffman_codes(stbi__zbuf *a) { - static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; stbi__zhuffman z_codelength; stbi_uc lencodes[286+32+137];//padding for maximum single op stbi_uc codelength_sizes[19]; @@ -3675,6 +4027,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) int hlit = stbi__zreceive(a,5) + 257; int hdist = stbi__zreceive(a,5) + 1; int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; memset(codelength_sizes, 0, sizeof(codelength_sizes)); for (i=0; i < hclen; ++i) { @@ -3684,33 +4037,35 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; n = 0; - while (n < hlit + hdist) { + while (n < ntot) { int c = stbi__zhuffman_decode(a, &z_codelength); if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); if (c < 16) lencodes[n++] = (stbi_uc) c; - else if (c == 16) { - c = stbi__zreceive(a,2)+3; - memset(lencodes+n, lencodes[n-1], c); - n += c; - } else if (c == 17) { - c = stbi__zreceive(a,3)+3; - memset(lencodes+n, 0, c); - n += c; - } else { - STBI_ASSERT(c == 18); - c = stbi__zreceive(a,7)+11; - memset(lencodes+n, 0, c); + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = stbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); n += c; } } - if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG"); + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; return 1; } -static int stbi__parse_uncomperssed_block(stbi__zbuf *a) +static int stbi__parse_uncompressed_block(stbi__zbuf *a) { stbi_uc header[4]; int len,nlen,k; @@ -3752,9 +4107,24 @@ static int stbi__parse_zlib_header(stbi__zbuf *a) return 1; } -// @TODO: should statically initialize these for optimal thread safety -static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32]; -static void stbi__init_zdefaults(void) +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: { int i; // use <= to match clearly with spec for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; @@ -3764,6 +4134,7 @@ static void stbi__init_zdefaults(void) for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; } +*/ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) { @@ -3776,13 +4147,12 @@ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) final = stbi__zreceive(a,1); type = stbi__zreceive(a,2); if (type == 0) { - if (!stbi__parse_uncomperssed_block(a)) return 0; + if (!stbi__parse_uncompressed_block(a)) return 0; } else if (type == 3) { return 0; } else { if (type == 1) { // use fixed code lengths - if (!stbi__zdefault_distance[31]) stbi__init_zdefaults(); if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; } else { @@ -3907,7 +4277,7 @@ static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) static int stbi__check_png_header(stbi__context *s) { - static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; int i; for (i=0; i < 8; ++i) if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); @@ -3918,6 +4288,7 @@ typedef struct { stbi__context *s; stbi_uc *idata, *expanded, *out; + int depth; } stbi__png; @@ -3952,35 +4323,40 @@ static int stbi__paeth(int a, int b, int c) return c; } -static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; // create the png data from post-deflated data static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) { + int bytes = (depth == 16? 2 : 1); stbi__context *s = a->s; - stbi__uint32 i,j,stride = x*out_n; + stbi__uint32 i,j,stride = x*out_n*bytes; stbi__uint32 img_len, img_width_bytes; int k; int img_n = s->img_n; // copy it into a local for later + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into if (!a->out) return stbi__err("outofmem", "Out of memory"); + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); img_width_bytes = (((img_n * x * depth) + 7) >> 3); img_len = (img_width_bytes + 1) * y; - if (s->img_x == x && s->img_y == y) { - if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG"); - } else { // interlaced: - if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); - } + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); for (j=0; j < y; ++j) { stbi_uc *cur = a->out + stride*j; - stbi_uc *prior = cur - stride; + stbi_uc *prior; int filter = *raw++; - int filter_bytes = img_n; - int width = x; + if (filter > 4) return stbi__err("invalid filter","Corrupt PNG"); @@ -3990,6 +4366,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r filter_bytes = 1; width = img_width_bytes; } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above // if first row, use special filter that doesn't sample previous row if (j == 0) filter = first_row_filter[filter]; @@ -4013,6 +4390,14 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r raw += img_n; cur += out_n; prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; } else { raw += 1; cur += 1; @@ -4021,38 +4406,47 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r // this is a little gross, so that we don't switch per-pixel or per-component if (depth < 8 || img_n == out_n) { - int nk = (width - 1)*img_n; - #define CASE(f) \ + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ case f: \ for (k=0; k < nk; ++k) switch (filter) { // "none" filter turns into a memcpy here; make that explicit. case STBI__F_none: memcpy(cur, raw, nk); break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break; - CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break; - CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break; - CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break; - CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; } - #undef CASE + #undef STBI__CASE raw += nk; } else { STBI_ASSERT(img_n+1 == out_n); - #define CASE(f) \ + #define STBI__CASE(f) \ case f: \ - for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ - for (k=0; k < img_n; ++k) + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) switch (filter) { - CASE(STBI__F_none) cur[k] = raw[k]; break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break; - CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break; - CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; - CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break; - CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break; + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } } - #undef CASE } } @@ -4109,25 +4503,36 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); } if (img_n != out_n) { + int q; // insert alpha = 255 - stbi_uc *cur = a->out + stride*j; - int i; + cur = a->out + stride*j; if (img_n == 1) { - for (i=x-1; i >= 0; --i) { - cur[i*2+1] = 255; - cur[i*2+0] = cur[i]; + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; } } else { STBI_ASSERT(img_n == 3); - for (i=x-1; i >= 0; --i) { - cur[i*4+3] = 255; - cur[i*4+2] = cur[i*3+2]; - cur[i*4+1] = cur[i*3+1]; - cur[i*4+0] = cur[i*3+0]; + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; } } } } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } } return 1; @@ -4135,13 +4540,15 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) { + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; stbi_uc *final; int p; if (!interlaced) return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); // de-interlacing - final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n); + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); for (p=0; p < 7; ++p) { int xorig[] = { 0,4,0,2,0,1,0 }; int yorig[] = { 0,0,4,0,2,0,1 }; @@ -4161,8 +4568,8 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint3 for (i=0; i < x; ++i) { int out_y = j*yspc[p]+yorig[p]; int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n, - a->out + (j*x+i)*out_n, out_n); + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); } } STBI_FREE(a->out); @@ -4200,12 +4607,37 @@ static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) return 1; } +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) { stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; stbi_uc *p, *temp_out, *orig = a->out; - p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n); + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); if (p == NULL) return stbi__err("outofmem", "Out of memory"); // between here and free(out) below, exitting would leak @@ -4271,9 +4703,10 @@ static void stbi__de_iphone(stbi__png *z) stbi_uc a = p[3]; stbi_uc t = p[0]; if (a) { - p[0] = p[2] * 255 / a; - p[1] = p[1] * 255 / a; - p[2] = t * 255 / a; + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; } else { p[0] = p[2]; p[2] = t; @@ -4292,14 +4725,15 @@ static void stbi__de_iphone(stbi__png *z) } } -#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) { stbi_uc palette[1024], pal_img_n=0; stbi_uc has_trans=0, tc[3]; + stbi__uint16 tc16[3]; stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, depth=0, is_iphone=0; + int first=1,k,interlace=0, color=0, is_iphone=0; stbi__context *s = z->s; z->expanded = NULL; @@ -4324,8 +4758,9 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - depth = stbi__get8(s); if (depth != 1 && depth != 2 && depth != 4 && depth != 8) return stbi__err("1/2/4/8-bit only","PNG not supported: 1/2/4/8-bit only"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); @@ -4373,8 +4808,11 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); has_trans = 1; - for (k=0; k < s->img_n; ++k) - tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } } break; } @@ -4385,11 +4823,13 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } if ((int)(ioff + c.length) < (int)ioff) return 0; if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; stbi_uc *p; if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; while (ioff + c.length > idata_limit) idata_limit *= 2; - p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); z->idata = p; } if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); @@ -4403,7 +4843,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (scan != STBI__SCAN_load) return 1; if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); if (z->expanded == NULL) return 0; // zlib should set error @@ -4412,9 +4852,14 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) s->img_out_n = s->img_n+1; else s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0; - if (has_trans) - if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) stbi__de_iphone(z); if (pal_img_n) { @@ -4424,6 +4869,9 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (req_comp >= 3) s->img_out_n = req_comp; if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; } STBI_FREE(z->expanded); z->expanded = NULL; return 1; @@ -4451,21 +4899,28 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) } } -static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp) +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) { - unsigned char *result=NULL; + void *result=NULL; if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; result = p->out; p->out = NULL; if (req_comp && req_comp != p->s->img_out_n) { - result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); p->s->img_out_n = req_comp; if (result == NULL) return result; } *x = p->s->img_x; *y = p->s->img_y; - if (n) *n = p->s->img_out_n; + if (n) *n = p->s->img_n; } STBI_FREE(p->out); p->out = NULL; STBI_FREE(p->expanded); p->expanded = NULL; @@ -4474,11 +4929,11 @@ static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req return result; } -static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi__png p; p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp); + return stbi__do_png(&p, x,y,comp,req_comp, ri); } static int stbi__png_test(stbi__context *s) @@ -4507,6 +4962,19 @@ static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) p.s = s; return stbi__png_info_raw(&p, x, y, comp); } + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} #endif // Microsoft/Windows BMP image @@ -4558,36 +5026,46 @@ static int stbi__bitcount(unsigned int a) return a & 0xff; } +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. static int stbi__shiftsigned(int v, int shift, int bits) { - int result; - int z=0; - - if (shift < 0) v <<= -shift; - else v >>= shift; - result = v; - - z = bits; - while (z < 8) { - result += v >> z; - z += bits; - } - return result; + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v >= 0 && v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; } -static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +typedef struct { - stbi_uc *out; - unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; - stbi_uc pal[256][4]; - int psize=0,i,j,compress=0,width; - int bpp, flip_vertically, pad, target, offset, hsz; + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; +} stbi__bmp_data; + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); stbi__get32le(s); // discard filesize stbi__get16le(s); // discard reserved stbi__get16le(s); // discard reserved - offset = stbi__get32le(s); - hsz = stbi__get32le(s); + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); if (hsz == 12) { s->img_x = stbi__get16le(s); @@ -4597,15 +5075,9 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int s->img_y = stbi__get32le(s); } if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); - bpp = stbi__get16le(s); - if (bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit"); - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - if (hsz == 12) { - if (bpp < 24) - psize = (offset - 14 - 24) / 3; - } else { - compress = stbi__get32le(s); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); stbi__get32le(s); // discard sizeof stbi__get32le(s); // discard hres @@ -4619,27 +5091,25 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int stbi__get32le(s); stbi__get32le(s); } - if (bpp == 16 || bpp == 32) { - mr = mg = mb = 0; + if (info->bpp == 16 || info->bpp == 32) { if (compress == 0) { - if (bpp == 32) { - mr = 0xffu << 16; - mg = 0xffu << 8; - mb = 0xffu << 0; - ma = 0xffu << 24; - fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 - STBI_NOTUSED(fake_a); + if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 } else { - mr = 31u << 10; - mg = 31u << 5; - mb = 31u << 0; + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; } } else if (compress == 3) { - mr = stbi__get32le(s); - mg = stbi__get32le(s); - mb = stbi__get32le(s); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); // not documented, but generated by photoshop and handled by mspaint - if (mr == mg && mg == mb) { + if (info->mr == info->mg && info->mg == info->mb) { // ?!?!? return stbi__errpuc("bad BMP", "bad BMP"); } @@ -4647,11 +5117,13 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int return stbi__errpuc("bad BMP", "bad BMP"); } } else { - STBI_ASSERT(hsz == 108 || hsz == 124); - mr = stbi__get32le(s); - mg = stbi__get32le(s); - mb = stbi__get32le(s); - ma = stbi__get32le(s); + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); stbi__get32le(s); // discard color space for (i=0; i < 12; ++i) stbi__get32le(s); // discard color space parameters @@ -4662,63 +5134,119 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int stbi__get32le(s); // discard reserved } } - if (bpp < 16) - psize = (offset - 14 - hsz) >> 2; } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - 14 - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - 14 - info.hsz) >> 2; + } + s->img_n = ma ? 4 : 3; if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 target = req_comp; else target = s->img_n; // if they want monochrome, we'll post-convert - out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y); + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (bpp < 16) { + if (info.bpp < 16) { int z=0; if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } for (i=0; i < psize; ++i) { pal[i][2] = stbi__get8(s); pal[i][1] = stbi__get8(s); pal[i][0] = stbi__get8(s); - if (hsz != 12) stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); pal[i][3] = 255; } - stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); - if (bpp == 4) width = (s->img_x + 1) >> 1; - else if (bpp == 8) width = s->img_x; + stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } pad = (-width)&3; - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=stbi__get8(s),v2=0; - if (bpp == 4) { - v2 = v & 15; - v >>= 4; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); } - stbi__skip(s, pad); } } else { int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; int z = 0; int easy=0; - stbi__skip(s, offset - 14 - hsz); - if (bpp == 24) width = 3 * s->img_x; - else if (bpp == 16) width = 2*s->img_x; + stbi__skip(s, info.offset - 14 - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; else /* bpp = 32 and pad = 0 */ width=0; pad = (-width) & 3; - if (bpp == 24) { + if (info.bpp == 24) { easy = 1; - } else if (bpp == 32) { + } else if (info.bpp == 32) { if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) easy = 2; } @@ -4739,22 +5267,31 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int out[z+0] = stbi__get8(s); z += 3; a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; if (target == 4) out[z++] = a; } } else { + int bpp = info.bpp; for (i=0; i < (int) s->img_x; ++i) { stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); - int a; + unsigned int a; out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; if (target == 4) out[z++] = STBI__BYTECAST(a); } } stbi__skip(s, pad); } } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + if (flip_vertically) { stbi_uc t; for (j=0; j < (int) s->img_y>>1; ++j) { @@ -4781,20 +5318,55 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int // Targa Truevision - TGA // by Jonathan Dummer #ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) { - int tga_w, tga_h, tga_comp; - int sz; + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; stbi__get8(s); // discard Offset - sz = stbi__get8(s); // color type - if( sz > 1 ) { + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { stbi__rewind(s); return 0; // only RGB or indexed allowed } - sz = stbi__get8(s); // image type - // only RGB or grey allowed, +/- RLE - if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; - stbi__skip(s,9); + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } tga_w = stbi__get16le(s); if( tga_w < 1 ) { stbi__rewind(s); @@ -4805,45 +5377,81 @@ static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) stbi__rewind(s); return 0; // test height } - sz = stbi__get8(s); // bits per pixel - // only RGB or RGBA or grey allowed - if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) { - stbi__rewind(s); - return 0; + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; } - tga_comp = sz; if (x) *x = tga_w; if (y) *y = tga_h; - if (comp) *comp = tga_comp / 8; + if (comp) *comp = tga_comp; return 1; // seems to have passed everything } static int stbi__tga_test(stbi__context *s) { - int res; - int sz; + int res = 0; + int sz, tga_color_type; stbi__get8(s); // discard Offset - sz = stbi__get8(s); // color type - if ( sz > 1 ) return 0; // only RGB or indexed allowed + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed sz = stbi__get8(s); // image type - if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE - stbi__get16be(s); // discard palette start - stbi__get16be(s); // discard palette length - stbi__get8(s); // discard bits per palette color entry - stbi__get16be(s); // discard x origin - stbi__get16be(s); // discard y origin - if ( stbi__get16be(s) < 1 ) return 0; // test width - if ( stbi__get16be(s) < 1 ) return 0; // test height + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height sz = stbi__get8(s); // bits per pixel - if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) - res = 0; - else - res = 1; + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: stbi__rewind(s); return res; } -static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { // read in the TGA header stuff int tga_offset = stbi__get8(s); @@ -4858,16 +5466,18 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int int tga_width = stbi__get16le(s); int tga_height = stbi__get16le(s); int tga_bits_per_pixel = stbi__get8(s); - int tga_comp = tga_bits_per_pixel / 8; + int tga_comp, tga_rgb16=0; int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) // image data unsigned char *tga_data; unsigned char *tga_palette = NULL; int i, j; - unsigned char raw_data[4]; + unsigned char raw_data[4] = {0}; int RLE_count = 0; int RLE_repeating = 0; int read_next_pixel = 1; + STBI_NOTUSED(ri); // do a tiny bit of precessing if ( tga_image_type >= 8 ) @@ -4875,41 +5485,33 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int tga_image_type -= 8; tga_is_RLE = 1; } - /* int tga_alpha_bits = tga_inverted & 15; */ tga_inverted = 1 - ((tga_inverted >> 5) & 1); - // error check - if ( //(tga_indexed) || - (tga_width < 1) || (tga_height < 1) || - (tga_image_type < 1) || (tga_image_type > 3) || - ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && - (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) - ) - { - return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA - } - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) - { - tga_comp = tga_palette_bits / 8; - } + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); // tga info *x = tga_width; *y = tga_height; if (comp) *comp = tga_comp; - tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp ); + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); // skip to the data's starting position (offset usually = 0) stbi__skip(s, tga_offset ); - if ( !tga_indexed && !tga_is_RLE) { + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { for (i=0; i < tga_height; ++i) { - int y = tga_inverted ? tga_height -i - 1 : i; - stbi_uc *tga_row = tga_data + y*tga_width*tga_comp; + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; stbi__getn(s, tga_row, tga_width * tga_comp); } } else { @@ -4919,15 +5521,22 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // any data to skip? (offset usually = 0) stbi__skip(s, tga_palette_start ); // load the palette - tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 ); + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); if (!tga_palette) { STBI_FREE(tga_data); return stbi__errpuc("outofmem", "Out of memory"); } - if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); } } // load the data @@ -4957,23 +5566,22 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // load however much data we did have if ( tga_indexed ) { - // read in 1 byte, then perform the lookup - int pal_idx = stbi__get8(s); - if ( pal_idx >= tga_palette_len ) - { - // invalid index + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index pal_idx = 0; } - pal_idx *= tga_bits_per_pixel / 8; - for (j = 0; j*8 < tga_bits_per_pixel; ++j) - { + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { raw_data[j] = tga_palette[pal_idx+j]; } - } else - { + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { // read in the data raw - for (j = 0; j*8 < tga_bits_per_pixel; ++j) - { + for (j = 0; j < tga_comp; ++j) { raw_data[j] = stbi__get8(s); } } @@ -5012,8 +5620,8 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int } } - // swap RGB - if (tga_comp >= 3) + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) { unsigned char* tga_pixel = tga_data; for (i=0; i < tga_width * tga_height; ++i) @@ -5049,13 +5657,53 @@ static int stbi__psd_test(stbi__context *s) return r; } -static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) { - int pixelCount; + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; int channelCount, compression; - int channel, i, count, len; + int channel, i; + int bitdepth; int w,h; stbi_uc *out; + STBI_NOTUSED(ri); // Check identifier if (stbi__get32be(s) != 0x38425053) // "8BPS" @@ -5078,8 +5726,9 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int w = stbi__get32be(s); // Make sure the depth is 8 bits. - if (stbi__get16be(s) != 8) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 bit"); + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); // Make sure the color mode is RGB. // Valid options are: @@ -5111,8 +5760,18 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int if (compression > 1) return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + // Create the destination image. - out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); pixelCount = w*h; @@ -5144,61 +5803,86 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int *p = (channel == 3 ? 255 : 0); } else { // Read the RLE data. - count = 0; - while (count < pixelCount) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len ^= 0x0FF; - len += 2; - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); } } } } else { // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit value for each pixel in the image. + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. // Read the data by channel. for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out + channel; - if (channel > channelCount) { + if (channel >= channelCount) { // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = channel == 3 ? 255 : 0; + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } } else { - // Read the data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } } } } + // convert to desired output format if (req_comp && req_comp != 4) { - out = stbi__convert_format(out, 4, req_comp, w, h); + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); if (out == NULL) return out; // stbi__convert_format frees input on failure } @@ -5350,7 +6034,6 @@ static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *c if (count >= 128) { // Repeated stbi_uc value[4]; - int i; if (count==128) count = stbi__get16be(s); @@ -5383,10 +6066,13 @@ static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *c return result; } -static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp) +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) { stbi_uc *result; - int i, x,y; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; for (i=0; i<92; ++i) stbi__get8(s); @@ -5394,14 +6080,14 @@ static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int re x = stbi__get16be(s); y = stbi__get16be(s); if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); stbi__get32be(s); //skip `ratio' stbi__get16be(s); //skip `fields' stbi__get16be(s); //skip `pad' // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc(x*y*4); + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); memset(result, 0xff, x*y*4); if (!stbi__pic_load_core(s,x,y,comp, result)) { @@ -5439,10 +6125,12 @@ typedef struct { int w,h; stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; int flags, bgindex, ratio, transparent, eflags; stbi_uc pal[256][4]; stbi_uc lpal[256][4]; - stbi__gif_lzw codes[4096]; + stbi__gif_lzw codes[8192]; stbi_uc *color_table; int parse, step; int lflags; @@ -5450,6 +6138,7 @@ typedef struct int max_x, max_y; int cur_x, cur_y; int line_size; + int delay; } stbi__gif; static int stbi__gif_test_raw(stbi__context *s) @@ -5510,19 +6199,22 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) { - stbi__gif g; - if (!stbi__gif_header(s, &g, comp, 1)) { + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); stbi__rewind( s ); return 0; } - if (x) *x = g.w; - if (y) *y = g.h; + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); return 1; } static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) { stbi_uc *p, *c; + int idx; // recurse to decode the prefixes, since the linked-list is backwards, // and working backwards through an interleaved image would be nasty @@ -5531,10 +6223,12 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) if (g->cur_y >= g->max_y) return; - p = &g->out[g->cur_x + g->cur_y]; - c = &g->color_table[g->codes[code].suffix * 4]; + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; - if (c[3] >= 128) { + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; p[0] = c[2]; p[1] = c[1]; p[2] = c[0]; @@ -5557,7 +6251,7 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) { stbi_uc lzw_cs; - stbi__int32 len, code; + stbi__int32 len, init_code; stbi__uint32 first; stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; stbi__gif_lzw *p; @@ -5570,10 +6264,10 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) codemask = (1 << codesize) - 1; bits = 0; valid_bits = 0; - for (code = 0; code < clear; code++) { - g->codes[code].prefix = -1; - g->codes[code].first = (stbi_uc) code; - g->codes[code].suffix = (stbi_uc) code; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; } // support no starting clear code @@ -5608,11 +6302,16 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) stbi__skip(s,len); return g->out; } else if (code <= avail) { - if (first) return stbi__errpuc("no clear code", "Corrupt GIF"); + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } if (oldcode >= 0) { p = &g->codes[avail++]; - if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF"); + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + p->prefix = (stbi__int16) oldcode; p->first = g->codes[oldcode].first; p->suffix = (code == avail) ? p->first : g->codes[code].first; @@ -5634,43 +6333,70 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) } } -static void stbi__fill_gif_background(stbi__gif *g) -{ - int i; - stbi_uc *c = g->pal[g->bgindex]; - // @OPTIMIZE: write a dword at a time - for (i = 0; i < g->w * g->h * 4; i += 4) { - stbi_uc *p = &g->out[i]; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } -} - // this function is designed to support animated gifs, although stb_image doesn't support it -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) { - int i; - stbi_uc *old_out = 0; + int dispose; + int first_frame; + int pi; + int pcount; + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; if (g->out == 0) { if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->history = (stbi_uc *) stbi__malloc(g->w * g->h); if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); - stbi__fill_gif_background(g); + + // image is treated as "tranparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to teh color that was there the previous frame. + memset( g->out, 0x00, 4 * g->w * g->h ); + memset( g->background, 0x00, 4 * g->w * g->h ); // state of the background (starts transparent) + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + first_frame = 1; } else { - // animated-gif-only path - if (((g->eflags & 0x1C) >> 2) == 3) { - old_out = g->out; - g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); - if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); - memcpy(g->out, old_out, g->w*g->h*4); + // second frame - how do we dispoase of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); } + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + for (;;) { - switch (stbi__get8(s)) { + int tag = stbi__get8(s); + switch (tag) { case 0x2C: /* Image Descriptor */ { stbi__int32 x, y, w, h; @@ -5705,38 +6431,60 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); g->color_table = (stbi_uc *) g->lpal; } else if (g->flags & 0x80) { - for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent - g->pal[i][3] = 255; - if (g->transparent >= 0 && (g->eflags & 0x01)) - g->pal[g->transparent][3] = 0; g->color_table = (stbi_uc *) g->pal; } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - + return stbi__errpuc("missing color table", "Corrupt GIF"); + o = stbi__process_gif_raster(s, g); if (o == NULL) return NULL; - if (req_comp && req_comp != 4) - o = stbi__convert_format(o, 4, req_comp, g->w, g->h); + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + return o; } case 0x21: // Comment Extension. { int len; - if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. len = stbi__get8(s); if (len == 4) { g->eflags = stbi__get8(s); - stbi__get16le(s); // delay - g->transparent = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } } else { stbi__skip(s, len); break; } - } - while ((len = stbi__get8(s)) != 0) + } + while ((len = stbi__get8(s)) != 0) { stbi__skip(s, len); + } break; } @@ -5749,19 +6497,90 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i } } -static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + out = (stbi_uc*) STBI_REALLOC( out, layers * stride ); + if (delays) { + *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers ); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi_uc *u = 0; stbi__gif g; memset(&g, 0, sizeof(g)); - u = stbi__gif_load_next(s, &g, comp, req_comp); + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); if (u == (stbi_uc *) s) u = 0; // end of animated gif marker if (u) { *x = g.w; *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); } + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + return u; } @@ -5775,20 +6594,24 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) // Radiance RGBE HDR loader // originally by Nicolas Schulz #ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s) +static int stbi__hdr_test_core(stbi__context *s, const char *signature) { - const char *signature = "#?RADIANCE\n"; int i; for (i=0; signature[i]; ++i) if (stbi__get8(s) != signature[i]) - return 0; + return 0; + stbi__rewind(s); return 1; } static int stbi__hdr_test(stbi__context* s) { - int r = stbi__hdr_test_core(s); + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } return r; } @@ -5842,7 +6665,7 @@ static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) } } -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { char buffer[STBI__HDR_BUFLEN]; char *token; @@ -5853,10 +6676,12 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re int len; unsigned char count, value; int i, j, k, c1,c2, z; - + const char *headerToken; + STBI_NOTUSED(ri); // Check identifier - if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) return stbi__errpf("not HDR", "Corrupt HDR image"); // Parse header @@ -5885,8 +6710,13 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re if (comp) *comp = 3; if (req_comp == 0) req_comp = 3; + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + // Read data - hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float)); + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); // Load image data // image data is stored as some number of sca @@ -5925,20 +6755,29 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re len <<= 8; len |= stbi__get8(s); if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4); + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } for (k = 0; k < 4; ++k) { + int nleft; i = 0; - while (i < width) { + while ((nleft = width - i) > 0) { count = stbi__get8(s); if (count > 128) { // Run value = stbi__get8(s); count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = value; } else { // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = stbi__get8(s); } @@ -5947,7 +6786,8 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re for (i=0; i < width; ++i) stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); } - STBI_FREE(scanline); + if (scanline) + STBI_FREE(scanline); } return hdr_data; @@ -5958,8 +6798,13 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) char buffer[STBI__HDR_BUFLEN]; char *token; int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; - if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) { + if (stbi__hdr_test(s) == 0) { stbi__rewind( s ); return 0; } @@ -5996,29 +6841,17 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) #ifndef STBI_NO_BMP static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) { - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') { - stbi__rewind( s ); - return 0; - } - stbi__skip(s,12); - hsz = stbi__get32le(s); - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) { - stbi__rewind( s ); - return 0; - } - if (hsz == 12) { - *x = stbi__get16le(s); - *y = stbi__get16le(s); - } else { - *x = stbi__get32le(s); - *y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) { - stbi__rewind( s ); - return 0; - } - *comp = stbi__get16le(s) / 8; + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + stbi__rewind( s ); + if (p == NULL) + return 0; + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) *comp = info.ma ? 4 : 3; return 1; } #endif @@ -6026,7 +6859,10 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) #ifndef STBI_NO_PSD static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) { - int channelCount; + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; if (stbi__get32be(s) != 0x38425053) { stbi__rewind( s ); return 0; @@ -6043,7 +6879,8 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) } *y = stbi__get32be(s); *x = stbi__get32be(s); - if (stbi__get16be(s) != 8) { + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { stbi__rewind( s ); return 0; } @@ -6054,22 +6891,61 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) *comp = 4; return 1; } + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, dummy, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + dummy = stbi__get32be(s); + dummy = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} #endif #ifndef STBI_NO_PIC static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) { - int act_comp=0,num_packets=0,chained; + int act_comp=0,num_packets=0,chained,dummy; stbi__pic_packet packets[10]; - stbi__skip(s, 92); + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); *x = stbi__get16be(s); *y = stbi__get16be(s); - if (stbi__at_eof(s)) return 0; + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind( s ); - return 0; + stbi__rewind( s ); + return 0; } stbi__skip(s, 8); @@ -6129,16 +7005,22 @@ static int stbi__pnm_test(stbi__context *s) return 1; } -static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi_uc *out; + STBI_NOTUSED(ri); + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) return 0; + *x = s->img_x; *y = s->img_y; - *comp = s->img_n; + if (comp) *comp = s->img_n; + + if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "PNM too large"); - out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y); + out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); if (!out) return stbi__errpuc("outofmem", "Out of memory"); stbi__getn(s, out, s->img_n * s->img_x * s->img_y); @@ -6156,8 +7038,16 @@ static int stbi__pnm_isspace(char c) static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char) stbi__get8(s); + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } } static int stbi__pnm_isdigit(char c) @@ -6179,16 +7069,20 @@ static int stbi__pnm_getinteger(stbi__context *s, char *c) static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) { - int maxv; + int maxv, dummy; char c, p, t; - stbi__rewind( s ); + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); // Get identifier p = (char) stbi__get8(s); t = (char) stbi__get8(s); if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); + stbi__rewind(s); return 0; } @@ -6254,6 +7148,19 @@ static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) return stbi__err("unknown image type", "Image not of any known type, or corrupt"); } +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + return 0; +} + #ifndef STBI_NO_STDIO STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) { @@ -6275,6 +7182,27 @@ STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) fseek(f,pos,SEEK_SET); return r; } + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} #endif // !STBI_NO_STDIO STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) @@ -6291,10 +7219,61 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int return stbi__info_main(&s,x,y,comp); } +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + #endif // STB_IMAGE_IMPLEMENTATION /* revision history: + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit @@ -6435,3 +7414,46 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int 0.50 (2006-11-19) first released version */ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ From 0b64cb4dd35377db4e5c916b8bba8b46d788abff Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 14 Mar 2018 15:42:17 -0700 Subject: [PATCH 066/118] for dan, anyone else don't use, :wastebasket: :fire: --- Makefile | 2 +- cfg/imagenet22k.dataset | 1 + examples/classifier.c | 2 + examples/darknet.c | 21 +++++ examples/lsd.c | 186 +++++++++++++++++++++++++++++++++++++--- include/darknet.h | 6 ++ src/blas.c | 10 +-- src/blas.h | 8 +- src/blas_kernels.cu | 19 ++-- src/data.c | 11 ++- src/parser.c | 9 +- src/region_layer.c | 71 ++++++++++----- src/shortcut_layer.c | 12 +-- src/tree.h | 1 - src/upsample_layer.c | 16 ++-- src/utils.h | 1 - 16 files changed, 306 insertions(+), 70 deletions(-) diff --git a/Makefile b/Makefile index f50f279d28e..48560f9cf15 100644 --- a/Makefile +++ b/Makefile @@ -97,5 +97,5 @@ results: .PHONY: clean clean: - rm -rf $(OBJS) $(SLIB) $(ALIB) $(EXEC) $(EXECOBJ) + rm -rf $(OBJS) $(SLIB) $(ALIB) $(EXEC) $(EXECOBJ) $(OBJDIR)/* diff --git a/cfg/imagenet22k.dataset b/cfg/imagenet22k.dataset index 920785d603b..e25ef007ecc 100644 --- a/cfg/imagenet22k.dataset +++ b/cfg/imagenet22k.dataset @@ -1,6 +1,7 @@ classes=21842 train = /data/imagenet/imagenet22k.train.list valid = /data/imagenet/imagenet22k.valid.list +#valid = /data/imagenet/imagenet1k.valid.list backup = /home/pjreddie/backup/ labels = data/imagenet.labels.list names = data/imagenet.shortnames.list diff --git a/examples/classifier.c b/examples/classifier.c index 2f50a3572a0..e707ebc3755 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -47,6 +47,8 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int tag = option_find_int_quiet(options, "tag", 0); char *label_list = option_find_str(options, "labels", "data/labels.list"); char *train_list = option_find_str(options, "train", "data/train.list"); + char *tree = option_find_str(options, "tree", 0); + if (tree) net->hierarchy = read_tree(tree); int classes = option_find_int(options, "classes", 2); char **labels; diff --git a/examples/darknet.c b/examples/darknet.c index c67f20a1090..9757eb18643 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -188,6 +188,25 @@ void partial(char *cfgfile, char *weightfile, char *outfile, int max) save_weights_upto(net, outfile, max); } +void print_weights(char *cfgfile, char *weightfile, int n) +{ + gpu_index = -1; + network *net = load_network(cfgfile, weightfile, 1); + layer l = net->layers[n]; + int i, j; + //printf("["); + for(i = 0; i < l.n; ++i){ + //printf("["); + for(j = 0; j < l.size*l.size*l.c; ++j){ + //if(j > 0) printf(","); + printf("%g ", l.weights[i*l.size*l.size*l.c + j]); + } + printf("\n"); + //printf("]%s\n", (i == l.n-1)?"":","); + } + //printf("]"); +} + void rescale_net(char *cfgfile, char *weightfile, char *outfile) { gpu_index = -1; @@ -467,6 +486,8 @@ int main(int argc, char **argv) oneoff(argv[2], argv[3], argv[4]); } else if (0 == strcmp(argv[1], "oneoff2")){ oneoff2(argv[2], argv[3], argv[4], atoi(argv[5])); + } else if (0 == strcmp(argv[1], "print")){ + print_weights(argv[2], argv[3], atoi(argv[4])); } else if (0 == strcmp(argv[1], "partial")){ partial(argv[2], argv[3], argv[4], atoi(argv[5])); } else if (0 == strcmp(argv[1], "average")){ diff --git a/examples/lsd.c b/examples/lsd.c index 247f639ec8d..ad337644ba0 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -395,7 +395,7 @@ void slerp(float *start, float *end, float s, int n, float *out) scale_array(out, n, 1./mag); } -image random_unit_vector_image(w, h, c) +image random_unit_vector_image(int w, int h, int c) { image im = make_image(w, h, c); int i; @@ -480,13 +480,7 @@ void test_dcgan(char *cfgfile, char *weightfile) char *input = buff; int i, imlayer = 0; - for (i = 0; i < net->n; ++i) { - if (net->layers[i].out_c == 3) { - imlayer = i; - printf("%d\n", i); - break; - } - } + imlayer = net->n-1; while(1){ image im = make_image(net->w, net->h, net->c); @@ -494,8 +488,8 @@ void test_dcgan(char *cfgfile, char *weightfile) for(i = 0; i < im.w*im.h*im.c; ++i){ im.data[i] = rand_normal(); } - float mag = mag_array(im.data, im.w*im.h*im.c); - scale_array(im.data, im.w*im.h*im.c, 1./mag); + //float mag = mag_array(im.data, im.w*im.h*im.c); + //scale_array(im.data, im.w*im.h*im.c, 1./mag); float *X = im.data; time=clock(); @@ -514,6 +508,173 @@ void test_dcgan(char *cfgfile, char *weightfile) } } +void set_network_alpha_beta(network *net, float alpha, float beta) +{ + int i; + for(i = 0; i < net->n; ++i){ + if(net->layers[i].type == SHORTCUT){ + net->layers[i].alpha = alpha; + net->layers[i].beta = beta; + } + } +} + +void train_prog(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch) +{ +#ifdef GPU + char *backup_directory = "/home/pjreddie/backup/"; + srand(time(0)); + char *base = basecfg(cfg); + char *abase = basecfg(acfg); + printf("%s\n", base); + network *gnet = load_network(cfg, weight, clear); + network *anet = load_network(acfg, aweight, clear); + + int i, j, k; + layer imlayer = gnet->layers[gnet->n-1]; + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay); + int imgs = gnet->batch*gnet->subdivisions; + i = *gnet->seen/imgs; + data train, buffer; + + + list *plist = get_paths(train_images); + char **paths = (char **)list_to_array(plist); + + load_args args= get_base_args(anet); + args.paths = paths; + args.n = imgs; + args.m = plist->size; + args.d = &buffer; + args.type = CLASSIFICATION_DATA; + args.threads=16; + args.classes = 1; + char *ls[2] = {"imagenet", "zzzzzzzz"}; + args.labels = ls; + + pthread_t load_thread = load_data_in_thread(args); + clock_t time; + + gnet->train = 1; + anet->train = 1; + + int x_size = gnet->inputs*gnet->batch; + int y_size = gnet->truths*gnet->batch; + float *imerror = cuda_make_array(0, y_size); + + float aloss_avg = -1; + + if (maxbatch == 0) maxbatch = gnet->max_batches; + while (get_current_batch(gnet) < maxbatch) { + { + int cb = get_current_batch(gnet); + float alpha = (float) cb / (maxbatch/2); + if(alpha > 1) alpha = 1; + float beta = 1 - alpha; + printf("%f %f\n", alpha, beta); + set_network_alpha_beta(gnet, alpha, beta); + set_network_alpha_beta(anet, beta, alpha); + } + + i += 1; + time=clock(); + pthread_join(load_thread, 0); + train = buffer; + + load_thread = load_data_in_thread(args); + + printf("Loaded: %lf seconds\n", sec(clock()-time)); + + data gen = copy_data(train); + for (j = 0; j < imgs; ++j) { + train.y.vals[j][0] = 1; + gen.y.vals[j][0] = 0; + } + time=clock(); + + for (j = 0; j < gnet->subdivisions; ++j) { + get_next_batch(train, gnet->batch, j*gnet->batch, gnet->truth, 0); + int z; + for(z = 0; z < x_size; ++z){ + gnet->input[z] = rand_normal(); + } + /* + for(z = 0; z < gnet->batch; ++z){ + float mag = mag_array(gnet->input + z*gnet->inputs, gnet->inputs); + scale_array(gnet->input + z*gnet->inputs, gnet->inputs, 1./mag); + } + */ + *gnet->seen += gnet->batch; + forward_network(gnet); + + fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1); + fill_cpu(anet->truths*anet->batch, 1, anet->truth, 1); + copy_cpu(anet->inputs*anet->batch, imlayer.output, 1, anet->input, 1); + anet->delta_gpu = imerror; + forward_network(anet); + backward_network(anet); + + float genaloss = *anet->cost / anet->batch; + + scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); + scal_gpu(imlayer.outputs*imlayer.batch, 0, gnet->layers[gnet->n-1].delta_gpu, 1); + + axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet->layers[gnet->n-1].delta_gpu, 1); + + backward_network(gnet); + + for(k = 0; k < gnet->batch; ++k){ + int index = j*gnet->batch + k; + copy_cpu(gnet->outputs, gnet->output + k*gnet->outputs, 1, gen.X.vals[index], 1); + } + } + harmless_update_network_gpu(anet); + + data merge = concat_data(train, gen); + float aloss = train_network(anet, merge); + +#ifdef OPENCV + if(display){ + image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]); + image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); + show_image(im, "gen"); + show_image(im2, "train"); + save_image(im, "gen"); + save_image(im2, "train"); + cvWaitKey(1); + } +#endif + + update_network_gpu(gnet); + + free_data(merge); + free_data(train); + free_data(gen); + if (aloss_avg < 0) aloss_avg = aloss; + aloss_avg = aloss_avg*.9 + aloss*.1; + + printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs); + if(i%10000==0){ + char buff[256]; + sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i); + save_weights(gnet, buff); + sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i); + save_weights(anet, buff); + } + if(i%1000==0){ + char buff[256]; + sprintf(buff, "%s/%s.backup", backup_directory, base); + save_weights(gnet, buff); + sprintf(buff, "%s/%s.backup", backup_directory, abase); + save_weights(anet, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s_final.weights", backup_directory, base); + save_weights(gnet, buff); +#endif +} void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch) { @@ -668,7 +829,7 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, show_image(im2, "train"); save_image(im, "gen"); save_image(im2, "train"); - cvWaitKey(50); + cvWaitKey(1); } #endif @@ -850,7 +1011,7 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); show_image(im, "gen"); show_image(im2, "train"); - cvWaitKey(50); + cvWaitKey(1); } #endif free_data(merge); @@ -1217,6 +1378,7 @@ void run_lsd(int argc, char **argv) //else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear); //else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear); if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear, display, file, batches); + else if(0==strcmp(argv[2], "trainprog")) train_prog(cfg, weights, acfg, aweights, clear, display, file, batches); else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear, display); else if(0==strcmp(argv[2], "gan")) test_dcgan(cfg, weights); else if(0==strcmp(argv[2], "inter")) inter_dcgan(cfg, weights); diff --git a/include/darknet.h b/include/darknet.h index ea37a62deed..81a01957296 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -51,6 +51,7 @@ typedef struct{ int *group_size; int *group_offset; } tree; +tree *read_tree(char *filename); typedef enum{ LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN @@ -189,13 +190,17 @@ struct layer{ float class_scale; int bias_match; int random; + float ignore_thresh; + float truth_thresh; float thresh; + float focus; int classfix; int absolute; int onlyforward; int stopbackward; int dontload; + int dontsave; int dontloadscales; float temperature; @@ -790,5 +795,6 @@ void normalize_array(float *a, int n); int *read_intlist(char *s, int *n, int d); size_t rand_size_t(); float rand_normal(); +float rand_uniform(float min, float max); #endif diff --git a/src/blas.c b/src/blas.c index d1d01cf23ae..a1bb5554efa 100644 --- a/src/blas.c +++ b/src/blas.c @@ -65,7 +65,7 @@ void weighted_delta_cpu(float *a, float *b, float *s, float *da, float *db, floa } } -void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out) +void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float s1, float s2, float *out) { int stride = w1/w2; int sample = w2/w1; @@ -84,7 +84,7 @@ void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, for(i = 0; i < minw; ++i){ int out_index = i*sample + w2*(j*sample + h2*(k + c2*b)); int add_index = i*stride + w1*(j*stride + h1*(k + c1*b)); - out[out_index] += add[add_index]; + out[out_index] = s1*out[out_index] + s2*add[add_index]; } } } @@ -331,7 +331,7 @@ void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, i } } -void upsample_cpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out) +void upsample_cpu(float *in, int w, int h, int c, int batch, int stride, int forward, float scale, float *out) { int i, j, k, b; for(b = 0; b < batch; ++b){ @@ -340,8 +340,8 @@ void upsample_cpu(float *in, int w, int h, int c, int batch, int stride, int for for(i = 0; i < w*stride; ++i){ int in_index = b*w*h*c + k*w*h + (j/stride)*w + i/stride; int out_index = b*w*h*c + k*w*h + j*w + i; - if(forward) out[out_index] = in[in_index]; - else in[in_index] += out[out_index]; + if(forward) out[out_index] = scale*in[in_index]; + else in[in_index] += scale*out[out_index]; } } } diff --git a/src/blas.h b/src/blas.h index 99e348bec33..707291dead0 100644 --- a/src/blas.h +++ b/src/blas.h @@ -20,7 +20,7 @@ void pow_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY); void mul_cpu(int N, float *X, int INCX, float *Y, int INCY); int test_gpu_blas(); -void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out); +void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float s1, float s2, float *out); void mean_cpu(float *x, int batch, int filters, int spatial, float *mean); void variance_cpu(float *x, float *mean, int batch, int filters, int spatial, float *variance); @@ -42,7 +42,7 @@ void weighted_delta_cpu(float *a, float *b, float *s, float *da, float *db, floa void softmax(float *input, int n, float temp, int stride, float *output); void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output); -void upsample_cpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out); +void upsample_cpu(float *in, int w, int h, int c, int batch, int stride, int forward, float scale, float *out); #ifdef GPU #include "cuda.h" @@ -72,7 +72,7 @@ void fast_variance_delta_gpu(float *x, float *delta, float *mean, float *varianc void fast_variance_gpu(float *x, float *mean, int batch, int filters, int spatial, float *variance); void fast_mean_gpu(float *x, int batch, int filters, int spatial, float *mean); -void shortcut_gpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out); +void shortcut_gpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float s1, float s2, float *out); void scale_bias_gpu(float *output, float *biases, int batch, int n, int size); void backward_scale_gpu(float *x_norm, float *delta, int batch, int n, int size, float *scale_updates); void scale_bias_gpu(float *output, float *biases, int batch, int n, int size); @@ -99,7 +99,7 @@ void adam_gpu(int n, float *x, float *m, float *v, float B1, float B2, float rat void flatten_gpu(float *x, int spatial, int layers, int batch, int forward, float *out); void softmax_tree(float *input, int spatial, int batch, int stride, float temp, float *output, tree hier); -void upsample_gpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out); +void upsample_gpu(float *in, int w, int h, int c, int batch, int stride, int forward, float scale, float *out); #endif #endif diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu index 56b311f1cb2..47e82179170 100644 --- a/src/blas_kernels.cu +++ b/src/blas_kernels.cu @@ -708,7 +708,7 @@ extern "C" void fill_gpu(int N, float ALPHA, float * X, int INCX) check_error(cudaPeekAtLastError()); } -__global__ void shortcut_kernel(int size, int minw, int minh, int minc, int stride, int sample, int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out) +__global__ void shortcut_kernel(int size, int minw, int minh, int minc, int stride, int sample, int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float s1, float s2, float *out) { int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if (id >= size) return; @@ -722,10 +722,11 @@ __global__ void shortcut_kernel(int size, int minw, int minh, int minc, int stri int out_index = i*sample + w2*(j*sample + h2*(k + c2*b)); int add_index = i*stride + w1*(j*stride + h1*(k + c1*b)); - out[out_index] += add[add_index]; + out[out_index] = s1*out[out_index] + s2*add[add_index]; + //out[out_index] += add[add_index]; } -extern "C" void shortcut_gpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out) +extern "C" void shortcut_gpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float s1, float s2, float *out) { int minw = (w1 < w2) ? w1 : w2; int minh = (h1 < h2) ? h1 : h2; @@ -739,7 +740,7 @@ extern "C" void shortcut_gpu(int batch, int w1, int h1, int c1, float *add, int if(sample < 1) sample = 1; int size = batch * minw * minh * minc; - shortcut_kernel<<>>(size, minw, minh, minc, stride, sample, batch, w1, h1, c1, add, w2, h2, c2, out); + shortcut_kernel<<>>(size, minw, minh, minc, stride, sample, batch, w1, h1, c1, add, w2, h2, c2, s1, s2, out); check_error(cudaPeekAtLastError()); } @@ -1003,7 +1004,7 @@ extern "C" void softmax_gpu(float *input, int n, int batch, int batch_offset, in } -__global__ void upsample_kernel(size_t N, float *x, int w, int h, int c, int batch, int stride, int forward, float *out) +__global__ void upsample_kernel(size_t N, float *x, int w, int h, int c, int batch, int stride, int forward, float scale, float *out) { size_t i = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; if(i >= N) return; @@ -1023,12 +1024,12 @@ __global__ void upsample_kernel(size_t N, float *x, int w, int h, int c, int bat int in_index = b*w*h*c + in_c*w*h + in_h*w + in_w; - if(forward) out[out_index] += x[in_index]; - else atomicAdd(x+in_index, out[out_index]); + if(forward) out[out_index] += scale * x[in_index]; + else atomicAdd(x+in_index, scale * out[out_index]); } -extern "C" void upsample_gpu(float *in, int w, int h, int c, int batch, int stride, int forward, float *out) +extern "C" void upsample_gpu(float *in, int w, int h, int c, int batch, int stride, int forward, float scale, float *out) { size_t size = w*h*c*batch*stride*stride; - upsample_kernel<<>>(size, in, w, h, c, batch, stride, forward, out); + upsample_kernel<<>>(size, in, w, h, c, batch, stride, forward, scale, out); check_error(cudaPeekAtLastError()); } diff --git a/src/data.c b/src/data.c index d2159ceae03..51900f2600f 100644 --- a/src/data.c +++ b/src/data.c @@ -556,9 +556,18 @@ matrix load_regression_labels_paths(char **paths, int n, int k) char labelpath[4096]; find_replace(paths[i], "images", "labels", labelpath); find_replace(labelpath, "JPEGImages", "labels", labelpath); - find_replace(labelpath, ".jpg", ".txt", labelpath); + find_replace(labelpath, ".BMP", ".txt", labelpath); + find_replace(labelpath, ".JPEG", ".txt", labelpath); find_replace(labelpath, ".JPG", ".txt", labelpath); + find_replace(labelpath, ".JPeG", ".txt", labelpath); + find_replace(labelpath, ".Jpeg", ".txt", labelpath); + find_replace(labelpath, ".PNG", ".txt", labelpath); + find_replace(labelpath, ".TIF", ".txt", labelpath); + find_replace(labelpath, ".bmp", ".txt", labelpath); + find_replace(labelpath, ".jpeg", ".txt", labelpath); + find_replace(labelpath, ".jpg", ".txt", labelpath); find_replace(labelpath, ".png", ".txt", labelpath); + find_replace(labelpath, ".tif", ".txt", labelpath); FILE *file = fopen(labelpath, "r"); for(j = 0; j < k; ++j){ diff --git a/src/parser.c b/src/parser.c index 00767f076ab..e6dd238006d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -313,7 +313,8 @@ layer parse_region(list *options, size_params params) l.jitter = option_find_float(options, "jitter", .2); l.rescore = option_find_int_quiet(options, "rescore",0); - l.thresh = option_find_float(options, "thresh", .5); + l.ignore_thresh = option_find_float(options, "ignore_thresh", .5); + l.truth_thresh = option_find_float(options, "truth_thresh", 1); l.classfix = option_find_int_quiet(options, "classfix", 0); l.absolute = option_find_int_quiet(options, "absolute", 0); l.random = option_find_int_quiet(options, "random", 0); @@ -324,6 +325,7 @@ layer parse_region(list *options, size_params params) l.mask_scale = option_find_float_quiet(options, "mask_scale", 1); l.class_scale = option_find_float(options, "class_scale", 1); l.bias_match = option_find_int_quiet(options, "bias_match",0); + l.focus = option_find_float_quiet(options, "focus", 0); char *tree_file = option_find_str(options, "tree", 0); if (tree_file) l.softmax_tree = read_tree(tree_file); @@ -494,6 +496,8 @@ layer parse_shortcut(list *options, size_params params, network *net) char *activation_s = option_find_str(options, "activation", "linear"); ACTIVATION activation = get_activation(activation_s); s.activation = activation; + s.alpha = option_find_float_quiet(options, "alpha", 1); + s.beta = option_find_float_quiet(options, "beta", 1); return s; } @@ -536,6 +540,7 @@ layer parse_upsample(list *options, size_params params, network *net) int stride = option_find_int(options, "stride",2); layer l = make_upsample_layer(params.batch, params.w, params.h, params.c, stride); + l.scale = option_find_float_quiet(options, "scale", 1); return l; } @@ -778,6 +783,7 @@ network *parse_network_cfg(char *filename) l.truth = option_find_int_quiet(options, "truth", 0); l.onlyforward = option_find_int_quiet(options, "onlyforward", 0); l.stopbackward = option_find_int_quiet(options, "stopbackward", 0); + l.dontsave = option_find_int_quiet(options, "dontsave", 0); l.dontload = option_find_int_quiet(options, "dontload", 0); l.dontloadscales = option_find_int_quiet(options, "dontloadscales", 0); l.learning_rate_scale = option_find_float_quiet(options, "learning_rate", 1); @@ -961,6 +967,7 @@ void save_weights_upto(network *net, char *filename, int cutoff) int i; for(i = 0; i < net->n && i < cutoff; ++i){ layer l = net->layers[i]; + if (l.dontsave) continue; if(l.type == CONVOLUTIONAL || l.type == DECONVOLUTIONAL){ save_convolutional_weights(l, fp); } if(l.type == CONNECTED){ diff --git a/src/region_layer.c b/src/region_layer.c index cfe72d4018a..5ad7bc0ab34 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -124,7 +124,7 @@ void delta_region_mask(float *truth, float *x, int n, int index, float *delta, i } -void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, int stride, float *avg_cat, int tag) +void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, int stride, float *avg_cat, int tag, float focus) { int i, n; if(hier){ @@ -140,15 +140,30 @@ void delta_region_class(float *output, float *delta, int index, int class, int c class = hier->parent[class]; } - *avg_cat += pred; + if(avg_cat) *avg_cat += pred; } else { if (delta[index] && tag){ - delta[index + stride*class] = scale * (1 - output[index + stride*class]); + if(focus){ + float y = -1; + float p = output[index + stride*class]; + float lg = p > .0000000001 ? log(p) : -10; + delta[index + stride*class] = y * pow(1-p, focus) * (focus*p*lg + p - 1); + }else{ + delta[index + stride*class] = scale * (1 - output[index + stride*class]); + if(avg_cat) *avg_cat += output[index + stride*class]; + } return; } for(n = 0; n < classes; ++n){ - delta[index + stride*n] = scale * (((n == class)?1 : 0) - output[index + stride*n]); - if(n == class) *avg_cat += output[index + stride*n]; + if(focus){ + float y = (n == class) ? -1 : 1; + float p = (n == class) ? output[index + stride*n] : 1 - output[index + stride*n]; + float lg = p > .0000000001 ? log(p) : -10; + delta[index + stride*n] = y * pow(1-p, focus) * (focus*p*lg + p - 1); + }else{ + delta[index + stride*n] = scale * (((n == class)?1 : 0) - output[index + stride*n]); + } + if(n == class && avg_cat) *avg_cat += output[index + stride*n]; } } } @@ -204,6 +219,7 @@ void forward_region_layer(const layer l, network net) if(!net.train) return; float avg_iou = 0; float recall = 0; + float recall75 = 0; float avg_cat = 0; float avg_obj = 0; float avg_anyobj = 0; @@ -233,7 +249,7 @@ void forward_region_layer(const layer l, network net) } int class_index = entry_index(l, b, maxi, l.coords + 1); int obj_index = entry_index(l, b, maxi, l.coords); - delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax, l.focus); if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); else l.delta[obj_index] = 0; l.delta[obj_index] = 0; @@ -250,32 +266,44 @@ void forward_region_layer(const layer l, network net) int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); box pred = get_region_box(l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.w*l.h); float best_iou = 0; + int best_t = 0; for(t = 0; t < l.max_boxes; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; float iou = box_iou(pred, truth); if (iou > best_iou) { best_iou = iou; + best_t = t; } } int obj_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, l.coords); avg_anyobj += l.output[obj_index]; l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); if(l.background) l.delta[obj_index] = l.noobject_scale * (1 - l.output[obj_index]); - if (best_iou > l.thresh) { + if (best_iou > l.ignore_thresh) { l.delta[obj_index] = 0; } - -/* - if(*(net.seen) < 12800){ - box truth = {0}; - truth.x = (i + .5)/l.w; - truth.y = (j + .5)/l.h; - truth.w = l.biases[2*l.mask[n]]/net.w; - truth.h = l.biases[2*l.mask[n]+1]/net.h; - delta_region_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.delta, .01, l.w*l.h); + if (best_iou > l.truth_thresh) { + l.delta[obj_index] = l.object_scale * (1 - l.output[obj_index]); + + int class = net.truth[best_t*(l.coords + 1) + b*l.truths + l.coords]; + if (l.map) class = l.map[class]; + int class_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, l.coords + 1); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, 0, !l.softmax, l.focus); + box truth = float_to_box(net.truth + best_t*(l.coords + 1) + b*l.truths, 1); + delta_region_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.delta, l.coord_scale*(2-truth.w*truth.h), l.w*l.h); } - */ + + /* + if(*(net.seen) < 12800){ + box truth = {0}; + truth.x = (i + .5)/l.w; + truth.y = (j + .5)/l.h; + truth.w = l.biases[2*l.mask[n]]/net.w; + truth.h = l.biases[2*l.mask[n]+1]/net.h; + delta_region_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.delta, .01, l.w*l.h); + } + */ } } } @@ -309,12 +337,13 @@ void forward_region_layer(const layer l, network net) //printf("%d %d\n", best_n, mask_n); if(mask_n >= 0){ int box_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 0); - float iou = delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, net.w, net.h, l.delta, l.coord_scale * (2 - truth.w*truth.h), l.w*l.h); + float iou = delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, net.w, net.h, l.delta, l.coord_scale*(2-truth.w*truth.h), l.w*l.h); if(l.coords > 4){ int mask_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4); delta_region_mask(net.truth + t*(l.coords + 1) + b*l.truths + 5, l.output, l.coords - 4, mask_index, l.delta, l.w*l.h, l.mask_scale); } if(iou > .5) recall += 1; + if(iou > .75) recall75 += 1; avg_iou += iou; //l.delta[best_index + 4] = iou - l.output[best_index + 4]; @@ -331,7 +360,7 @@ void forward_region_layer(const layer l, network net) int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; if (l.map) class = l.map[class]; int class_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, l.coords + 1); - delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax, l.focus); ++count; ++class_count; } @@ -339,7 +368,7 @@ void forward_region_layer(const layer l, network net) } //printf("\n"); *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2); - printf("Region %d Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\n", net.index, avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, count); + printf("Region %d Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, .5R: %f, .75R: %f, count: %d\n", net.index, avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, recall75/count, count); } void backward_region_layer(const layer l, network net) @@ -576,7 +605,7 @@ void backward_region_layer_gpu(const layer l, network net) for (b = 0; b < l.batch; ++b){ for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); - gradient_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); + //gradient_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); if(l.coords > 4){ index = entry_index(l, b, n*l.w*l.h, 4); gradient_array_gpu(l.output_gpu + index, (l.coords - 4)*l.w*l.h, LOGISTIC, l.delta_gpu + index); diff --git a/src/shortcut_layer.c b/src/shortcut_layer.c index e1b9bc52b47..49d17f56f66 100644 --- a/src/shortcut_layer.c +++ b/src/shortcut_layer.c @@ -62,29 +62,29 @@ void resize_shortcut_layer(layer *l, int w, int h) void forward_shortcut_layer(const layer l, network net) { copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1); - shortcut_cpu(l.batch, l.w, l.h, l.c, net.layers[l.index].output, l.out_w, l.out_h, l.out_c, l.output); + shortcut_cpu(l.batch, l.w, l.h, l.c, net.layers[l.index].output, l.out_w, l.out_h, l.out_c, l.alpha, l.beta, l.output); activate_array(l.output, l.outputs*l.batch, l.activation); } void backward_shortcut_layer(const layer l, network net) { gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta); - axpy_cpu(l.outputs*l.batch, 1, l.delta, 1, net.delta, 1); - shortcut_cpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta, l.w, l.h, l.c, net.layers[l.index].delta); + axpy_cpu(l.outputs*l.batch, l.alpha, l.delta, 1, net.delta, 1); + shortcut_cpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta, l.w, l.h, l.c, 1, l.beta, net.layers[l.index].delta); } #ifdef GPU void forward_shortcut_layer_gpu(const layer l, network net) { copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1); - shortcut_gpu(l.batch, l.w, l.h, l.c, net.layers[l.index].output_gpu, l.out_w, l.out_h, l.out_c, l.output_gpu); + shortcut_gpu(l.batch, l.w, l.h, l.c, net.layers[l.index].output_gpu, l.out_w, l.out_h, l.out_c, l.alpha, l.beta, l.output_gpu); activate_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation); } void backward_shortcut_layer_gpu(const layer l, network net) { gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu); - axpy_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1, net.delta_gpu, 1); - shortcut_gpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta_gpu, l.w, l.h, l.c, net.layers[l.index].delta_gpu); + axpy_gpu(l.outputs*l.batch, l.alpha, l.delta_gpu, 1, net.delta_gpu, 1); + shortcut_gpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta_gpu, l.w, l.h, l.c, 1, l.beta, net.layers[l.index].delta_gpu); } #endif diff --git a/src/tree.h b/src/tree.h index 100858a3819..3802b8ead80 100644 --- a/src/tree.h +++ b/src/tree.h @@ -2,7 +2,6 @@ #define TREE_H #include "darknet.h" -tree *read_tree(char *filename); int hierarchy_top_prediction(float *predictions, tree *hier, float thresh, int stride); float get_hierarchy_probability(float *x, tree *hier, int c, int stride); diff --git a/src/upsample_layer.c b/src/upsample_layer.c index 2f5d1d0c4d9..605f21f8ebd 100644 --- a/src/upsample_layer.c +++ b/src/upsample_layer.c @@ -69,18 +69,18 @@ void forward_upsample_layer(const layer l, network net) { fill_cpu(l.outputs*l.batch, 0, l.output, 1); if(l.reverse){ - upsample_cpu(l.output, l.out_w, l.out_h, l.c, l.batch, l.stride, 0, net.input); + upsample_cpu(l.output, l.out_w, l.out_h, l.c, l.batch, l.stride, 0, l.scale, net.input); }else{ - upsample_cpu(net.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output); + upsample_cpu(net.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.scale, l.output); } } void backward_upsample_layer(const layer l, network net) { if(l.reverse){ - upsample_cpu(l.delta, l.out_w, l.out_h, l.c, l.batch, l.stride, 1, net.delta); + upsample_cpu(l.delta, l.out_w, l.out_h, l.c, l.batch, l.stride, 1, l.scale, net.delta); }else{ - upsample_cpu(net.delta, l.w, l.h, l.c, l.batch, l.stride, 0, l.delta); + upsample_cpu(net.delta, l.w, l.h, l.c, l.batch, l.stride, 0, l.scale, l.delta); } } @@ -89,18 +89,18 @@ void forward_upsample_layer_gpu(const layer l, network net) { fill_gpu(l.outputs*l.batch, 0, l.output_gpu, 1); if(l.reverse){ - upsample_gpu(l.output_gpu, l.out_w, l.out_h, l.c, l.batch, l.stride, 0, net.input_gpu); + upsample_gpu(l.output_gpu, l.out_w, l.out_h, l.c, l.batch, l.stride, 0, l.scale, net.input_gpu); }else{ - upsample_gpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); + upsample_gpu(net.input_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, l.scale, l.output_gpu); } } void backward_upsample_layer_gpu(const layer l, network net) { if(l.reverse){ - upsample_gpu(l.delta_gpu, l.out_w, l.out_h, l.c, l.batch, l.stride, 1, net.delta_gpu); + upsample_gpu(l.delta_gpu, l.out_w, l.out_h, l.c, l.batch, l.stride, 1, l.scale, net.delta_gpu); }else{ - upsample_gpu(net.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, l.delta_gpu); + upsample_gpu(net.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, l.scale, l.delta_gpu); } } #endif diff --git a/src/utils.h b/src/utils.h index 01823507f66..ef24da79888 100644 --- a/src/utils.h +++ b/src/utils.h @@ -40,7 +40,6 @@ float *parse_fields(char *line, int n); void translate_array(float *a, int n, float s); float constrain(float min, float max, float a); int constrain_int(int a, int min, int max); -float rand_uniform(float min, float max); float rand_scale(float s); int rand_int(int min, int max); void mean_arrays(float **a, int n, int els, float *avg); From 0f110834f4e18b30d5f101bf8f1724c34b7b83db Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 15 Mar 2018 15:23:14 -0700 Subject: [PATCH 067/118] faster nms and stuff --- examples/coco.c | 6 ++-- examples/detector.c | 47 ++++++++++++++-------------- examples/yolo.c | 6 ++-- include/darknet.h | 7 ++--- python/darknet.py | 12 +++---- src/box.c | 11 +++++++ src/demo.c | 22 ++++++------- src/network.c | 21 ++++++++----- src/region_layer.c | 76 ++++++++++++++++++++++++++++++--------------- src/region_layer.h | 1 + 10 files changed, 121 insertions(+), 88 deletions(-) diff --git a/examples/coco.c b/examples/coco.c index 6d9638c47fe..a5a526e57a9 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -146,7 +146,7 @@ void validate_coco(char *cfg, char *weights) FILE *fp = fopen(buff, "w"); fprintf(fp, "[\n"); - detection *dets = make_network_boxes(net); + detection *dets = make_network_boxes(net, 0); int m = plist->size; int i=0; @@ -231,7 +231,7 @@ void validate_coco_recall(char *cfgfile, char *weightfile) snprintf(buff, 1024, "%s%s.txt", base, coco_classes[j]); fps[j] = fopen(buff, "w"); } - detection *dets = make_network_boxes(net); + detection *dets = make_network_boxes(net, 0); int m = plist->size; int i=0; @@ -302,7 +302,7 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) clock_t time; char buff[256]; char *input = buff; - detection *dets = make_network_boxes(net); + detection *dets = make_network_boxes(net, 0); while(1){ if(filename){ strncpy(input, filename, 256); diff --git a/examples/detector.c b/examples/detector.c index 5bf8ac40738..c7c2c73bee8 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -279,8 +279,6 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char } } - detection *dets = make_network_boxes(net); - int m = plist->size; int i=0; int t; @@ -333,15 +331,17 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char network_predict(net, input.data); int w = val[t].w; int h = val[t].h; - fill_network_boxes(net, w, h, thresh, .5, map, 0, dets); - if (nms) do_nms_sort(dets, l.w*l.h*l.n, classes, nms); + int num = 0; + detection *dets = get_network_boxes(net, w, h, thresh, .5, map, 0, &num); + if (nms) do_nms_sort(dets, num, classes, nms); if (coco){ - print_cocos(fp, path, dets, l.w*l.h*l.n, classes, w, h); + print_cocos(fp, path, dets, num, classes, w, h); } else if (imagenet){ - print_imagenet_detections(fp, i+t-nthreads+1, dets, l.w*l.h*l.n, classes, w, h); + print_imagenet_detections(fp, i+t-nthreads+1, dets, num, classes, w, h); } else { - print_detector_detections(fps, id, dets, l.w*l.h*l.n, classes, w, h); + print_detector_detections(fps, id, dets, num, classes, w, h); } + free_detections(dets, num); free(id); free_image(val[t]); free_image(val_resized[t]); @@ -409,8 +409,6 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out } } - detection *dets = make_network_boxes(net); - int nboxes = num_boxes(net); int m = plist->size; int i=0; @@ -459,7 +457,8 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out network_predict(net, X); int w = val[t].w; int h = val[t].h; - fill_network_boxes(net, w, h, thresh, .5, map, 0, dets); + int nboxes = 0; + detection *dets = get_network_boxes(net, w, h, thresh, .5, map, 0, &nboxes); if (nms) do_nms_sort(dets, nboxes, classes, nms); if (coco){ print_cocos(fp, path, dets, nboxes, classes, w, h); @@ -497,7 +496,6 @@ void validate_detector_recall(char *cfgfile, char *weightfile) layer l = net->layers[net->n-1]; int j, k; - detection *dets = make_network_boxes(net); int m = plist->size; int i=0; @@ -510,7 +508,6 @@ void validate_detector_recall(char *cfgfile, char *weightfile) int correct = 0; int proposals = 0; float avg_iou = 0; - int nboxes = num_boxes(net); for(i = 0; i < m; ++i){ char *path = paths[i]; @@ -518,7 +515,8 @@ void validate_detector_recall(char *cfgfile, char *weightfile) image sized = resize_image(orig, net->w, net->h); char *id = basecfg(path); network_predict(net, sized.data); - fill_network_boxes(net, sized.w, sized.h, thresh, .5, 0, 1, dets); + int nboxes = 0; + detection *dets = get_network_boxes(net, sized.w, sized.h, thresh, .5, 0, 1, &nboxes); if (nms) do_nms_obj(dets, nboxes, 1, nms); char labelpath[4096]; @@ -590,18 +588,18 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam //resize_network(net, sized.w, sized.h); layer l = net->layers[net->n-1]; - int nboxes = num_boxes(net); - printf("%d\n", nboxes); float *X = sized.data; time=what_time_is_it_now(); network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time); - detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1); + int nboxes = 0; + detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes); + printf("%d\n", nboxes); //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); if (nms) do_nms_sort(dets, nboxes, l.classes, nms); draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes); - free_detections(dets, num_boxes(net)); + free_detections(dets, nboxes); if(outfile){ save_image(im, outfile); } @@ -673,11 +671,10 @@ void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_ind image in_s = letterbox_image(in, net->w, net->h); layer l = net->layers[net->n-1]; - int nboxes = num_boxes(net); - float *X = in_s.data; network_predict(net, X); - detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 0); + int nboxes = 0; + detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 0, &nboxes); //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); if (nms) do_nms_sort(dets, nboxes, l.classes, nms); @@ -691,7 +688,7 @@ void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_ind } show_image(in, base); cvWaitKey(10); - free_detections(dets, num_boxes(net)); + free_detections(dets, nboxes); free_image(in_s); @@ -756,12 +753,12 @@ void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_in image in_s = letterbox_image(in, net->w, net->h); layer l = net->layers[net->n-1]; - int nboxes = num_boxes(net); show_image(in, base); + int nboxes = 0; float *X = in_s.data; network_predict(net, X); - detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 1); + detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 1, &nboxes); //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); if (nms) do_nms_sort(dets, nboxes, l.classes, nms); @@ -779,7 +776,7 @@ void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_in free_image(bim); } } - free_detections(dets, num_boxes(net)); + free_detections(dets, nboxes); free_image(in_s); @@ -795,6 +792,7 @@ void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_in } } +/* void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, detection *dets) { network_predict_image(net, im); @@ -803,6 +801,7 @@ void network_detect(network *net, image im, float thresh, float hier_thresh, flo fill_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 0, dets); if (nms) do_nms_sort(dets, nboxes, l.classes, nms); } +*/ void run_detector(int argc, char **argv) { diff --git a/examples/yolo.c b/examples/yolo.c index af4b8b50e9e..ef8777c8013 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -133,7 +133,7 @@ void validate_yolo(char *cfg, char *weights) image *buf = calloc(nthreads, sizeof(image)); image *buf_resized = calloc(nthreads, sizeof(image)); pthread_t *thr = calloc(nthreads, sizeof(pthread_t)); - detection *dets = make_network_boxes(net); + detection *dets = make_network_boxes(net, 0); load_args args = {0}; args.w = net->w; @@ -200,7 +200,7 @@ void validate_yolo_recall(char *cfg, char *weights) snprintf(buff, 1024, "%s%s.txt", base, voc_names[j]); fps[j] = fopen(buff, "w"); } - detection *dets = make_network_boxes(net); + detection *dets = make_network_boxes(net, 0); int m = plist->size; int i=0; @@ -271,7 +271,7 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) char buff[256]; char *input = buff; float nms=.4; - detection *dets = make_network_boxes(net); + detection *dets = make_network_boxes(net, 0); while(1){ if(filename){ strncpy(input, filename, 256); diff --git a/include/darknet.h b/include/darknet.h index 81a01957296..000cef98680 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -682,7 +682,7 @@ void save_weights_upto(network *net, char *filename, int cutoff); void load_weights_upto(network *net, char *filename, int start, int cutoff); void zero_objectness(layer l); -void get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets); +int get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets); void free_network(network *net); void set_batch_network(network *net, int b); void set_temp_network(network *net, float t); @@ -739,10 +739,7 @@ int network_width(network *net); int network_height(network *net); float *network_predict_image(network *net, image im); void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, detection *dets); -int num_boxes(network *net); -detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative); -void fill_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, detection *dets); -detection *make_network_boxes(network *net); +detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num); void free_detections(detection *dets, int n); void reset_network_state(network *net, int b); diff --git a/python/darknet.py b/python/darknet.py index 675d20249ee..88d84cdbd17 100644 --- a/python/darknet.py +++ b/python/darknet.py @@ -63,7 +63,7 @@ class METADATA(Structure): make_image.restype = IMAGE get_network_boxes = lib.get_network_boxes -get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int] +get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int)] get_network_boxes.restype = POINTER(DETECTION) make_network_boxes = lib.make_network_boxes @@ -76,10 +76,6 @@ class METADATA(Structure): free_ptrs = lib.free_ptrs free_ptrs.argtypes = [POINTER(c_void_p), c_int] -num_boxes = lib.num_boxes -num_boxes.argtypes = [c_void_p] -num_boxes.restype = c_int - network_predict = lib.network_predict network_predict.argtypes = [c_void_p, POINTER(c_float)] @@ -128,9 +124,11 @@ def classify(net, meta, im): def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45): im = load_image(image, 0, 0) - num = num_boxes(net) + num = c_int(0) + pnum = pointer(num) predict_image(net, im) - dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0) + dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum) + num = pnum[0] if (nms): do_nms_obj(dets, num, meta.classes, nms); res = [] diff --git a/src/box.c b/src/box.c index f0a3504d4c5..8a1772c9ae0 100644 --- a/src/box.c +++ b/src/box.c @@ -21,6 +21,17 @@ int nms_comparator(const void *pa, const void *pb) void do_nms_obj(detection *dets, int total, int classes, float thresh) { int i, j, k; + k = total-1; + for(i = 0; i <= k; ++i){ + if(dets[i].objectness == 0){ + detection swap = dets[i]; + dets[i] = dets[k]; + dets[k] = swap; + --k; + --i; + } + } + total = k+1; for(i = 0; i < total; ++i){ dets[i].sort_class = -1; diff --git a/src/demo.c b/src/demo.c index 68294b430bf..8ed523dfc19 100644 --- a/src/demo.c +++ b/src/demo.c @@ -30,17 +30,12 @@ static int running = 0; static int demo_frame = 3; static int demo_index = 0; -static int demo_detections = 0; //static float **predictions; -static detection **dets; -static detection *avg; //static float *avg; static int demo_done = 0; double demo_time; -detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative); -detection *make_network_boxes(network *net); -void fill_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, detection *dets); +detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num); void *detect_in_thread(void *ptr) { @@ -55,12 +50,15 @@ void *detect_in_thread(void *ptr) if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else */ + detection *dets; + int nboxes = 0; if (l.type == REGION){ - fill_network_boxes(net, buff[0].w, buff[0].h, demo_thresh, demo_hier, 0, 1, dets[demo_index]); + dets = get_network_boxes(net, buff[0].w, buff[0].h, demo_thresh, demo_hier, 0, 1, &nboxes); } else { error("Last layer must produce detections\n"); } +/* int i,j; box zero = {0}; int classes = l.classes; @@ -79,15 +77,17 @@ void *detect_in_thread(void *ptr) //copy_cpu(classes, dets[0][i].prob, 1, avg[i].prob, 1); //avg[i].objectness = dets[0][i].objectness; } + */ - if (nms > 0) do_nms_obj(avg, demo_detections, l.classes, nms); + if (nms > 0) do_nms_obj(dets, nboxes, l.classes, nms); printf("\033[2J"); printf("\033[1;1H"); printf("\nFPS:%.1f\n",fps); printf("Objects:\n\n"); image display = buff[(buff_index+2) % 3]; - draw_detections(display, avg, demo_detections, demo_thresh, demo_names, demo_alphabet, demo_classes); + draw_detections(display, dets, nboxes, demo_thresh, demo_names, demo_alphabet, demo_classes); + free_detections(dets, nboxes); demo_index = (demo_index + 1)%demo_frame; running = 0; @@ -174,11 +174,7 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(!cap) error("Couldn't connect to webcam.\n"); - demo_detections = num_boxes(net); - avg = make_network_boxes(net); - dets = calloc(demo_frame, sizeof(detection*)); int i; - for(i = 0; i < demo_frame; ++i) dets[i] = make_network_boxes(net); buff[0] = get_image_from_stream(cap); buff[1] = copy_image(buff[0]); diff --git a/src/network.c b/src/network.c index f4966211624..656071fcaaa 100644 --- a/src/network.c +++ b/src/network.c @@ -502,24 +502,28 @@ float *network_predict(network *net, float *input) return out; } -int num_boxes(network *net) +int num_detections(network *net, float thresh) { int i; int s = 0; for(i = 0; i < net->n; ++i){ layer l = net->layers[i]; - if(l.type == REGION || l.type == DETECTION){ + if(l.type == REGION){ + s += region_num_detections(l, thresh); + } + if(l.type == DETECTION){ s += l.w*l.h*l.n; } } return s; } -detection *make_network_boxes(network *net) +detection *make_network_boxes(network *net, float thresh, int *num) { layer l = net->layers[net->n - 1]; int i; - int nboxes = num_boxes(net); + int nboxes = num_detections(net, thresh); + if(num) *num = nboxes; detection *dets = calloc(nboxes, sizeof(detection)); for(i = 0; i < nboxes; ++i){ dets[i].prob = calloc(l.classes, sizeof(float)); @@ -529,14 +533,15 @@ detection *make_network_boxes(network *net) } return dets; } + void fill_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, detection *dets) { int j; for(j = 0; j < net->n; ++j){ layer l = net->layers[j]; if(l.type == REGION){ - get_region_detections(l, w, h, net->w, net->h, thresh, map, hier, relative, dets); - dets += l.w*l.h*l.n; + int count = get_region_detections(l, w, h, net->w, net->h, thresh, map, hier, relative, dets); + dets += count; } if(l.type == DETECTION){ get_detection_detections(l, w, h, thresh, dets); @@ -545,9 +550,9 @@ void fill_network_boxes(network *net, int w, int h, float thresh, float hier, in } } -detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative) +detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num) { - detection *dets = make_network_boxes(net); + detection *dets = make_network_boxes(net, thresh, num); fill_network_boxes(net, w, h, thresh, hier, map, relative, dets); return dets; } diff --git a/src/region_layer.c b/src/region_layer.c index 5ad7bc0ab34..fc2a5b26ebb 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -412,44 +412,69 @@ void correct_region_boxes(detection *dets, int n, int w, int h, int netw, int ne } } -void get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets) +int region_num_detections(layer l, float thresh) +{ + int i, n; + int count = 0; + for (i = 0; i < l.w*l.h; ++i){ + int row = i / l.w; + int col = i % l.w; + for(n = 0; n < l.n; ++n){ + int index = n*l.w*l.h + i; + int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); + if(l.output[obj_index] > thresh){ + ++count; + } + } + } + return count; +} + +void avg_flipped_region(layer l) { int i,j,n,z; - float *predictions = l.output; - if (l.batch == 2) { - float *flip = l.output + l.outputs; - for (j = 0; j < l.h; ++j) { - for (i = 0; i < l.w/2; ++i) { - for (n = 0; n < l.n; ++n) { - for(z = 0; z < l.classes + l.coords + 1; ++z){ - int i1 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + i; - int i2 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + (l.w - i - 1); - float swap = flip[i1]; - flip[i1] = flip[i2]; - flip[i2] = swap; - if(z == 0){ - flip[i1] = -flip[i1]; - flip[i2] = -flip[i2]; - } + float *flip = l.output + l.outputs; + for (j = 0; j < l.h; ++j) { + for (i = 0; i < l.w/2; ++i) { + for (n = 0; n < l.n; ++n) { + for(z = 0; z < l.classes + l.coords + 1; ++z){ + int i1 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + i; + int i2 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + (l.w - i - 1); + float swap = flip[i1]; + flip[i1] = flip[i2]; + flip[i2] = swap; + if(z == 0){ + flip[i1] = -flip[i1]; + flip[i2] = -flip[i2]; } } } } - for(i = 0; i < l.outputs; ++i){ - l.output[i] = (l.output[i] + flip[i])/2.; - } } + for(i = 0; i < l.outputs; ++i){ + l.output[i] = (l.output[i] + flip[i])/2.; + } +} + +int get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets) +{ + int i,j,n,z; + float *predictions = l.output; + if (l.batch == 2) avg_flipped_region(l); + int count = 0; for (i = 0; i < l.w*l.h; ++i){ int row = i / l.w; int col = i % l.w; for(n = 0; n < l.n; ++n){ - int index = n*l.w*l.h + i; - for (j = 0; j < l.classes; ++j) { - dets[index].prob[j] = 0; - } int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); + if(predictions[obj_index] <= thresh) continue; + int index = count; + ++count; int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); int mask_index = entry_index(l, 0, n*l.w*l.h + i, 4); + for (j = 0; j < l.classes; ++j) { + dets[index].prob[j] = 0; + } float scale = l.background ? 1 : predictions[obj_index]; dets[index].bbox = get_region_box(predictions, l.biases, l.mask[n], box_index, col, row, l.w, l.h, netw, neth, l.w*l.h); dets[index].objectness = scale > thresh ? scale : 0; @@ -485,7 +510,8 @@ void get_region_detections(layer l, int w, int h, int netw, int neth, float thre } } } - correct_region_boxes(dets, l.w*l.h*l.n, w, h, netw, neth, relative); + correct_region_boxes(dets, count, w, h, netw, neth, relative); + return count; } #ifdef GPU diff --git a/src/region_layer.h b/src/region_layer.h index 5aafe249a4c..a455ebf7f76 100644 --- a/src/region_layer.h +++ b/src/region_layer.h @@ -9,6 +9,7 @@ layer make_region_layer(int batch, int h, int w, int n, int total, int *mask, in void forward_region_layer(const layer l, network net); void backward_region_layer(const layer l, network net); void resize_region_layer(layer *l, int w, int h); +int region_num_detections(layer l, float thresh); #ifdef GPU void forward_region_layer_gpu(const layer l, network net); From e31c50127e3d364b0b14b5a36a12ffa1a2046f44 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 15 Mar 2018 15:40:09 -0700 Subject: [PATCH 068/118] no opencv bad opencv --- Makefile | 2 +- examples/detector.c | 4 ++++ examples/super.c | 1 - 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 48560f9cf15..a0455d060eb 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ GPU=1 CUDNN=1 -OPENCV=1 +OPENCV=0 OPENMP=1 DEBUG=0 diff --git a/examples/detector.c b/examples/detector.c index c7c2c73bee8..ad98291bc3c 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -624,6 +624,7 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip) { +#ifdef OPENCV image **alphabet = load_alphabet(); char *base = basecfg(cfgfile); network *net = load_network(cfgfile, weightfile, 0); @@ -702,10 +703,12 @@ void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_ind free_image(in); } } + #endif } void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip) { +#ifdef OPENCV image **alphabet = load_alphabet(); char *base = basecfg(cfgfile); network *net = load_network(cfgfile, weightfile, 0); @@ -790,6 +793,7 @@ void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_in free_image(in); } } + #endif } /* diff --git a/examples/super.c b/examples/super.c index 79799d055a7..89a8e562892 100644 --- a/examples/super.c +++ b/examples/super.c @@ -94,7 +94,6 @@ void test_super(char *cfgfile, char *weightfile, char *filename) printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); save_image(out, "out"); show_image(out, "out"); - cvWaitKey(0); free_image(im); if (filename) break; From 777b0982322142991e1861161e68e1a01063d76f Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sat, 24 Mar 2018 18:23:04 -0700 Subject: [PATCH 069/118] CLEAN UP CLEAN UP EVERYBODY DO YOUR oh wait it's just me --- Makefile | 6 +- examples/classifier.c | 4 +- examples/coco.c | 17 +- examples/detector.c | 34 +--- examples/lsd.c | 7 +- examples/rnn.c | 4 +- examples/yolo.c | 16 +- include/darknet.h | 5 +- src/demo.c | 4 +- src/network.c | 19 ++- src/option_list.h | 1 - src/parser.c | 72 ++++++-- src/region_layer.c | 336 +++++++++++-------------------------- src/region_layer.h | 3 +- src/yolo_layer.c | 374 ++++++++++++++++++++++++++++++++++++++++++ src/yolo_layer.h | 19 +++ 16 files changed, 602 insertions(+), 319 deletions(-) create mode 100644 src/yolo_layer.c create mode 100644 src/yolo_layer.h diff --git a/Makefile b/Makefile index a0455d060eb..ed0350817e3 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ GPU=1 CUDNN=1 -OPENCV=0 +OPENCV=1 OPENMP=1 DEBUG=0 @@ -26,7 +26,7 @@ ARFLAGS=rcs OPTS=-Ofast LDFLAGS= -lm -pthread COMMON= -Iinclude/ -Isrc/ -CFLAGS=-Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC +CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC ifeq ($(OPENMP), 1) CFLAGS+= -fopenmp @@ -57,7 +57,7 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o yolo_layer.o EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o darknet.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ diff --git a/examples/classifier.c b/examples/classifier.c index e707ebc3755..d118ea58c07 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -51,7 +51,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, if (tree) net->hierarchy = read_tree(tree); int classes = option_find_int(options, "classes", 2); - char **labels; + char **labels = 0; if(!tag){ labels = get_labels(label_list); } @@ -161,7 +161,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, pthread_join(load_thread, 0); free_network(net); - free_ptrs((void**)labels, classes); + if(labels) free_ptrs((void**)labels, classes); free_ptrs((void**)paths, plist->size); free_list(plist); free(base); diff --git a/examples/coco.c b/examples/coco.c index a5a526e57a9..172a474652c 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -146,8 +146,6 @@ void validate_coco(char *cfg, char *weights) FILE *fp = fopen(buff, "w"); fprintf(fp, "[\n"); - detection *dets = make_network_boxes(net, 0); - int m = plist->size; int i=0; int t; @@ -195,9 +193,11 @@ void validate_coco(char *cfg, char *weights) network_predict(net, X); int w = val[t].w; int h = val[t].h; - fill_network_boxes(net, w, h, thresh, 0, 0, 0, dets); + int nboxes = 0; + detection *dets = get_network_boxes(net, w, h, thresh, 0, 0, 0, &nboxes); if (nms) do_nms_sort(dets, l.side*l.side*l.n, classes, iou_thresh); print_cocos(fp, image_id, dets, l.side*l.side*l.n, classes, w, h); + free_detections(dets, nboxes); free_image(val[t]); free_image(val_resized[t]); } @@ -231,7 +231,6 @@ void validate_coco_recall(char *cfgfile, char *weightfile) snprintf(buff, 1024, "%s%s.txt", base, coco_classes[j]); fps[j] = fopen(buff, "w"); } - detection *dets = make_network_boxes(net, 0); int m = plist->size; int i=0; @@ -252,7 +251,8 @@ void validate_coco_recall(char *cfgfile, char *weightfile) char *id = basecfg(path); network_predict(net, sized.data); - fill_network_boxes(net, orig.w, orig.h, thresh, 0, 0, 1, dets); + int nboxes = 0; + detection *dets = get_network_boxes(net, orig.w, orig.h, thresh, 0, 0, 1, &nboxes); if (nms) do_nms_obj(dets, side*side*l.n, 1, nms); char labelpath[4096]; @@ -283,7 +283,7 @@ void validate_coco_recall(char *cfgfile, char *weightfile) ++correct; } } - + free_detections(dets, nboxes); fprintf(stderr, "%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total); free(id); free_image(orig); @@ -302,7 +302,6 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) clock_t time; char buff[256]; char *input = buff; - detection *dets = make_network_boxes(net, 0); while(1){ if(filename){ strncpy(input, filename, 256); @@ -320,12 +319,14 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - fill_network_boxes(net, 1, 1, thresh, 0, 0, 0, dets); + int nboxes = 0; + detection *dets = get_network_boxes(net, im.w, im.h, thresh, 0, 0, 0, &nboxes); if (nms) do_nms_sort(dets, l.side*l.side*l.n, l.classes, nms); draw_detections(im, dets, l.side*l.side*l.n, thresh, coco_classes, alphabet, 80); save_image(im, "prediction"); show_image(im, "predictions"); + free_detections(dets, nboxes); free_image(im); free_image(sized); #ifdef OPENCV diff --git a/examples/detector.c b/examples/detector.c index ad98291bc3c..90e57b80dc8 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -156,7 +156,9 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i static int get_coco_image_id(char *filename) { - char *p = strrchr(filename, '_'); + char *p = strrchr(filename, '/'); + char *c = strrchr(filename, '_'); + if(c) p = c; return atoi(p+1); } @@ -467,6 +469,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out } else { print_detector_detections(fps, id, dets, nboxes, classes, w, h); } + free_detections(dets, nboxes); free(id); free_image(val[t]); free_image(val_resized[t]); @@ -622,14 +625,13 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam } } +/* void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip) { #ifdef OPENCV - image **alphabet = load_alphabet(); char *base = basecfg(cfgfile); network *net = load_network(cfgfile, weightfile, 0); set_batch_network(net, 1); - list *options = read_data_cfg(datacfg); srand(2222222); CvCapture * cap; @@ -650,20 +652,11 @@ void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_ind cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); } - int top = option_find_int(options, "top", 1); - - char *label_list = option_find_str(options, "labels", 0); - char *name_list = option_find_str(options, "names", label_list); - char **names = get_labels(name_list); - - int *indexes = calloc(top, sizeof(int)); - if(!cap) error("Couldn't connect to webcam.\n"); cvNamedWindow(base, CV_WINDOW_NORMAL); cvResizeWindow(base, 512, 512); float fps = 0; int i; - int count = 0; float nms = .45; while(1){ @@ -709,11 +702,9 @@ void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_ind void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip) { #ifdef OPENCV - image **alphabet = load_alphabet(); char *base = basecfg(cfgfile); network *net = load_network(cfgfile, weightfile, 0); set_batch_network(net, 1); - list *options = read_data_cfg(datacfg); srand(2222222); CvCapture * cap; @@ -734,14 +725,6 @@ void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_in cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); } - int top = option_find_int(options, "top", 1); - - char *label_list = option_find_str(options, "labels", 0); - char *name_list = option_find_str(options, "names", label_list); - char **names = get_labels(name_list); - - int *indexes = calloc(top, sizeof(int)); - if(!cap) error("Couldn't connect to webcam.\n"); cvNamedWindow(base, CV_WINDOW_NORMAL); cvResizeWindow(base, 512, 512); @@ -795,6 +778,7 @@ void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_in } #endif } +*/ /* void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, detection *dets) @@ -848,15 +832,13 @@ void run_detector(int argc, char **argv) int width = find_int_arg(argc, argv, "-w", 0); int height = find_int_arg(argc, argv, "-h", 0); int fps = find_int_arg(argc, argv, "-fps", 0); - int class = find_int_arg(argc, argv, "-class", 0); + //int class = find_int_arg(argc, argv, "-class", 0); char *datacfg = argv[3]; char *cfg = argv[4]; char *weights = (argc > 5) ? argv[5] : 0; char *filename = (argc > 6) ? argv[6]: 0; if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen); - else if(0==strcmp(argv[2], "extract")) extract_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip); - else if(0==strcmp(argv[2], "censor")) censor_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip); else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear); else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile); else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile); @@ -868,4 +850,6 @@ void run_detector(int argc, char **argv) char **names = get_labels(name_list); demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, avg, hier_thresh, width, height, fps, fullscreen); } + //else if(0==strcmp(argv[2], "extract")) extract_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip); + //else if(0==strcmp(argv[2], "censor")) censor_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip); } diff --git a/examples/lsd.c b/examples/lsd.c index ad337644ba0..ef46c459b5d 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -1,3 +1,4 @@ +#include #include "darknet.h" /* @@ -478,7 +479,7 @@ void test_dcgan(char *cfgfile, char *weightfile) clock_t time; char buff[256]; char *input = buff; - int i, imlayer = 0; + int imlayer = 0; imlayer = net->n-1; @@ -615,7 +616,7 @@ void train_prog(char *cfg, char *weight, char *acfg, char *aweight, int clear, i forward_network(anet); backward_network(anet); - float genaloss = *anet->cost / anet->batch; + //float genaloss = *anet->cost / anet->batch; scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); scal_gpu(imlayer.outputs*imlayer.batch, 0, gnet->layers[gnet->n-1].delta_gpu, 1); @@ -785,7 +786,7 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, forward_network(anet); backward_network(anet); - float genaloss = *anet->cost / anet->batch; + //float genaloss = *anet->cost / anet->batch; //printf("%f\n", genaloss); scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1); diff --git a/examples/rnn.c b/examples/rnn.c index 489e9829f06..5d49eaae707 100644 --- a/examples/rnn.c +++ b/examples/rnn.c @@ -100,8 +100,8 @@ float_pair get_seq2seq_data(char **source, char **dest, int n, int characters, s float *y = calloc(batch * steps * characters, sizeof(float)); for(i = 0; i < batch; ++i){ int index = rand()%n; - int slen = strlen(source[index]); - int dlen = strlen(dest[index]); + //int slen = strlen(source[index]); + //int dlen = strlen(dest[index]); for(j = 0; j < steps; ++j){ unsigned char curr = source[index][j]; unsigned char next = dest[index][j]; diff --git a/examples/yolo.c b/examples/yolo.c index ef8777c8013..e23d09a0563 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -133,7 +133,6 @@ void validate_yolo(char *cfg, char *weights) image *buf = calloc(nthreads, sizeof(image)); image *buf_resized = calloc(nthreads, sizeof(image)); pthread_t *thr = calloc(nthreads, sizeof(pthread_t)); - detection *dets = make_network_boxes(net, 0); load_args args = {0}; args.w = net->w; @@ -167,9 +166,11 @@ void validate_yolo(char *cfg, char *weights) network_predict(net, X); int w = val[t].w; int h = val[t].h; - fill_network_boxes(net, w, h, thresh, 0, 0, 0, dets); + int nboxes = 0; + detection *dets = get_network_boxes(net, w, h, thresh, 0, 0, 0, &nboxes); if (nms) do_nms_sort(dets, l.side*l.side*l.n, classes, iou_thresh); print_yolo_detections(fps, id, l.side*l.side*l.n, classes, w, h, dets); + free_detections(dets, nboxes); free(id); free_image(val[t]); free_image(val_resized[t]); @@ -200,7 +201,6 @@ void validate_yolo_recall(char *cfg, char *weights) snprintf(buff, 1024, "%s%s.txt", base, voc_names[j]); fps[j] = fopen(buff, "w"); } - detection *dets = make_network_boxes(net, 0); int m = plist->size; int i=0; @@ -221,7 +221,8 @@ void validate_yolo_recall(char *cfg, char *weights) char *id = basecfg(path); network_predict(net, sized.data); - fill_network_boxes(net, orig.w, orig.h, thresh, 0, 0, 1, dets); + int nboxes = 0; + detection *dets = get_network_boxes(net, orig.w, orig.h, thresh, 0, 0, 1, &nboxes); if (nms) do_nms_obj(dets, side*side*l.n, 1, nms); char labelpath[4096]; @@ -254,6 +255,7 @@ void validate_yolo_recall(char *cfg, char *weights) } fprintf(stderr, "%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total); + free_detections(dets, nboxes); free(id); free_image(orig); free_image(sized); @@ -271,7 +273,6 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) char buff[256]; char *input = buff; float nms=.4; - detection *dets = make_network_boxes(net, 0); while(1){ if(filename){ strncpy(input, filename, 256); @@ -289,13 +290,14 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) network_predict(net, X); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - fill_network_boxes(net, 1, 1, thresh, 0, 0, 0, dets); + int nboxes = 0; + detection *dets = get_network_boxes(net, im.w, im.h, thresh, 0, 0, 0, &nboxes); if (nms) do_nms_sort(dets, l.side*l.side*l.n, l.classes, nms); draw_detections(im, dets, l.side*l.side*l.n, thresh, voc_names, alphabet, 20); save_image(im, "predictions"); show_image(im, "predictions"); - + free_detections(dets, nboxes); free_image(im); free_image(sized); #ifdef OPENCV diff --git a/include/darknet.h b/include/darknet.h index 000cef98680..9327ea8ca06 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -85,6 +85,7 @@ typedef enum { NETWORK, XNOR, REGION, + YOLO, REORG, UPSAMPLE, LOGXENT, @@ -674,6 +675,7 @@ void get_detection_detections(layer l, int w, int h, float thresh, detection *de char *option_find_str(list *l, char *key, char *def); int option_find_int(list *l, char *key, int def); +int option_find_int_quiet(list *l, char *key, int def); network *parse_network_cfg(char *filename); void save_weights(network *net, char *filename); @@ -682,7 +684,8 @@ void save_weights_upto(network *net, char *filename, int cutoff); void load_weights_upto(network *net, char *filename, int start, int cutoff); void zero_objectness(layer l); -int get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets); +void get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets); +int get_yolo_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, int relative, detection *dets); void free_network(network *net); void set_batch_network(network *net, int b); void set_temp_network(network *net, float t); diff --git a/src/demo.c b/src/demo.c index 8ed523dfc19..2f1885254ca 100644 --- a/src/demo.c +++ b/src/demo.c @@ -50,7 +50,7 @@ void *detect_in_thread(void *ptr) if(l.type == DETECTION){ get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); } else */ - detection *dets; + detection *dets = 0; int nboxes = 0; if (l.type == REGION){ dets = get_network_boxes(net, buff[0].w, buff[0].h, demo_thresh, demo_hier, 0, 1, &nboxes); @@ -174,8 +174,6 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(!cap) error("Couldn't connect to webcam.\n"); - int i; - buff[0] = get_image_from_stream(cap); buff[1] = copy_image(buff[0]); buff[2] = copy_image(buff[0]); diff --git a/src/network.c b/src/network.c index 656071fcaaa..aaab7997b5e 100644 --- a/src/network.c +++ b/src/network.c @@ -17,6 +17,7 @@ #include "activation_layer.h" #include "detection_layer.h" #include "region_layer.h" +#include "yolo_layer.h" #include "normalization_layer.h" #include "batchnorm_layer.h" #include "maxpool_layer.h" @@ -151,6 +152,8 @@ char *get_layer_string(LAYER_TYPE a) return "detection"; case REGION: return "region"; + case YOLO: + return "yolo"; case DROPOUT: return "dropout"; case CROP: @@ -376,6 +379,8 @@ int resize_network(network *net, int w, int h) resize_maxpool_layer(&l, w, h); }else if(l.type == REGION){ resize_region_layer(&l, w, h); + }else if(l.type == YOLO){ + resize_yolo_layer(&l, w, h); }else if(l.type == ROUTE){ resize_route_layer(&l, net); }else if(l.type == SHORTCUT){ @@ -508,10 +513,10 @@ int num_detections(network *net, float thresh) int s = 0; for(i = 0; i < net->n; ++i){ layer l = net->layers[i]; - if(l.type == REGION){ - s += region_num_detections(l, thresh); + if(l.type == YOLO){ + s += yolo_num_detections(l, thresh); } - if(l.type == DETECTION){ + if(l.type == DETECTION || l.type == REGION){ s += l.w*l.h*l.n; } } @@ -539,10 +544,14 @@ void fill_network_boxes(network *net, int w, int h, float thresh, float hier, in int j; for(j = 0; j < net->n; ++j){ layer l = net->layers[j]; - if(l.type == REGION){ - int count = get_region_detections(l, w, h, net->w, net->h, thresh, map, hier, relative, dets); + if(l.type == YOLO){ + int count = get_yolo_detections(l, w, h, net->w, net->h, thresh, map, relative, dets); dets += count; } + if(l.type == REGION){ + get_region_detections(l, w, h, net->w, net->h, thresh, map, hier, relative, dets); + dets += l.w*l.h*l.n; + } if(l.type == DETECTION){ get_detection_detections(l, w, h, thresh, dets); dets += l.w*l.h*l.n; diff --git a/src/option_list.h b/src/option_list.h index 3b8b7da11e2..844bd8724b7 100644 --- a/src/option_list.h +++ b/src/option_list.h @@ -12,7 +12,6 @@ typedef struct{ int read_option(char *s, list *options); void option_insert(list *l, char *key, char *val); char *option_find(list *l, char *key); -int option_find_int_quiet(list *l, char *key, int def); float option_find_float(list *l, char *key, float def); float option_find_float_quiet(list *l, char *key, float def); void option_unused(list *l); diff --git a/src/parser.c b/src/parser.c index e6dd238006d..8b43f3c540d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -26,6 +26,7 @@ #include "option_list.h" #include "parser.h" #include "region_layer.h" +#include "yolo_layer.h" #include "reorg_layer.h" #include "rnn_layer.h" #include "route_layer.h" @@ -50,6 +51,7 @@ LAYER_TYPE string_to_layer_type(char * type) if (strcmp(type, "[cost]")==0) return COST; if (strcmp(type, "[detection]")==0) return DETECTION; if (strcmp(type, "[region]")==0) return REGION; + if (strcmp(type, "[yolo]")==0) return YOLO; if (strcmp(type, "[local]")==0) return LOCAL; if (strcmp(type, "[conv]")==0 || strcmp(type, "[convolutional]")==0) return CONVOLUTIONAL; @@ -277,15 +279,49 @@ softmax_layer parse_softmax(list *options, size_params params) return layer; } -layer parse_region(list *options, size_params params) +int *parse_yolo_mask(char *a, int *num) +{ + int *mask = 0; + if(a){ + int len = strlen(a); + int n = 1; + int i; + for(i = 0; i < len; ++i){ + if (a[i] == ',') ++n; + } + mask = calloc(n, sizeof(int)); + for(i = 0; i < n; ++i){ + int val = atoi(a); + mask[i] = val; + a = strchr(a, ',')+1; + } + *num = n; + } + return mask; +} + +layer parse_yolo(list *options, size_params params) { - int coords = option_find_int(options, "coords", 4); int classes = option_find_int(options, "classes", 20); int total = option_find_int(options, "num", 1); int num = total; char *a = option_find_str(options, "mask", 0); - int *mask = 0; + int *mask = parse_yolo_mask(a, &num); + layer l = make_yolo_layer(params.batch, params.w, params.h, num, total, mask, classes); + assert(l.outputs == params.inputs); + + l.max_boxes = option_find_int_quiet(options, "max",90); + l.jitter = option_find_float(options, "jitter", .2); + + l.ignore_thresh = option_find_float(options, "ignore_thresh", .5); + l.truth_thresh = option_find_float(options, "truth_thresh", 1); + l.random = option_find_int_quiet(options, "random", 0); + + char *map_file = option_find_str(options, "map", 0); + if (map_file) l.map = read_map(map_file); + + a = option_find_str(options, "anchors", 0); if(a){ int len = strlen(a); int n = 1; @@ -293,15 +329,22 @@ layer parse_region(list *options, size_params params) for(i = 0; i < len; ++i){ if (a[i] == ',') ++n; } - mask = calloc(n, sizeof(int)); for(i = 0; i < n; ++i){ - int val = atoi(a); - mask[i] = val; + float bias = atof(a); + l.biases[i] = bias; a = strchr(a, ',')+1; } - num = n; } - layer l = make_region_layer(params.batch, params.w, params.h, num, total, mask, classes, coords); + return l; +} + +layer parse_region(list *options, size_params params) +{ + int coords = option_find_int(options, "coords", 4); + int classes = option_find_int(options, "classes", 20); + int num = option_find_int(options, "num", 1); + + layer l = make_region_layer(params.batch, params.w, params.h, num, classes, coords); assert(l.outputs == params.inputs); l.log = option_find_int_quiet(options, "log", 0); @@ -309,12 +352,11 @@ layer parse_region(list *options, size_params params) l.softmax = option_find_int(options, "softmax", 0); l.background = option_find_int_quiet(options, "background", 0); - l.max_boxes = option_find_int_quiet(options, "max",90); + l.max_boxes = option_find_int_quiet(options, "max",30); l.jitter = option_find_float(options, "jitter", .2); l.rescore = option_find_int_quiet(options, "rescore",0); - l.ignore_thresh = option_find_float(options, "ignore_thresh", .5); - l.truth_thresh = option_find_float(options, "truth_thresh", 1); + l.thresh = option_find_float(options, "thresh", .5); l.classfix = option_find_int_quiet(options, "classfix", 0); l.absolute = option_find_int_quiet(options, "absolute", 0); l.random = option_find_int_quiet(options, "random", 0); @@ -322,17 +364,16 @@ layer parse_region(list *options, size_params params) l.coord_scale = option_find_float(options, "coord_scale", 1); l.object_scale = option_find_float(options, "object_scale", 1); l.noobject_scale = option_find_float(options, "noobject_scale", 1); - l.mask_scale = option_find_float_quiet(options, "mask_scale", 1); + l.mask_scale = option_find_float(options, "mask_scale", 1); l.class_scale = option_find_float(options, "class_scale", 1); l.bias_match = option_find_int_quiet(options, "bias_match",0); - l.focus = option_find_float_quiet(options, "focus", 0); char *tree_file = option_find_str(options, "tree", 0); if (tree_file) l.softmax_tree = read_tree(tree_file); char *map_file = option_find_str(options, "map", 0); if (map_file) l.map = read_map(map_file); - a = option_find_str(options, "anchors", 0); + char *a = option_find_str(options, "anchors", 0); if(a){ int len = strlen(a); int n = 1; @@ -348,6 +389,7 @@ layer parse_region(list *options, size_params params) } return l; } + detection_layer parse_detection(list *options, size_params params) { int coords = option_find_int(options, "coords", 1); @@ -747,6 +789,8 @@ network *parse_network_cfg(char *filename) l = parse_cost(options, params); }else if(lt == REGION){ l = parse_region(options, params); + }else if(lt == YOLO){ + l = parse_yolo(options, params); }else if(lt == DETECTION){ l = parse_detection(options, params); }else if(lt == SOFTMAX){ diff --git a/src/region_layer.c b/src/region_layer.c index fc2a5b26ebb..179f5e32a60 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -10,14 +10,12 @@ #include #include -layer make_region_layer(int batch, int w, int h, int n, int total, int *mask, int classes, int coords) +layer make_region_layer(int batch, int w, int h, int n, int classes, int coords) { - int i; layer l = {0}; l.type = REGION; l.n = n; - l.total = total; l.batch = batch; l.h = h; l.w = w; @@ -28,21 +26,15 @@ layer make_region_layer(int batch, int w, int h, int n, int total, int *mask, in l.classes = classes; l.coords = coords; l.cost = calloc(1, sizeof(float)); - l.biases = calloc(total*2, sizeof(float)); - if(mask) l.mask = mask; - else{ - l.mask = calloc(n, sizeof(int)); - for(i = 0; i < n; ++i){ - l.mask[i] = i; - } - } + l.biases = calloc(n*2, sizeof(float)); l.bias_updates = calloc(n*2, sizeof(float)); l.outputs = h*w*n*(classes + coords + 1); l.inputs = l.outputs; - l.truths = 90*(l.coords + 1); + l.truths = 30*(l.coords + 1); l.delta = calloc(batch*l.outputs, sizeof(float)); l.output = calloc(batch*l.outputs, sizeof(float)); - for(i = 0; i < total*2; ++i){ + int i; + for(i = 0; i < n*2; ++i){ l.biases[i] = .5; } @@ -81,37 +73,30 @@ void resize_region_layer(layer *l, int w, int h) #endif } -box get_region_box(float *x, float *biases, int n, int index, int i, int j, int lw, int lh, int w, int h, int stride) +box get_region_box(float *x, float *biases, int n, int index, int i, int j, int w, int h, int stride) { box b; - b.x = (i + x[index + 0*stride]) / lw; - b.y = (j + x[index + 1*stride]) / lh; + b.x = (i + x[index + 0*stride]) / w; + b.y = (j + x[index + 1*stride]) / h; b.w = exp(x[index + 2*stride]) * biases[2*n] / w; b.h = exp(x[index + 3*stride]) * biases[2*n+1] / h; return b; } -float delta_region_box(box truth, float *x, float *biases, int n, int index, int i, int j, int lw, int lh, int w, int h, float *delta, float scale, int stride) +float delta_region_box(box truth, float *x, float *biases, int n, int index, int i, int j, int w, int h, float *delta, float scale, int stride) { - box pred = get_region_box(x, biases, n, index, i, j, lw, lh, w, h, stride); + box pred = get_region_box(x, biases, n, index, i, j, w, h, stride); float iou = box_iou(pred, truth); - float tx = (truth.x*lw - i); - float ty = (truth.y*lh - j); + float tx = (truth.x*w - i); + float ty = (truth.y*h - j); float tw = log(truth.w*w / biases[2*n]); float th = log(truth.h*h / biases[2*n + 1]); - //printf("%f %f %f %f\n", tx, ty, tw, th); - delta[index + 0*stride] = scale * (tx - x[index + 0*stride]); delta[index + 1*stride] = scale * (ty - x[index + 1*stride]); delta[index + 2*stride] = scale * (tw - x[index + 2*stride]); delta[index + 3*stride] = scale * (th - x[index + 3*stride]); - //printf("x: %f %f\n",tx , x[index + 0*stride]); - //printf("y: %f %f\n",ty , x[index + 1*stride]); - //printf("w: %f %f\n",tw , x[index + 2*stride]); - //printf("h: %f %f\n\n",th , x[index + 3*stride]); - //printf("%f %f %f %f\n", x[index + 0*stride], x[index + 1*stride], x[index + 2*stride], x[index + 3*stride]); return iou; } @@ -124,7 +109,7 @@ void delta_region_mask(float *truth, float *x, int n, int index, float *delta, i } -void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, int stride, float *avg_cat, int tag, float focus) +void delta_region_class(float *output, float *delta, int index, int class, int classes, tree *hier, float scale, int stride, float *avg_cat, int tag) { int i, n; if(hier){ @@ -140,30 +125,15 @@ void delta_region_class(float *output, float *delta, int index, int class, int c class = hier->parent[class]; } - if(avg_cat) *avg_cat += pred; + *avg_cat += pred; } else { if (delta[index] && tag){ - if(focus){ - float y = -1; - float p = output[index + stride*class]; - float lg = p > .0000000001 ? log(p) : -10; - delta[index + stride*class] = y * pow(1-p, focus) * (focus*p*lg + p - 1); - }else{ - delta[index + stride*class] = scale * (1 - output[index + stride*class]); - if(avg_cat) *avg_cat += output[index + stride*class]; - } + delta[index + stride*class] = scale * (1 - output[index + stride*class]); return; } for(n = 0; n < classes; ++n){ - if(focus){ - float y = (n == class) ? -1 : 1; - float p = (n == class) ? output[index + stride*n] : 1 - output[index + stride*n]; - float lg = p > .0000000001 ? log(p) : -10; - delta[index + stride*n] = y * pow(1-p, focus) * (focus*p*lg + p - 1); - }else{ - delta[index + stride*n] = scale * (((n == class)?1 : 0) - output[index + stride*n]); - } - if(n == class && avg_cat) *avg_cat += output[index + stride*n]; + delta[index + stride*n] = scale * (((n == class)?1 : 0) - output[index + stride*n]); + if(n == class) *avg_cat += output[index + stride*n]; } } } @@ -219,7 +189,6 @@ void forward_region_layer(const layer l, network net) if(!net.train) return; float avg_iou = 0; float recall = 0; - float recall75 = 0; float avg_cat = 0; float avg_obj = 0; float avg_anyobj = 0; @@ -229,7 +198,7 @@ void forward_region_layer(const layer l, network net) for (b = 0; b < l.batch; ++b) { if(l.softmax_tree){ int onlyclass = 0; - for(t = 0; t < l.max_boxes; ++t){ + for(t = 0; t < 30; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; @@ -249,7 +218,7 @@ void forward_region_layer(const layer l, network net) } int class_index = entry_index(l, b, maxi, l.coords + 1); int obj_index = entry_index(l, b, maxi, l.coords); - delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax, l.focus); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax); if(l.output[obj_index] < .3) l.delta[obj_index] = l.object_scale * (.3 - l.output[obj_index]); else l.delta[obj_index] = 0; l.delta[obj_index] = 0; @@ -264,50 +233,36 @@ void forward_region_layer(const layer l, network net) for (i = 0; i < l.w; ++i) { for (n = 0; n < l.n; ++n) { int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); - box pred = get_region_box(l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.w*l.h); + box pred = get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); float best_iou = 0; - int best_t = 0; - for(t = 0; t < l.max_boxes; ++t){ + for(t = 0; t < 30; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; float iou = box_iou(pred, truth); if (iou > best_iou) { best_iou = iou; - best_t = t; } } int obj_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, l.coords); avg_anyobj += l.output[obj_index]; l.delta[obj_index] = l.noobject_scale * (0 - l.output[obj_index]); if(l.background) l.delta[obj_index] = l.noobject_scale * (1 - l.output[obj_index]); - if (best_iou > l.ignore_thresh) { + if (best_iou > l.thresh) { l.delta[obj_index] = 0; } - if (best_iou > l.truth_thresh) { - l.delta[obj_index] = l.object_scale * (1 - l.output[obj_index]); - - int class = net.truth[best_t*(l.coords + 1) + b*l.truths + l.coords]; - if (l.map) class = l.map[class]; - int class_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, l.coords + 1); - delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, 0, !l.softmax, l.focus); - box truth = float_to_box(net.truth + best_t*(l.coords + 1) + b*l.truths, 1); - delta_region_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.delta, l.coord_scale*(2-truth.w*truth.h), l.w*l.h); - } - /* - if(*(net.seen) < 12800){ - box truth = {0}; - truth.x = (i + .5)/l.w; - truth.y = (j + .5)/l.h; - truth.w = l.biases[2*l.mask[n]]/net.w; - truth.h = l.biases[2*l.mask[n]+1]/net.h; - delta_region_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.delta, .01, l.w*l.h); - } - */ + if(*(net.seen) < 12800){ + box truth = {0}; + truth.x = (i + .5)/l.w; + truth.y = (j + .5)/l.h; + truth.w = l.biases[2*n]/l.w; + truth.h = l.biases[2*n+1]/l.h; + delta_region_box(truth, l.output, l.biases, n, box_index, i, j, l.w, l.h, l.delta, .01, l.w*l.h); + } } } } - for(t = 0; t < l.max_boxes; ++t){ + for(t = 0; t < 30; ++t){ box truth = float_to_box(net.truth + t*(l.coords + 1) + b*l.truths, 1); if(!truth.x) break; @@ -315,60 +270,54 @@ void forward_region_layer(const layer l, network net) int best_n = 0; i = (truth.x * l.w); j = (truth.y * l.h); - //printf("%d %f %d %f\n", i, truth.x*l.w, j, truth.y*l.h); box truth_shift = truth; truth_shift.x = 0; truth_shift.y = 0; - //printf("index %d %d\n",i, j); - for(n = 0; n < l.total; ++n){ - box pred = {0}; - pred.w = l.biases[2*n]/net.w; - pred.h = l.biases[2*n+1]/net.h; - //printf("pred: (%f, %f) %f x %f\n", pred.x, pred.y, pred.w, pred.h); + for(n = 0; n < l.n; ++n){ + int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); + box pred = get_region_box(l.output, l.biases, n, box_index, i, j, l.w, l.h, l.w*l.h); + if(l.bias_match){ + pred.w = l.biases[2*n]/l.w; + pred.h = l.biases[2*n+1]/l.h; + } + pred.x = 0; + pred.y = 0; float iou = box_iou(pred, truth_shift); if (iou > best_iou){ best_iou = iou; best_n = n; } } - //printf("%d %f (%f, %f) %f x %f\n", best_n, best_iou, truth.x, truth.y, truth.w, truth.h); - - int mask_n = int_index(l.mask, best_n, l.n); - //printf("%d %d\n", best_n, mask_n); - if(mask_n >= 0){ - int box_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 0); - float iou = delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, net.w, net.h, l.delta, l.coord_scale*(2-truth.w*truth.h), l.w*l.h); - if(l.coords > 4){ - int mask_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4); - delta_region_mask(net.truth + t*(l.coords + 1) + b*l.truths + 5, l.output, l.coords - 4, mask_index, l.delta, l.w*l.h, l.mask_scale); - } - if(iou > .5) recall += 1; - if(iou > .75) recall75 += 1; - avg_iou += iou; - - //l.delta[best_index + 4] = iou - l.output[best_index + 4]; - int obj_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, l.coords); - avg_obj += l.output[obj_index]; - l.delta[obj_index] = l.object_scale * (1 - l.output[obj_index]); - if (l.rescore) { - l.delta[obj_index] = l.object_scale * (iou - l.output[obj_index]); - } - if(l.background){ - l.delta[obj_index] = l.object_scale * (0 - l.output[obj_index]); - } - int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; - if (l.map) class = l.map[class]; - int class_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, l.coords + 1); - delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax, l.focus); - ++count; - ++class_count; + int box_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 0); + float iou = delta_region_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, l.delta, l.coord_scale * (2 - truth.w*truth.h), l.w*l.h); + if(l.coords > 4){ + int mask_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, 4); + delta_region_mask(net.truth + t*(l.coords + 1) + b*l.truths + 5, l.output, l.coords - 4, mask_index, l.delta, l.w*l.h, l.mask_scale); + } + if(iou > .5) recall += 1; + avg_iou += iou; + + int obj_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, l.coords); + avg_obj += l.output[obj_index]; + l.delta[obj_index] = l.object_scale * (1 - l.output[obj_index]); + if (l.rescore) { + l.delta[obj_index] = l.object_scale * (iou - l.output[obj_index]); } + if(l.background){ + l.delta[obj_index] = l.object_scale * (0 - l.output[obj_index]); + } + + int class = net.truth[t*(l.coords + 1) + b*l.truths + l.coords]; + if (l.map) class = l.map[class]; + int class_index = entry_index(l, b, best_n*l.w*l.h + j*l.w + i, l.coords + 1); + delta_region_class(l.output, l.delta, class_index, class, l.classes, l.softmax_tree, l.class_scale, l.w*l.h, &avg_cat, !l.softmax); + ++count; + ++class_count; } } - //printf("\n"); *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2); - printf("Region %d Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, .5R: %f, .75R: %f, count: %d\n", net.index, avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, recall75/count, count); + printf("Region Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\n", avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, count); } void backward_region_layer(const layer l, network net) @@ -412,73 +361,47 @@ void correct_region_boxes(detection *dets, int n, int w, int h, int netw, int ne } } -int region_num_detections(layer l, float thresh) -{ - int i, n; - int count = 0; - for (i = 0; i < l.w*l.h; ++i){ - int row = i / l.w; - int col = i % l.w; - for(n = 0; n < l.n; ++n){ - int index = n*l.w*l.h + i; - int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); - if(l.output[obj_index] > thresh){ - ++count; - } - } - } - return count; -} - -void avg_flipped_region(layer l) +void get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets) { int i,j,n,z; - float *flip = l.output + l.outputs; - for (j = 0; j < l.h; ++j) { - for (i = 0; i < l.w/2; ++i) { - for (n = 0; n < l.n; ++n) { - for(z = 0; z < l.classes + l.coords + 1; ++z){ - int i1 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + i; - int i2 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + (l.w - i - 1); - float swap = flip[i1]; - flip[i1] = flip[i2]; - flip[i2] = swap; - if(z == 0){ - flip[i1] = -flip[i1]; - flip[i2] = -flip[i2]; + float *predictions = l.output; + if (l.batch == 2) { + float *flip = l.output + l.outputs; + for (j = 0; j < l.h; ++j) { + for (i = 0; i < l.w/2; ++i) { + for (n = 0; n < l.n; ++n) { + for(z = 0; z < l.classes + l.coords + 1; ++z){ + int i1 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + i; + int i2 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + (l.w - i - 1); + float swap = flip[i1]; + flip[i1] = flip[i2]; + flip[i2] = swap; + if(z == 0){ + flip[i1] = -flip[i1]; + flip[i2] = -flip[i2]; + } } } } } + for(i = 0; i < l.outputs; ++i){ + l.output[i] = (l.output[i] + flip[i])/2.; + } } - for(i = 0; i < l.outputs; ++i){ - l.output[i] = (l.output[i] + flip[i])/2.; - } -} - -int get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets) -{ - int i,j,n,z; - float *predictions = l.output; - if (l.batch == 2) avg_flipped_region(l); - int count = 0; for (i = 0; i < l.w*l.h; ++i){ int row = i / l.w; int col = i % l.w; for(n = 0; n < l.n; ++n){ + int index = n*l.w*l.h + i; + for(j = 0; j < l.classes; ++j){ + dets[index].prob[j] = 0; + } int obj_index = entry_index(l, 0, n*l.w*l.h + i, l.coords); - if(predictions[obj_index] <= thresh) continue; - int index = count; - ++count; int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); int mask_index = entry_index(l, 0, n*l.w*l.h + i, 4); - for (j = 0; j < l.classes; ++j) { - dets[index].prob[j] = 0; - } float scale = l.background ? 1 : predictions[obj_index]; - dets[index].bbox = get_region_box(predictions, l.biases, l.mask[n], box_index, col, row, l.w, l.h, netw, neth, l.w*l.h); + dets[index].bbox = get_region_box(predictions, l.biases, n, box_index, col, row, l.w, l.h, l.w*l.h); dets[index].objectness = scale > thresh ? scale : 0; - dets[index].classes = l.classes; if(dets[index].mask){ for(j = 0; j < l.coords - 4; ++j){ dets[index].mask[j] = l.output[mask_index + j*l.w*l.h]; @@ -510,8 +433,7 @@ int get_region_detections(layer l, int w, int h, int netw, int neth, float thres } } } - correct_region_boxes(dets, count, w, h, netw, neth, relative); - return count; + correct_region_boxes(dets, l.w*l.h*l.n, w, h, netw, neth, relative); } #ifdef GPU @@ -537,80 +459,8 @@ void forward_region_layer_gpu(const layer l, network net) if (l.softmax_tree){ int index = entry_index(l, 0, 0, l.coords + 1); softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); - /* - int mmin = 9000; - int mmax = 0; - int i; - for(i = 0; i < l.softmax_tree->groups; ++i){ - int group_size = l.softmax_tree->group_size[i]; - if (group_size < mmin) mmin = group_size; - if (group_size > mmax) mmax = group_size; - } - //printf("%d %d %d \n", l.softmax_tree->groups, mmin, mmax); - */ - /* - // TIMING CODE - int zz; - int number = 1000; - int count = 0; - int i; - for (i = 0; i < l.softmax_tree->groups; ++i) { - int group_size = l.softmax_tree->group_size[i]; - count += group_size; - } - printf("%d %d\n", l.softmax_tree->groups, count); - { - double then = what_time_is_it_now(); - for(zz = 0; zz < number; ++zz){ - int index = entry_index(l, 0, 0, 5); - softmax_tree(net.input_gpu + index, l.w*l.h, l.batch*l.n, l.inputs/l.n, 1, l.output_gpu + index, *l.softmax_tree); - } - cudaDeviceSynchronize(); - printf("Good GPU Timing: %f\n", what_time_is_it_now() - then); - } - { - double then = what_time_is_it_now(); - for(zz = 0; zz < number; ++zz){ - int i; - int count = 5; - for (i = 0; i < l.softmax_tree->groups; ++i) { - int group_size = l.softmax_tree->group_size[i]; - int index = entry_index(l, 0, 0, count); - softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); - count += group_size; - } - } - cudaDeviceSynchronize(); - printf("Bad GPU Timing: %f\n", what_time_is_it_now() - then); - } - { - double then = what_time_is_it_now(); - for(zz = 0; zz < number; ++zz){ - int i; - int count = 5; - for (i = 0; i < l.softmax_tree->groups; ++i) { - int group_size = l.softmax_tree->group_size[i]; - softmax_cpu(net.input + count, group_size, l.batch, l.inputs, l.n*l.w*l.h, 1, l.n*l.w*l.h, l.temperature, l.output + count); - count += group_size; - } - } - cudaDeviceSynchronize(); - printf("CPU Timing: %f\n", what_time_is_it_now() - then); - } - */ - /* - int i; - int count = 5; - for (i = 0; i < l.softmax_tree->groups; ++i) { - int group_size = l.softmax_tree->group_size[i]; - int index = entry_index(l, 0, 0, count); - softmax_gpu(net.input_gpu + index, group_size, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); - count += group_size; - } - */ } else if (l.softmax) { int index = entry_index(l, 0, 0, l.coords + !l.background); - //printf("%d\n", index); softmax_gpu(net.input_gpu + index, l.classes + l.background, l.batch*l.n, l.inputs/l.n, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu + index); } if(!net.train || l.onlyforward){ @@ -631,13 +481,13 @@ void backward_region_layer_gpu(const layer l, network net) for (b = 0; b < l.batch; ++b){ for(n = 0; n < l.n; ++n){ int index = entry_index(l, b, n*l.w*l.h, 0); - //gradient_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); + gradient_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC, l.delta_gpu + index); if(l.coords > 4){ index = entry_index(l, b, n*l.w*l.h, 4); gradient_array_gpu(l.output_gpu + index, (l.coords - 4)*l.w*l.h, LOGISTIC, l.delta_gpu + index); } index = entry_index(l, b, n*l.w*l.h, l.coords); - //if(!l.background) gradient_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); + if(!l.background) gradient_array_gpu(l.output_gpu + index, l.w*l.h, LOGISTIC, l.delta_gpu + index); } } axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); diff --git a/src/region_layer.h b/src/region_layer.h index a455ebf7f76..9f12fd187fd 100644 --- a/src/region_layer.h +++ b/src/region_layer.h @@ -5,11 +5,10 @@ #include "layer.h" #include "network.h" -layer make_region_layer(int batch, int h, int w, int n, int total, int *mask, int classes, int coords); +layer make_region_layer(int batch, int w, int h, int n, int classes, int coords); void forward_region_layer(const layer l, network net); void backward_region_layer(const layer l, network net); void resize_region_layer(layer *l, int w, int h); -int region_num_detections(layer l, float thresh); #ifdef GPU void forward_region_layer_gpu(const layer l, network net); diff --git a/src/yolo_layer.c b/src/yolo_layer.c new file mode 100644 index 00000000000..af714d46a3d --- /dev/null +++ b/src/yolo_layer.c @@ -0,0 +1,374 @@ +#include "yolo_layer.h" +#include "activations.h" +#include "blas.h" +#include "box.h" +#include "cuda.h" +#include "utils.h" + +#include +#include +#include +#include + +layer make_yolo_layer(int batch, int w, int h, int n, int total, int *mask, int classes) +{ + int i; + layer l = {0}; + l.type = YOLO; + + l.n = n; + l.total = total; + l.batch = batch; + l.h = h; + l.w = w; + l.c = n*(classes + 4 + 1); + l.out_w = l.w; + l.out_h = l.h; + l.out_c = l.c; + l.classes = classes; + l.cost = calloc(1, sizeof(float)); + l.biases = calloc(total*2, sizeof(float)); + if(mask) l.mask = mask; + else{ + l.mask = calloc(n, sizeof(int)); + for(i = 0; i < n; ++i){ + l.mask[i] = i; + } + } + l.bias_updates = calloc(n*2, sizeof(float)); + l.outputs = h*w*n*(classes + 4 + 1); + l.inputs = l.outputs; + l.truths = 90*(4 + 1); + l.delta = calloc(batch*l.outputs, sizeof(float)); + l.output = calloc(batch*l.outputs, sizeof(float)); + for(i = 0; i < total*2; ++i){ + l.biases[i] = .5; + } + + l.forward = forward_yolo_layer; + l.backward = backward_yolo_layer; +#ifdef GPU + l.forward_gpu = forward_yolo_layer_gpu; + l.backward_gpu = backward_yolo_layer_gpu; + l.output_gpu = cuda_make_array(l.output, batch*l.outputs); + l.delta_gpu = cuda_make_array(l.delta, batch*l.outputs); +#endif + + fprintf(stderr, "detection\n"); + srand(0); + + return l; +} + +void resize_yolo_layer(layer *l, int w, int h) +{ + l->w = w; + l->h = h; + + l->outputs = h*w*l->n*(l->classes + 4 + 1); + l->inputs = l->outputs; + + l->output = realloc(l->output, l->batch*l->outputs*sizeof(float)); + l->delta = realloc(l->delta, l->batch*l->outputs*sizeof(float)); + +#ifdef GPU + cuda_free(l->delta_gpu); + cuda_free(l->output_gpu); + + l->delta_gpu = cuda_make_array(l->delta, l->batch*l->outputs); + l->output_gpu = cuda_make_array(l->output, l->batch*l->outputs); +#endif +} + +box get_yolo_box(float *x, float *biases, int n, int index, int i, int j, int lw, int lh, int w, int h, int stride) +{ + box b; + b.x = (i + x[index + 0*stride]) / lw; + b.y = (j + x[index + 1*stride]) / lh; + b.w = exp(x[index + 2*stride]) * biases[2*n] / w; + b.h = exp(x[index + 3*stride]) * biases[2*n+1] / h; + return b; +} + +float delta_yolo_box(box truth, float *x, float *biases, int n, int index, int i, int j, int lw, int lh, int w, int h, float *delta, float scale, int stride) +{ + box pred = get_yolo_box(x, biases, n, index, i, j, lw, lh, w, h, stride); + float iou = box_iou(pred, truth); + + float tx = (truth.x*lw - i); + float ty = (truth.y*lh - j); + float tw = log(truth.w*w / biases[2*n]); + float th = log(truth.h*h / biases[2*n + 1]); + + delta[index + 0*stride] = scale * (tx - x[index + 0*stride]); + delta[index + 1*stride] = scale * (ty - x[index + 1*stride]); + delta[index + 2*stride] = scale * (tw - x[index + 2*stride]); + delta[index + 3*stride] = scale * (th - x[index + 3*stride]); + return iou; +} + + +void delta_yolo_class(float *output, float *delta, int index, int class, int classes, int stride, float *avg_cat) +{ + int n; + if (delta[index]){ + delta[index + stride*class] = 1 - output[index + stride*class]; + if(avg_cat) *avg_cat += output[index + stride*class]; + return; + } + for(n = 0; n < classes; ++n){ + delta[index + stride*n] = ((n == class)?1 : 0) - output[index + stride*n]; + if(n == class && avg_cat) *avg_cat += output[index + stride*n]; + } +} + +static int entry_index(layer l, int batch, int location, int entry) +{ + int n = location / (l.w*l.h); + int loc = location % (l.w*l.h); + return batch*l.outputs + n*l.w*l.h*(4+l.classes+1) + entry*l.w*l.h + loc; +} + +void forward_yolo_layer(const layer l, network net) +{ + int i,j,b,t,n; + memcpy(l.output, net.input, l.outputs*l.batch*sizeof(float)); + +#ifndef GPU + for (b = 0; b < l.batch; ++b){ + for(n = 0; n < l.n; ++n){ + int index = entry_index(l, b, n*l.w*l.h, 0); + activate_array(l.output + index, 2*l.w*l.h, LOGISTIC); + index = entry_index(l, b, n*l.w*l.h, 4); + activate_array(l.output + index, (1+l.classes)*l.w*l.h, LOGISTIC); + } + } +#endif + + memset(l.delta, 0, l.outputs * l.batch * sizeof(float)); + if(!net.train) return; + float avg_iou = 0; + float recall = 0; + float recall75 = 0; + float avg_cat = 0; + float avg_obj = 0; + float avg_anyobj = 0; + int count = 0; + int class_count = 0; + *(l.cost) = 0; + for (b = 0; b < l.batch; ++b) { + for (j = 0; j < l.h; ++j) { + for (i = 0; i < l.w; ++i) { + for (n = 0; n < l.n; ++n) { + int box_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 0); + box pred = get_yolo_box(l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.w*l.h); + float best_iou = 0; + int best_t = 0; + for(t = 0; t < l.max_boxes; ++t){ + box truth = float_to_box(net.truth + t*(4 + 1) + b*l.truths, 1); + if(!truth.x) break; + float iou = box_iou(pred, truth); + if (iou > best_iou) { + best_iou = iou; + best_t = t; + } + } + int obj_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 4); + avg_anyobj += l.output[obj_index]; + l.delta[obj_index] = 0 - l.output[obj_index]; + if (best_iou > l.ignore_thresh) { + l.delta[obj_index] = 0; + } + if (best_iou > l.truth_thresh) { + l.delta[obj_index] = 1 - l.output[obj_index]; + + int class = net.truth[best_t*(4 + 1) + b*l.truths + 4]; + if (l.map) class = l.map[class]; + int class_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 4 + 1); + delta_yolo_class(l.output, l.delta, class_index, class, l.classes, l.w*l.h, 0); + box truth = float_to_box(net.truth + best_t*(4 + 1) + b*l.truths, 1); + delta_yolo_box(truth, l.output, l.biases, l.mask[n], box_index, i, j, l.w, l.h, net.w, net.h, l.delta, (2-truth.w*truth.h), l.w*l.h); + } + } + } + } + for(t = 0; t < l.max_boxes; ++t){ + box truth = float_to_box(net.truth + t*(4 + 1) + b*l.truths, 1); + + if(!truth.x) break; + float best_iou = 0; + int best_n = 0; + i = (truth.x * l.w); + j = (truth.y * l.h); + box truth_shift = truth; + truth_shift.x = truth_shift.y = 0; + for(n = 0; n < l.total; ++n){ + box pred = {0}; + pred.w = l.biases[2*n]/net.w; + pred.h = l.biases[2*n+1]/net.h; + float iou = box_iou(pred, truth_shift); + if (iou > best_iou){ + best_iou = iou; + best_n = n; + } + } + + int mask_n = int_index(l.mask, best_n, l.n); + if(mask_n >= 0){ + int box_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 0); + float iou = delta_yolo_box(truth, l.output, l.biases, best_n, box_index, i, j, l.w, l.h, net.w, net.h, l.delta, (2-truth.w*truth.h), l.w*l.h); + + int obj_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4); + avg_obj += l.output[obj_index]; + l.delta[obj_index] = 1 - l.output[obj_index]; + + int class = net.truth[t*(4 + 1) + b*l.truths + 4]; + if (l.map) class = l.map[class]; + int class_index = entry_index(l, b, mask_n*l.w*l.h + j*l.w + i, 4 + 1); + delta_yolo_class(l.output, l.delta, class_index, class, l.classes, l.w*l.h, &avg_cat); + + ++count; + ++class_count; + if(iou > .5) recall += 1; + if(iou > .75) recall75 += 1; + avg_iou += iou; + } + } + } + *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2); + printf("Region %d Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, .5R: %f, .75R: %f, count: %d\n", net.index, avg_iou/count, avg_cat/class_count, avg_obj/count, avg_anyobj/(l.w*l.h*l.n*l.batch), recall/count, recall75/count, count); +} + +void backward_yolo_layer(const layer l, network net) +{ + axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, net.delta, 1); +} + +void correct_yolo_boxes(detection *dets, int n, int w, int h, int netw, int neth, int relative) +{ + int i; + int new_w=0; + int new_h=0; + if (((float)netw/w) < ((float)neth/h)) { + new_w = netw; + new_h = (h * netw)/w; + } else { + new_h = neth; + new_w = (w * neth)/h; + } + for (i = 0; i < n; ++i){ + box b = dets[i].bbox; + b.x = (b.x - (netw - new_w)/2./netw) / ((float)new_w/netw); + b.y = (b.y - (neth - new_h)/2./neth) / ((float)new_h/neth); + b.w *= (float)netw/new_w; + b.h *= (float)neth/new_h; + if(!relative){ + b.x *= w; + b.w *= w; + b.y *= h; + b.h *= h; + } + dets[i].bbox = b; + } +} + +int yolo_num_detections(layer l, float thresh) +{ + int i, n; + int count = 0; + for (i = 0; i < l.w*l.h; ++i){ + for(n = 0; n < l.n; ++n){ + int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4); + if(l.output[obj_index] > thresh){ + ++count; + } + } + } + return count; +} + +void avg_flipped_yolo(layer l) +{ + int i,j,n,z; + float *flip = l.output + l.outputs; + for (j = 0; j < l.h; ++j) { + for (i = 0; i < l.w/2; ++i) { + for (n = 0; n < l.n; ++n) { + for(z = 0; z < l.classes + 4 + 1; ++z){ + int i1 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + i; + int i2 = z*l.w*l.h*l.n + n*l.w*l.h + j*l.w + (l.w - i - 1); + float swap = flip[i1]; + flip[i1] = flip[i2]; + flip[i2] = swap; + if(z == 0){ + flip[i1] = -flip[i1]; + flip[i2] = -flip[i2]; + } + } + } + } + } + for(i = 0; i < l.outputs; ++i){ + l.output[i] = (l.output[i] + flip[i])/2.; + } +} + +int get_yolo_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, int relative, detection *dets) +{ + int i,j,n; + float *predictions = l.output; + if (l.batch == 2) avg_flipped_yolo(l); + int count = 0; + for (i = 0; i < l.w*l.h; ++i){ + int row = i / l.w; + int col = i % l.w; + for(n = 0; n < l.n; ++n){ + int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4); + float objectness = predictions[obj_index]; + if(objectness <= thresh) continue; + int box_index = entry_index(l, 0, n*l.w*l.h + i, 0); + dets[count].bbox = get_yolo_box(predictions, l.biases, l.mask[n], box_index, col, row, l.w, l.h, netw, neth, l.w*l.h); + dets[count].objectness = objectness; + dets[count].classes = l.classes; + for(j = 0; j < l.classes; ++j){ + int class_index = entry_index(l, 0, n*l.w*l.h + i, 4 + 1 + j); + float prob = objectness*predictions[class_index]; + dets[count].prob[j] = (prob > thresh) ? prob : 0; + } + ++count; + } + } + correct_yolo_boxes(dets, count, w, h, netw, neth, relative); + return count; +} + +#ifdef GPU + +void forward_yolo_layer_gpu(const layer l, network net) +{ + copy_gpu(l.batch*l.inputs, net.input_gpu, 1, l.output_gpu, 1); + int b, n; + for (b = 0; b < l.batch; ++b){ + for(n = 0; n < l.n; ++n){ + int index = entry_index(l, b, n*l.w*l.h, 0); + activate_array_gpu(l.output_gpu + index, 2*l.w*l.h, LOGISTIC); + index = entry_index(l, b, n*l.w*l.h, 4); + activate_array_gpu(l.output_gpu + index, (1+l.classes)*l.w*l.h, LOGISTIC); + } + } + if(!net.train || l.onlyforward){ + cuda_pull_array(l.output_gpu, l.output, l.batch*l.outputs); + return; + } + + cuda_pull_array(l.output_gpu, net.input, l.batch*l.inputs); + forward_yolo_layer(l, net); + cuda_push_array(l.delta_gpu, l.delta, l.batch*l.outputs); +} + +void backward_yolo_layer_gpu(const layer l, network net) +{ + axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); +} +#endif + diff --git a/src/yolo_layer.h b/src/yolo_layer.h new file mode 100644 index 00000000000..d2a02432681 --- /dev/null +++ b/src/yolo_layer.h @@ -0,0 +1,19 @@ +#ifndef YOLO_LAYER_H +#define YOLO_LAYER_H + +#include "darknet.h" +#include "layer.h" +#include "network.h" + +layer make_yolo_layer(int batch, int w, int h, int n, int total, int *mask, int classes); +void forward_yolo_layer(const layer l, network net); +void backward_yolo_layer(const layer l, network net); +void resize_yolo_layer(layer *l, int w, int h); +int yolo_num_detections(layer l, float thresh); + +#ifdef GPU +void forward_yolo_layer_gpu(const layer l, network net); +void backward_yolo_layer_gpu(layer l, network net); +#endif + +#endif From e84933bfdd7315736c442a41d9aed163843dda54 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 25 Mar 2018 00:51:26 -0700 Subject: [PATCH 070/118] YOLOv3 WOOOO!!!!!!! --- Makefile | 8 +- cfg/yolo-voc.2.0.cfg | 244 ------ cfg/yolo.2.0.cfg | 244 ------ cfg/{yolov1/tiny-yolo.cfg => yolov1-tiny.cfg} | 8 +- cfg/{yolov1/yolo.cfg => yolov1.cfg} | 4 + cfg/yolov1/tiny-coco.cfg | 125 --- cfg/yolov1/xyolo.test.cfg | 143 ---- cfg/yolov1/yolo-coco.cfg | 255 ------ cfg/yolov1/yolo-small.cfg | 239 ------ cfg/yolov1/yolo.train.cfg | 257 ------ cfg/yolov1/yolo2.cfg | 251 ------ ...{tiny-yolo-voc.cfg => yolov2-tiny-voc.cfg} | 8 +- cfg/{tiny-yolo.cfg => yolov2-tiny.cfg} | 6 +- cfg/{yolo-voc.cfg => yolov2-voc.cfg} | 0 cfg/{yolo.cfg => yolov2.cfg} | 14 +- cfg/yolov3.cfg | 789 ++++++++++++++++++ examples/coco.c | 2 +- examples/darknet.c | 2 +- examples/detector.c | 2 +- examples/yolo.c | 2 +- src/detection_layer.c | 1 + 21 files changed, 824 insertions(+), 1780 deletions(-) delete mode 100644 cfg/yolo-voc.2.0.cfg delete mode 100644 cfg/yolo.2.0.cfg rename cfg/{yolov1/tiny-yolo.cfg => yolov1-tiny.cfg} (94%) rename cfg/{yolov1/yolo.cfg => yolov1.cfg} (98%) delete mode 100644 cfg/yolov1/tiny-coco.cfg delete mode 100644 cfg/yolov1/xyolo.test.cfg delete mode 100644 cfg/yolov1/yolo-coco.cfg delete mode 100644 cfg/yolov1/yolo-small.cfg delete mode 100644 cfg/yolov1/yolo.train.cfg delete mode 100644 cfg/yolov1/yolo2.cfg rename cfg/{tiny-yolo-voc.cfg => yolov2-tiny-voc.cfg} (95%) rename cfg/{tiny-yolo.cfg => yolov2-tiny.cfg} (100%) rename cfg/{yolo-voc.cfg => yolov2-voc.cfg} (100%) rename cfg/{yolo.cfg => yolov2.cfg} (93%) create mode 100644 cfg/yolov3.cfg diff --git a/Makefile b/Makefile index ed0350817e3..1f310448802 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -GPU=1 -CUDNN=1 -OPENCV=1 -OPENMP=1 +GPU=0 +CUDNN=0 +OPENCV=0 +OPENMP=0 DEBUG=0 ARCH= -gencode arch=compute_30,code=sm_30 \ diff --git a/cfg/yolo-voc.2.0.cfg b/cfg/yolo-voc.2.0.cfg deleted file mode 100644 index ceb3f2acf0b..00000000000 --- a/cfg/yolo-voc.2.0.cfg +++ /dev/null @@ -1,244 +0,0 @@ -[net] -batch=64 -subdivisions=8 -height=416 -width=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.0001 -max_batches = 45000 -policy=steps -steps=100,25000,35000 -scales=10,.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[route] -layers=-9 - -[reorg] -stride=2 - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=125 -activation=linear - -[region] -anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 -bias_match=1 -classes=20 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=0 diff --git a/cfg/yolo.2.0.cfg b/cfg/yolo.2.0.cfg deleted file mode 100644 index fda339a2b00..00000000000 --- a/cfg/yolo.2.0.cfg +++ /dev/null @@ -1,244 +0,0 @@ -[net] -batch=1 -subdivisions=1 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -max_batches = 120000 -policy=steps -steps=-1,100,80000,100000 -scales=.1,10,.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[route] -layers=-9 - -[reorg] -stride=2 - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=425 -activation=linear - -[region] -anchors = 0.738768,0.874946, 2.42204,2.65704, 4.30971,7.04493, 10.246,4.59428, 12.6868,11.8741 -bias_match=1 -classes=80 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=0 diff --git a/cfg/yolov1/tiny-yolo.cfg b/cfg/yolov1-tiny.cfg similarity index 94% rename from cfg/yolov1/tiny-yolo.cfg rename to cfg/yolov1-tiny.cfg index ac4b34682b9..a5e7b492028 100644 --- a/cfg/yolov1/tiny-yolo.cfg +++ b/cfg/yolov1-tiny.cfg @@ -1,6 +1,10 @@ [net] -batch=64 -subdivisions=2 +# Testing +batch=1 +subdivisions=1 +# Training +# batch=64 +# subdivisions=8 height=448 width=448 channels=3 diff --git a/cfg/yolov1/yolo.cfg b/cfg/yolov1.cfg similarity index 98% rename from cfg/yolov1/yolo.cfg rename to cfg/yolov1.cfg index c4f415c11e0..06cf6e67617 100644 --- a/cfg/yolov1/yolo.cfg +++ b/cfg/yolov1.cfg @@ -1,6 +1,10 @@ [net] +# Testing batch=1 subdivisions=1 +# Training +# batch=64 +# subdivisions=8 height=448 width=448 channels=3 diff --git a/cfg/yolov1/tiny-coco.cfg b/cfg/yolov1/tiny-coco.cfg deleted file mode 100644 index e58c73a8c27..00000000000 --- a/cfg/yolov1/tiny-coco.cfg +++ /dev/null @@ -1,125 +0,0 @@ -[net] -batch=64 -subdivisions=2 -height=448 -width=448 -channels=3 -momentum=0.9 -decay=0.0005 - -hue = .1 -saturation=.75 -exposure=.75 - -learning_rate=0.0005 -policy=steps -steps=200,400,600,800,100000,150000 -scales=2.5,2,2,2,.1,.1 -max_batches = 200000 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[connected] -output= 4655 -activation=linear - -[detection] -classes=80 -coords=4 -rescore=1 -side=7 -num=3 -softmax=0 -sqrt=1 -jitter=.2 - -object_scale=1 -noobject_scale=.5 -class_scale=1 -coord_scale=5 diff --git a/cfg/yolov1/xyolo.test.cfg b/cfg/yolov1/xyolo.test.cfg deleted file mode 100644 index 5f3e6f4d135..00000000000 --- a/cfg/yolov1/xyolo.test.cfg +++ /dev/null @@ -1,143 +0,0 @@ -[net] -batch=1 -subdivisions=1 -height=448 -width=448 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.0001 -policy=steps -steps=20,40,60,80,20000,30000 -scales=5,5,2,2,.1,.1 -max_batches = 40000 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[batchnorm] - -[convolutional] -xnor = 1 -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[batchnorm] - -[convolutional] -xnor = 1 -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[batchnorm] - -[convolutional] -xnor = 1 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[batchnorm] - -[convolutional] -xnor = 1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[batchnorm] - -[convolutional] -xnor = 1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[batchnorm] - -[convolutional] -xnor = 1 -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[batchnorm] - -[convolutional] -xnor = 1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[connected] -output= 1470 -activation=linear - -[detection] -classes=20 -coords=4 -rescore=1 -side=7 -num=2 -softmax=0 -sqrt=1 -jitter=.2 - -object_scale=1 -noobject_scale=.5 -class_scale=1 -coord_scale=5 - diff --git a/cfg/yolov1/yolo-coco.cfg b/cfg/yolov1/yolo-coco.cfg deleted file mode 100644 index ed3f2d6ef36..00000000000 --- a/cfg/yolov1/yolo-coco.cfg +++ /dev/null @@ -1,255 +0,0 @@ -[net] -batch=64 -subdivisions=4 -height=448 -width=448 -channels=3 -momentum=0.9 -decay=0.0005 - -hue = .1 -saturation=.75 -exposure=.75 - -learning_rate=0.0005 -policy=steps -steps=200,400,600,800,100000,150000 -scales=2.5,2,2,2,.1,.1 -max_batches = 200000 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=192 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[local] -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[connected] -output= 4655 -activation=linear - -[detection] -classes=80 -coords=4 -rescore=1 -side=7 -num=3 -softmax=0 -sqrt=1 -jitter=.2 - -object_scale=1 -noobject_scale=.5 -class_scale=1 -coord_scale=5 - diff --git a/cfg/yolov1/yolo-small.cfg b/cfg/yolov1/yolo-small.cfg deleted file mode 100644 index 2a84485b244..00000000000 --- a/cfg/yolov1/yolo-small.cfg +++ /dev/null @@ -1,239 +0,0 @@ -[net] -batch=64 -subdivisions=64 -height=448 -width=448 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.001 -policy=steps -steps=200,400,600,20000,30000 -scales=2.5,2,2,.1,.1 -max_batches = 40000 - -[crop] -crop_width=448 -crop_height=448 -flip=0 -angle=0 -saturation = 1.5 -exposure = 1.5 - -[convolutional] -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -####### - -[convolutional] -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=3 -stride=2 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[connected] -output=512 -activation=leaky - -[connected] -output=4096 -activation=leaky - -[dropout] -probability=.5 - -[connected] -output= 1470 -activation=linear - -[detection] -classes=20 -coords=4 -rescore=1 -side=7 -num=2 -softmax=0 -sqrt=1 -jitter=.2 - -object_scale=1 -noobject_scale=.5 -class_scale=1 -coord_scale=5 - diff --git a/cfg/yolov1/yolo.train.cfg b/cfg/yolov1/yolo.train.cfg deleted file mode 100644 index 01aeb5eee8b..00000000000 --- a/cfg/yolov1/yolo.train.cfg +++ /dev/null @@ -1,257 +0,0 @@ -[net] -batch=64 -subdivisions=4 -height=448 -width=448 -channels=3 -momentum=0.9 -decay=0.0005 -saturation=1.5 -exposure=1.5 -hue=.1 - -learning_rate=0.0005 -policy=steps -steps=200,400,600,20000,30000 -scales=2.5,2,2,.1,.1 -max_batches = 40000 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=192 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[local] -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[dropout] -probability=.5 - -[connected] -output= 1715 -activation=linear - -[detection] -classes=20 -coords=4 -rescore=1 -side=7 -num=3 -softmax=0 -sqrt=1 -jitter=.2 - -object_scale=1 -noobject_scale=.5 -class_scale=1 -coord_scale=5 - diff --git a/cfg/yolov1/yolo2.cfg b/cfg/yolov1/yolo2.cfg deleted file mode 100644 index b46a0d62f62..00000000000 --- a/cfg/yolov1/yolo2.cfg +++ /dev/null @@ -1,251 +0,0 @@ -[net] -batch=1 -subdivisions=1 -height=448 -width=448 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.0005 -policy=steps -steps=200,400,600,20000,30000 -scales=2.5,2,2,.1,.1 -max_batches = 40000 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=192 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[local] -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[connected] -output= 1715 -activation=linear - -[detection] -classes=20 -coords=4 -rescore=1 -side=7 -num=3 -softmax=0 -sqrt=1 -jitter=.2 - -object_scale=1 -noobject_scale=.5 -class_scale=1 -coord_scale=5 - diff --git a/cfg/tiny-yolo-voc.cfg b/cfg/yolov2-tiny-voc.cfg similarity index 95% rename from cfg/tiny-yolo-voc.cfg rename to cfg/yolov2-tiny-voc.cfg index ab2c066a216..c4c127cdd35 100644 --- a/cfg/tiny-yolo-voc.cfg +++ b/cfg/yolov2-tiny-voc.cfg @@ -1,6 +1,10 @@ [net] -batch=64 -subdivisions=8 +# Testing +batch=1 +subdivisions=1 +# Training +# batch=64 +# subdivisions=2 width=416 height=416 channels=3 diff --git a/cfg/tiny-yolo.cfg b/cfg/yolov2-tiny.cfg similarity index 100% rename from cfg/tiny-yolo.cfg rename to cfg/yolov2-tiny.cfg index 37e71356220..6e0c8ea70e7 100644 --- a/cfg/tiny-yolo.cfg +++ b/cfg/yolov2-tiny.cfg @@ -1,10 +1,10 @@ [net] -# Training -# batch=64 -# subdivisions=2 # Testing batch=1 subdivisions=1 +# Training +# batch=64 +# subdivisions=2 width=416 height=416 channels=3 diff --git a/cfg/yolo-voc.cfg b/cfg/yolov2-voc.cfg similarity index 100% rename from cfg/yolo-voc.cfg rename to cfg/yolov2-voc.cfg diff --git a/cfg/yolo.cfg b/cfg/yolov2.cfg similarity index 93% rename from cfg/yolo.cfg rename to cfg/yolov2.cfg index b8a9f683d1c..2a0cd98fbd0 100644 --- a/cfg/yolo.cfg +++ b/cfg/yolov2.cfg @@ -1,12 +1,12 @@ [net] # Testing -# batch=1 -# subdivisions=1 +batch=1 +subdivisions=1 # Training -batch=64 -subdivisions=8 -width=608 -height=608 +# batch=64 +# subdivisions=8 +width=416 +height=416 channels=3 momentum=0.9 decay=0.0005 @@ -239,7 +239,7 @@ activation=linear [region] -anchors = 18.3274,21.6763, 59.9827,66.001, 106.83,175.179, 252.25,112.889, 312.657,293.385 +anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 bias_match=1 classes=80 coords=4 diff --git a/cfg/yolov3.cfg b/cfg/yolov3.cfg new file mode 100644 index 00000000000..5f3ab621302 --- /dev/null +++ b/cfg/yolov3.cfg @@ -0,0 +1,789 @@ +[net] +# Testing +batch=1 +subdivisions=1 +# Training +# batch=64 +# subdivisions=16 +width=416 +height=416 +channels=3 +momentum=0.9 +decay=0.0005 +angle=0 +saturation = 1.5 +exposure = 1.5 +hue=.1 + +learning_rate=0.001 +burn_in=1000 +max_batches = 500200 +policy=steps +steps=400000,450000 +scales=.1,.1 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +# Downsample + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +###################### + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 6,7,8 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .5 +truth_thresh = 1 +random=1 + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 61 + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 3,4,5 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .5 +truth_thresh = 1 +random=1 + + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 36 + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 0,1,2 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .5 +truth_thresh = 1 +random=1 + diff --git a/examples/coco.c b/examples/coco.c index 172a474652c..6b01dcd6564 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -320,7 +320,7 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); int nboxes = 0; - detection *dets = get_network_boxes(net, im.w, im.h, thresh, 0, 0, 0, &nboxes); + detection *dets = get_network_boxes(net, 1, 1, thresh, 0, 0, 0, &nboxes); if (nms) do_nms_sort(dets, l.side*l.side*l.n, l.classes, nms); draw_detections(im, dets, l.side*l.side*l.n, thresh, coco_classes, alphabet, 80); diff --git a/examples/darknet.c b/examples/darknet.c index 9757eb18643..51e04c13949 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -433,7 +433,7 @@ int main(int argc, char **argv) } else if (0 == strcmp(argv[1], "detector")){ run_detector(argc, argv); } else if (0 == strcmp(argv[1], "detect")){ - float thresh = find_float_arg(argc, argv, "-thresh", .24); + float thresh = find_float_arg(argc, argv, "-thresh", .5); char *filename = (argc > 4) ? argv[4]: 0; char *outfile = find_char_arg(argc, argv, "-out", 0); int fullscreen = find_arg(argc, argv, "-fullscreen"); diff --git a/examples/detector.c b/examples/detector.c index 90e57b80dc8..685b8705070 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -794,7 +794,7 @@ void network_detect(network *net, image im, float thresh, float hier_thresh, flo void run_detector(int argc, char **argv) { char *prefix = find_char_arg(argc, argv, "-prefix", 0); - float thresh = find_float_arg(argc, argv, "-thresh", .24); + float thresh = find_float_arg(argc, argv, "-thresh", .5); float hier_thresh = find_float_arg(argc, argv, "-hier", .5); int cam_index = find_int_arg(argc, argv, "-c", 0); int frame_skip = find_int_arg(argc, argv, "-s", 0); diff --git a/examples/yolo.c b/examples/yolo.c index e23d09a0563..aa728163643 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -291,7 +291,7 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); int nboxes = 0; - detection *dets = get_network_boxes(net, im.w, im.h, thresh, 0, 0, 0, &nboxes); + detection *dets = get_network_boxes(net, 1, 1, thresh, 0, 0, 0, &nboxes); if (nms) do_nms_sort(dets, l.side*l.side*l.n, l.classes, nms); draw_detections(im, dets, l.side*l.side*l.n, thresh, voc_names, alphabet, 20); diff --git a/src/detection_layer.c b/src/detection_layer.c index 015ee3173d4..d036a0ab6bd 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -263,6 +263,7 @@ void forward_detection_layer_gpu(const detection_layer l, network net) //float *in_cpu = calloc(l.batch*l.inputs, sizeof(float)); //float *truth_cpu = 0; + cuda_pull_array(net.input_gpu, net.input, l.batch*l.inputs); forward_detection_layer(l, net); cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs); cuda_push_array(l.delta_gpu, l.delta, l.batch*l.inputs); From f42370e7da0db8f0c66abb68cc75f9beba6f7c02 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 25 Mar 2018 05:36:04 -0700 Subject: [PATCH 071/118] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d255dab15b7..09fdeeeb5e7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Darknet Logo](http://pjreddie.com/media/files/darknet-black-small.png) -#Darknet# +# Darknet # Darknet is an open source neural network framework written in C and CUDA. It is fast, easy to install, and supports CPU and GPU computation. For more information see the [Darknet project website](http://pjreddie.com/darknet). From f444f25e912b754d55767c40703d0232864a40bc Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 25 Mar 2018 05:48:43 -0700 Subject: [PATCH 072/118] fixed demo thing --- src/demo.c | 280 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 166 insertions(+), 114 deletions(-) diff --git a/src/demo.c b/src/demo.c index 2f1885254ca..492c360d4ba 100644 --- a/src/demo.c +++ b/src/demo.c @@ -30,13 +30,59 @@ static int running = 0; static int demo_frame = 3; static int demo_index = 0; -//static float **predictions; -//static float *avg; +static float **predictions; +static float *avg; static int demo_done = 0; +static int demo_total = 0; double demo_time; detection *get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num); +int size_network(network *net) +{ + int i; + int count = 0; + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; + if(l.type == YOLO || l.type == REGION || l.type == DETECTION){ + count += l.outputs; + } + } + return count; +} + +void remember_network(network *net) +{ + int i; + int count = 0; + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; + if(l.type == YOLO || l.type == REGION || l.type == DETECTION){ + memcpy(predictions[demo_index] + count, net->layers[i].output, sizeof(float) * l.outputs); + count += l.outputs; + } + } +} + +detection *avg_predictions(network *net, int *nboxes) +{ + int i, j; + int count = 0; + fill_cpu(demo_total, 0, avg, 1); + for(j = 0; j < demo_frame; ++j){ + axpy_cpu(demo_total, 1./demo_frame, predictions[j], 1, avg, 1); + } + for(i = 0; i < net->n; ++i){ + layer l = net->layers[i]; + if(l.type == YOLO || l.type == REGION || l.type == DETECTION){ + memcpy(l.output, avg + count, sizeof(float) * l.outputs); + count += l.outputs; + } + } + detection *dets = get_network_boxes(net, buff[0].w, buff[0].h, demo_thresh, demo_hier, 0, 1, nboxes); + return dets; +} + void *detect_in_thread(void *ptr) { running = 1; @@ -47,37 +93,35 @@ void *detect_in_thread(void *ptr) network_predict(net, X); /* - if(l.type == DETECTION){ - get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); - } else */ + if(l.type == DETECTION){ + get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0); + } else */ + remember_network(net); detection *dets = 0; int nboxes = 0; - if (l.type == REGION){ - dets = get_network_boxes(net, buff[0].w, buff[0].h, demo_thresh, demo_hier, 0, 1, &nboxes); - } else { - error("Last layer must produce detections\n"); - } + dets = avg_predictions(net, &nboxes); -/* - int i,j; - box zero = {0}; - int classes = l.classes; - for(i = 0; i < demo_detections; ++i){ - avg[i].objectness = 0; - avg[i].bbox = zero; - memset(avg[i].prob, 0, classes*sizeof(float)); - for(j = 0; j < demo_frame; ++j){ - axpy_cpu(classes, 1./demo_frame, dets[j][i].prob, 1, avg[i].prob, 1); - avg[i].objectness += dets[j][i].objectness * 1./demo_frame; - avg[i].bbox.x += dets[j][i].bbox.x * 1./demo_frame; - avg[i].bbox.y += dets[j][i].bbox.y * 1./demo_frame; - avg[i].bbox.w += dets[j][i].bbox.w * 1./demo_frame; - avg[i].bbox.h += dets[j][i].bbox.h * 1./demo_frame; - } - //copy_cpu(classes, dets[0][i].prob, 1, avg[i].prob, 1); - //avg[i].objectness = dets[0][i].objectness; + + /* + int i,j; + box zero = {0}; + int classes = l.classes; + for(i = 0; i < demo_detections; ++i){ + avg[i].objectness = 0; + avg[i].bbox = zero; + memset(avg[i].prob, 0, classes*sizeof(float)); + for(j = 0; j < demo_frame; ++j){ + axpy_cpu(classes, 1./demo_frame, dets[j][i].prob, 1, avg[i].prob, 1); + avg[i].objectness += dets[j][i].objectness * 1./demo_frame; + avg[i].bbox.x += dets[j][i].bbox.x * 1./demo_frame; + avg[i].bbox.y += dets[j][i].bbox.y * 1./demo_frame; + avg[i].bbox.w += dets[j][i].bbox.w * 1./demo_frame; + avg[i].bbox.h += dets[j][i].bbox.h * 1./demo_frame; + } + //copy_cpu(classes, dets[0][i].prob, 1, avg[i].prob, 1); + //avg[i].objectness = dets[0][i].objectness; } - */ + */ if (nms > 0) do_nms_obj(dets, nboxes, l.classes, nms); @@ -155,6 +199,14 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch srand(2222222); + int i; + demo_total = size_network(net); + predictions = calloc(demo_frame, sizeof(float*)); + for (i = 0; i < demo_frame; ++i){ + predictions[i] = calloc(demo_total, sizeof(float)); + } + avg = calloc(demo_total, sizeof(float)); + if(filename){ printf("video file: %s\n", filename); cap = cvCaptureFromFile(filename); @@ -215,92 +267,92 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch } /* -void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen) -{ - demo_frame = avg_frames; - predictions = calloc(demo_frame, sizeof(float*)); - image **alphabet = load_alphabet(); - demo_names = names; - demo_alphabet = alphabet; - demo_classes = classes; - demo_thresh = thresh; - demo_hier = hier; - printf("Demo\n"); - net = load_network(cfg1, weight1, 0); - set_batch_network(net, 1); - pthread_t detect_thread; - pthread_t fetch_thread; - - srand(2222222); - - if(filename){ - printf("video file: %s\n", filename); - cap = cvCaptureFromFile(filename); - }else{ - cap = cvCaptureFromCAM(cam_index); - - if(w){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); - } - if(h){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); - } - if(frames){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, frames); - } - } - - if(!cap) error("Couldn't connect to webcam.\n"); - - layer l = net->layers[net->n-1]; - demo_detections = l.n*l.w*l.h; - int j; - - avg = (float *) calloc(l.outputs, sizeof(float)); - for(j = 0; j < demo_frame; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float)); - - boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box)); - probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *)); - for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes+1, sizeof(float)); - - buff[0] = get_image_from_stream(cap); - buff[1] = copy_image(buff[0]); - buff[2] = copy_image(buff[0]); - buff_letter[0] = letterbox_image(buff[0], net->w, net->h); - buff_letter[1] = letterbox_image(buff[0], net->w, net->h); - buff_letter[2] = letterbox_image(buff[0], net->w, net->h); - ipl = cvCreateImage(cvSize(buff[0].w,buff[0].h), IPL_DEPTH_8U, buff[0].c); - - int count = 0; - if(!prefix){ - cvNamedWindow("Demo", CV_WINDOW_NORMAL); - if(fullscreen){ - cvSetWindowProperty("Demo", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); - } else { - cvMoveWindow("Demo", 0, 0); - cvResizeWindow("Demo", 1352, 1013); - } - } - + void demo_compare(char *cfg1, char *weight1, char *cfg2, char *weight2, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen) + { + demo_frame = avg_frames; + predictions = calloc(demo_frame, sizeof(float*)); + image **alphabet = load_alphabet(); + demo_names = names; + demo_alphabet = alphabet; + demo_classes = classes; + demo_thresh = thresh; + demo_hier = hier; + printf("Demo\n"); + net = load_network(cfg1, weight1, 0); + set_batch_network(net, 1); + pthread_t detect_thread; + pthread_t fetch_thread; + + srand(2222222); + + if(filename){ + printf("video file: %s\n", filename); + cap = cvCaptureFromFile(filename); + }else{ + cap = cvCaptureFromCAM(cam_index); + + if(w){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); + } + if(h){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); + } + if(frames){ + cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, frames); + } + } + + if(!cap) error("Couldn't connect to webcam.\n"); + + layer l = net->layers[net->n-1]; + demo_detections = l.n*l.w*l.h; + int j; + + avg = (float *) calloc(l.outputs, sizeof(float)); + for(j = 0; j < demo_frame; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float)); + + boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box)); + probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *)); + for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes+1, sizeof(float)); + + buff[0] = get_image_from_stream(cap); + buff[1] = copy_image(buff[0]); + buff[2] = copy_image(buff[0]); + buff_letter[0] = letterbox_image(buff[0], net->w, net->h); + buff_letter[1] = letterbox_image(buff[0], net->w, net->h); + buff_letter[2] = letterbox_image(buff[0], net->w, net->h); + ipl = cvCreateImage(cvSize(buff[0].w,buff[0].h), IPL_DEPTH_8U, buff[0].c); + + int count = 0; + if(!prefix){ + cvNamedWindow("Demo", CV_WINDOW_NORMAL); + if(fullscreen){ + cvSetWindowProperty("Demo", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); + } else { + cvMoveWindow("Demo", 0, 0); + cvResizeWindow("Demo", 1352, 1013); + } + } + + demo_time = what_time_is_it_now(); + + while(!demo_done){ +buff_index = (buff_index + 1) %3; +if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); +if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); +if(!prefix){ + fps = 1./(what_time_is_it_now() - demo_time); demo_time = what_time_is_it_now(); - - while(!demo_done){ - buff_index = (buff_index + 1) %3; - if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); - if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); - if(!prefix){ - fps = 1./(what_time_is_it_now() - demo_time); - demo_time = what_time_is_it_now(); - display_in_thread(0); - }else{ - char name[256]; - sprintf(name, "%s_%08d", prefix, count); - save_image(buff[(buff_index + 1)%3], name); - } - pthread_join(fetch_thread, 0); - pthread_join(detect_thread, 0); - ++count; - } + display_in_thread(0); +}else{ + char name[256]; + sprintf(name, "%s_%08d", prefix, count); + save_image(buff[(buff_index + 1)%3], name); +} +pthread_join(fetch_thread, 0); +pthread_join(detect_thread, 0); +++count; +} } */ #else From b2ae5eea8e26f3826153123ec402013d5154cde0 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 25 Mar 2018 21:12:39 -0700 Subject: [PATCH 073/118] It's actually pronounced YOLOYOLOYOLO --- cfg/yolov3-voc.cfg | 821 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 821 insertions(+) create mode 100644 cfg/yolov3-voc.cfg diff --git a/cfg/yolov3-voc.cfg b/cfg/yolov3-voc.cfg new file mode 100644 index 00000000000..78b3fcb182e --- /dev/null +++ b/cfg/yolov3-voc.cfg @@ -0,0 +1,821 @@ +[net] +# Testing + batch=1 + subdivisions=1 +# Training +# batch=64 +# subdivisions=16 +width=416 +height=416 +channels=3 +momentum=0.9 +decay=0.0005 +angle=0 +saturation = 1.5 +exposure = 1.5 +hue=.1 + +learning_rate=0.001 +burn_in=1000 +max_batches = 50200 +policy=steps +steps=40000,45000 +scales=.1,.1 + + + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +# Downsample + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +###################### + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=75 +activation=linear + + +[region] +mask = 6,7,8 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +bias_match=1 +classes=20 +coords=4 +num=9 +softmax=0 +jitter=.3 +rescore=0 + +object_scale=1 +noobject_scale=1 +class_scale=1 +coord_scale=1 + +absolute=1 +thresh = .5 +random=1 + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 61 + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=75 +activation=linear + + +[region] +mask = 3,4,5 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +bias_match=1 +classes=20 +coords=4 +num=9 +softmax=0 +jitter=.3 +rescore=0 + +object_scale=1 +noobject_scale=1 +class_scale=1 +coord_scale=1 + +absolute=1 +thresh = .5 +random=1 + + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 36 + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=75 +activation=linear + + +[region] +mask = 0,1,2 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +bias_match=1 +classes=20 +coords=4 +num=9 +softmax=0 +jitter=.3 +rescore=0 + +object_scale=1 +noobject_scale=1 +class_scale=1 +coord_scale=1 + +absolute=1 +thresh = .5 +random=1 + From 14ee6bb5bc6d1ebd1522c9c7a181a0a488eb2f39 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 25 Mar 2018 21:43:52 -0700 Subject: [PATCH 074/118] =?UTF-8?q?=E2=9A=94=EF=B8=8F=20=20updating=20stab?= =?UTF-8?q?=20image=20=E2=9A=94=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stb_image.h | 2723 ++++++++++++++++++++++++++++------------- src/stb_image_write.h | 1208 +++++++++++++++--- 2 files changed, 2897 insertions(+), 1034 deletions(-) diff --git a/src/stb_image.h b/src/stb_image.h index d0fa9c21eaf..d9c21bc813f 100644 --- a/src/stb_image.h +++ b/src/stb_image.h @@ -1,5 +1,5 @@ -/* stb_image - v2.06 - public domain image loader - http://nothings.org/stb_image.h - no warranty implied; use at your own risk +/* stb_image - v2.19 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk Do this: #define STB_IMAGE_IMPLEMENTATION @@ -21,17 +21,20 @@ avoid problematic images and only need the trivial interface JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) - PNG 1/2/4/8-bit-per-channel (16 bpc not supported) + PNG 1/2/4/8/16-bit-per-channel TGA (not sure what subset, if a subset) BMP non-1bpp, non-RLE - PSD (composited view only, no extra channels) + PSD (composited view only, no extra channels, 8/16 bit-per-channel) GIF (*comp always reports as 4-channel) HDR (radiance rgbE format) PIC (Softimage PIC) PNM (PPM and PGM binary only) + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - decode from arbitrary I/O callbacks - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) @@ -39,176 +42,65 @@ Full documentation under "DOCUMENTATION" below. - Revision 2.00 release notes: - - - Progressive JPEG is now supported. - - - PPM and PGM binary formats are now supported, thanks to Ken Miller. - - - x86 platforms now make use of SSE2 SIMD instructions for - JPEG decoding, and ARM platforms can use NEON SIMD if requested. - This work was done by Fabian "ryg" Giesen. SSE2 is used by - default, but NEON must be enabled explicitly; see docs. - - With other JPEG optimizations included in this version, we see - 2x speedup on a JPEG on an x86 machine, and a 1.5x speedup - on a JPEG on an ARM machine, relative to previous versions of this - library. The same results will not obtain for all JPGs and for all - x86/ARM machines. (Note that progressive JPEGs are significantly - slower to decode than regular JPEGs.) This doesn't mean that this - is the fastest JPEG decoder in the land; rather, it brings it - closer to parity with standard libraries. If you want the fastest - decode, look elsewhere. (See "Philosophy" section of docs below.) - - See final bullet items below for more info on SIMD. - - - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing - the memory allocator. Unlike other STBI libraries, these macros don't - support a context parameter, so if you need to pass a context in to - the allocator, you'll have to store it in a global or a thread-local - variable. - - - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and - STBI_NO_LINEAR. - STBI_NO_HDR: suppress implementation of .hdr reader format - STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API - - - You can suppress implementation of any of the decoders to reduce - your code footprint by #defining one or more of the following - symbols before creating the implementation. - - STBI_NO_JPEG - STBI_NO_PNG - STBI_NO_BMP - STBI_NO_PSD - STBI_NO_TGA - STBI_NO_GIF - STBI_NO_HDR - STBI_NO_PIC - STBI_NO_PNM (.ppm and .pgm) - - - You can request *only* certain decoders and suppress all other ones - (this will be more forward-compatible, as addition of new decoders - doesn't require you to disable them explicitly): - - STBI_ONLY_JPEG - STBI_ONLY_PNG - STBI_ONLY_BMP - STBI_ONLY_PSD - STBI_ONLY_TGA - STBI_ONLY_GIF - STBI_ONLY_HDR - STBI_ONLY_PIC - STBI_ONLY_PNM (.ppm and .pgm) - - Note that you can define multiples of these, and you will get all - of them ("only x" and "only y" is interpreted to mean "only x&y"). - - - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still - want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB - - - Compilation of all SIMD code can be suppressed with - #define STBI_NO_SIMD - It should not be necessary to disable SIMD unless you have issues - compiling (e.g. using an x86 compiler which doesn't support SSE - intrinsics or that doesn't support the method used to detect - SSE2 support at run-time), and even those can be reported as - bugs so I can refine the built-in compile-time checking to be - smarter. - - - The old STBI_SIMD system which allowed installing a user-defined - IDCT etc. has been removed. If you need this, don't upgrade. My - assumption is that almost nobody was doing this, and those who - were will find the built-in SIMD more satisfactory anyway. - - - RGB values computed for JPEG images are slightly different from - previous versions of stb_image. (This is due to using less - integer precision in SIMD.) The C code has been adjusted so - that the same RGB values will be computed regardless of whether - SIMD support is available, so your app should always produce - consistent results. But these results are slightly different from - previous versions. (Specifically, about 3% of available YCbCr values - will compute different RGB results from pre-1.49 versions by +-1; - most of the deviating values are one smaller in the G channel.) - - - If you must produce consistent results with previous versions of - stb_image, #define STBI_JPEG_OLD and you will get the same results - you used to; however, you will not get the SIMD speedups for - the YCbCr-to-RGB conversion step (although you should still see - significant JPEG speedup from the other changes). - - Please note that STBI_JPEG_OLD is a temporary feature; it will be - removed in future versions of the library. It is only intended for - near-term back-compatibility use. - - - Latest revision history: - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) additional corruption checking - stbi_set_flip_vertically_on_load - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD - progressive JPEG - PGM/PPM support - STBI_MALLOC,STBI_REALLOC,STBI_FREE - STBI_NO_*, STBI_ONLY_* - GIF bugfix - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted) - optimize PNG - fix bug in interlaced PNG with user-specified channel count +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED See end of file for full revision history. ============================ Contributors ========================= - Image formats Bug fixes & warning fixes - Sean Barrett (jpeg, png, bmp) Marc LeBlanc - Nicolas Schulz (hdr, psd) Christpher Lloyd - Jonathan Dummer (tga) Dave Moore - Jean-Marc Lienher (gif) Won Chun - Tom Seddon (pic) the Horde3D community - Thatcher Ulrich (psd) Janez Zemva - Ken Miller (pgm, ppm) Jonathan Blow - Laurent Gomila - Aruelien Pocheville - Extensions, features Ryamond Barbiero - Jetro Lauha (stbi_info) David Woo - Martin "SpartanJ" Golini (stbi_info) Martin Golini - James "moose2000" Brown (iPhone PNG) Roy Eltham - Ben "Disch" Wenger (io callbacks) Luke Graham - Omar Cornut (1/2/4-bit PNG) Thomas Ruf - Nicolas Guillemot (vertical flip) John Bartholomew - Ken Hamada - Optimizations & bugfixes Cort Stratton - Fabian "ryg" Giesen Blazej Dariusz Roszkowski - Arseny Kapoulkine Thibault Reuille - Paul Du Bois - Guillaume George - If your name should be here but Jerry Jansson - isn't, let Sean know. Hayaki Saito - Johan Duparc - Ronny Chevalier - Michal Cichon - Tero Hanninen - Sergio Gonzalez - Cass Everitt - Engin Manap - Martins Mozeiko - Joseph Thomson - Phil Jordan - -License: - This software is in the public domain. Where that dedication is not - recognized, you are granted a perpetual, irrevocable license to copy - and modify this file however you want. - + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine + John-Mark Allen + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan + Dave Moore Roy Eltham Hayaki Saito Nathan Reed + Won Chun Luke Graham Johan Duparc Nick Verigakis + the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar + Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex + Ryamond Barbiero Paul Du Bois Engin Manap github:grim210 + Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw + Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus + Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo + Christian Floisand Kevin Schmidt github:darealshinji + Blazej Dariusz Roszkowski github:Michaelangel007 */ #ifndef STBI_INCLUDE_STB_IMAGE_H @@ -217,10 +109,8 @@ // DOCUMENTATION // // Limitations: -// - no 16-bit-per-channel PNG // - no 12-bit-per-channel JPEG // - no JPEGs with arithmetic coding -// - no 1-bit BMP // - GIF always returns *comp=4 // // Basic usage (see HDR discussion below for HDR usage): @@ -233,10 +123,10 @@ // stbi_image_free(data) // // Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *comp -- outputs # of image components in image file -// int req_comp -- if non-zero, # of image components requested in result +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result // // The return value from an image loader is an 'unsigned char *' which points // to the pixel data, or NULL on an allocation failure or if the image is @@ -244,11 +134,12 @@ // with each pixel consisting of N interleaved 8-bit components; the first // pixel pointed to is top-left-most in the image. There is no padding between // image scanlines or between pixels, regardless of format. The number of -// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. -// If req_comp is non-zero, *comp has the number of components that _would_ -// have been output otherwise. E.g. if you set req_comp to 4, you will always -// get RGBA output, but you can check *comp to see if it's trivially opaque -// because e.g. there were only 3 channels in the source image. +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. // // An output image with N components has the following components interleaved // in this order in each pixel: @@ -260,10 +151,10 @@ // 4 red, green, blue, alpha // // If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *comp will be unchanged. The function stbi_failure_reason() -// can be queried for an extremely brief, end-user unfriendly explanation -// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid -// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly // more user-friendly ones. // // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. @@ -282,13 +173,13 @@ // and for best performance I may provide less-easy-to-use APIs that give higher // performance, in addition to the easy to use ones. Nevertheless, it's important // to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all. +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. // // Some secondary priorities arise directly from the first two, some of which // make more explicit reasons why performance can't be emphasized. // // - Portable ("ease of use") -// - Small footprint ("easy to maintain") +// - Small source code footprint ("easy to maintain") // - No dependencies ("ease of use") // // =========================================================================== @@ -320,13 +211,6 @@ // (at least this is true for iOS and Android). Therefore, the NEON support is // toggled by a build flag: define STBI_NEON to get NEON loops. // -// The output of the JPEG decoder is slightly different from versions where -// SIMD support was introduced (that is, for versions before 1.49). The -// difference is only +-1 in the 8-bit RGB channels, and only on a small -// fraction of pixels. You can force the pre-1.49 behavior by defining -// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path -// and hence cost some performance. -// // If for some reason you do not want to use any of SIMD code, or if // you have issues compiling it, you can disable it entirely by // defining STBI_NO_SIMD. @@ -382,6 +266,41 @@ // says there's premultiplied data (currently only happens in iPhone images, // and only if iPhone convert-to-rgb processing is on). // +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// #ifndef STBI_NO_STDIO @@ -392,7 +311,7 @@ enum { - STBI_default = 0, // only used for req_comp + STBI_default = 0, // only used for desired_channels STBI_grey = 1, STBI_grey_alpha = 2, @@ -401,6 +320,7 @@ enum }; typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; #ifdef __cplusplus extern "C" { @@ -428,34 +348,60 @@ typedef struct int (*eof) (void *user); // returns nonzero if we are at end of file/data } stbi_io_callbacks; -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); -STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp); -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp); +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + #ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); // for stbi_load_from_file, file pointer is left pointing immediately after image #endif +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// #ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); #endif #endif #ifndef STBI_NO_HDR STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif +#endif // STBI_NO_HDR #ifndef STBI_NO_LINEAR STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_HDR +#endif // STBI_NO_LINEAR // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); @@ -476,11 +422,14 @@ STBIDEF void stbi_image_free (void *retval_from_stbi_load); // get image dimensions & components without fully decoding STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); #ifndef STBI_NO_STDIO -STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); - +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); #endif @@ -561,9 +510,10 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch #include // ptrdiff_t on osx #include #include +#include #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp +#include // ldexp, pow #endif #ifndef STBI_NO_STDIO @@ -619,18 +569,22 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) #endif -#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC) +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) // ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) // ok #else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC." +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." #endif #ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p,sz) realloc(p,sz) -#define STBI_FREE(p) free(p) +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) #endif // x86/x64 detection @@ -640,12 +594,14 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define STBI__X86_TARGET #endif -#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// NOTE: not clear do we actually need this for the 64-bit path? +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) // gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// (but compiling with -msse2 allows the compiler to use SSE2 everywhere; -// this is just broken and gcc are jerks for not fixing it properly -// http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. #define STBI_NO_SIMD #endif @@ -664,7 +620,7 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define STBI_NO_SIMD #endif -#if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET) +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) #define STBI_SSE2 #include @@ -693,7 +649,7 @@ static int stbi__cpuid3(void) #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name -static int stbi__sse2_available() +static int stbi__sse2_available(void) { int info3 = stbi__cpuid3(); return ((info3 >> 26) & 1) != 0; @@ -701,16 +657,12 @@ static int stbi__sse2_available() #else // assume GCC-style if not VC++ #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -static int stbi__sse2_available() +static int stbi__sse2_available(void) { -#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later - // GCC 4.8+ has a nice way to do this - return __builtin_cpu_supports("sse2"); -#else - // portable way to do this, preferably without using GCC inline ASM? - // just bail for now. - return 0; -#endif + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; } #endif #endif @@ -749,7 +701,7 @@ typedef struct stbi_uc buffer_start[128]; stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original; + stbi_uc *img_buffer_original, *img_buffer_original_end; } stbi__context; @@ -761,7 +713,7 @@ static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) s->io.read = NULL; s->read_from_callbacks = 0; s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = (stbi_uc *) buffer+len; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; } // initialize a callback-based context @@ -773,6 +725,7 @@ static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void * s->read_from_callbacks = 1; s->img_buffer_original = s->buffer_start; stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; } #ifndef STBI_NO_STDIO @@ -814,59 +767,76 @@ static void stbi__rewind(stbi__context *s) // but we just rewind to the beginning of the initial buffer, because // we only use it after doing 'test', which only ever looks at at most 92 bytes s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; } +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + #ifndef STBI_NO_JPEG static int stbi__jpeg_test(stbi__context *s); -static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PNG static int stbi__png_test(stbi__context *s); -static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); #endif #ifndef STBI_NO_BMP static int stbi__bmp_test(stbi__context *s); -static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_TGA static int stbi__tga_test(stbi__context *s); -static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PSD static int stbi__psd_test(stbi__context *s); -static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); #endif #ifndef STBI_NO_HDR static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PIC static int stbi__pic_test(stbi__context *s); -static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_GIF static int stbi__gif_test(stbi__context *s); -static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PNM static int stbi__pnm_test(stbi__context *s); -static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); #endif @@ -889,6 +859,81 @@ static void *stbi__malloc(size_t size) return STBI_MALLOC(size); } +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + // stbi__err - error // stbi__errpf - error returning pointer to float // stbi__errpuc - error returning pointer to unsigned char @@ -901,8 +946,8 @@ static void *stbi__malloc(size_t size) #define stbi__err(x,y) stbi__err(x) #endif -#define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL)) -#define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) STBIDEF void stbi_image_free(void *retval_from_stbi_load) { @@ -924,33 +969,38 @@ STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) stbi__vertically_flip_on_load = flag_true_if_should_flip; } -static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) { + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp); + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp); + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp); + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp); + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp); + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); #endif #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp); + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp); + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_HDR if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp); + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); } #endif @@ -958,58 +1008,138 @@ static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *com #ifndef STBI_NO_TGA // test tga last because it's a crappy test! if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp); + return stbi__tga_load(s,x,y,comp,req_comp, ri); #endif return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); } -static unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) { - unsigned char *result = stbi__load_main(s, x, y, comp, req_comp); + int i; + int img_len = w * h * channels; + stbi_uc *reduced; - if (stbi__vertically_flip_on_load && result != NULL) { - int w = *x, h = *y; - int depth = req_comp ? req_comp : *comp; - int row,col,z; - stbi_uc temp; - - // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once - for (row = 0; row < (h>>1); row++) { - for (col = 0; col < w; col++) { - for (z = 0; z < depth; z++) { - temp = result[(row * w + col) * depth + z]; - result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; - result[((h - row - 1) * w + col) * depth + z] = temp; - } - } + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; } } +} - return result; +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 8) { + STBI_ASSERT(ri.bits_per_channel == 16); + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; } +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 16) { + STBI_ASSERT(ri.bits_per_channel == 8); + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) || !defined(STBI_NO_LINEAR) static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) { if (stbi__vertically_flip_on_load && result != NULL) { - int w = *x, h = *y; - int depth = req_comp ? req_comp : *comp; - int row,col,z; - float temp; - - // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once - for (row = 0; row < (h>>1); row++) { - for (col = 0; col < w; col++) { - for (z = 0; z < depth; z++) { - temp = result[(row * w + col) * depth + z]; - result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; - result[((h - row - 1) * w + col) * depth + z] = temp; - } - } - } + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); } } - +#endif #ifndef STBI_NO_STDIO @@ -1041,28 +1171,83 @@ STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req unsigned char *result; stbi__context s; stbi__start_file(&s,f); - result = stbi__load_flip(&s,x,y,comp,req_comp); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); if (result) { // need to 'unget' all the characters in the IO buffer fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); } return result; } + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + #endif //!STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_mem(&s,buffer,len); - return stbi__load_flip(&s,x,y,comp,req_comp); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); } STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_flip(&s,x,y,comp,req_comp); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; } +#endif #ifndef STBI_NO_LINEAR static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) @@ -1070,13 +1255,14 @@ static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int unsigned char *data; #ifndef STBI_NO_HDR if (stbi__hdr_test(s)) { - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp); + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); if (hdr_data) stbi__float_postprocess(hdr_data,x,y,comp,req_comp); return hdr_data; } #endif - data = stbi__load_flip(s, x, y, comp, req_comp); + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); if (data) return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); @@ -1146,13 +1332,18 @@ STBIDEF int stbi_is_hdr (char const *filename) return result; } -STBIDEF int stbi_is_hdr_from_file(FILE *f) +STBIDEF int stbi_is_hdr_from_file(FILE *f) { #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; stbi__context s; stbi__start_file(&s,f); - return stbi__hdr_test(&s); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; #else + STBI_NOTUSED(f); return 0; #endif } @@ -1165,18 +1356,21 @@ STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); return stbi__hdr_test(&s); #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); return 0; #endif } -static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; +#ifndef STBI_NO_LINEAR static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; -#ifndef STBI_NO_LINEAR STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } #endif +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } @@ -1285,17 +1479,23 @@ static stbi__uint32 stbi__get32be(stbi__context *s) return (z << 16) + stbi__get16be(s); } +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else static int stbi__get16le(stbi__context *s) { int z = stbi__get8(s); return z + (stbi__get8(s) << 8); } +#endif +#ifndef STBI_NO_BMP static stbi__uint32 stbi__get32le(stbi__context *s) { stbi__uint32 z = stbi__get16le(s); return z + (stbi__get16le(s) << 16); } +#endif #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings @@ -1324,7 +1524,7 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r if (req_comp == img_n) return data; STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - good = (unsigned char *) stbi__malloc(req_comp * x * y); + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); if (good == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); @@ -1334,26 +1534,75 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r unsigned char *src = data + j * x * img_n ; unsigned char *dest = good + j * x * req_comp; - #define COMBO(a,b) ((a)*8+(b)) - #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) // convert source image with img_n components to one with req_comp components; // avoid switch per pixel, so use switch per scanline and massive macros - switch (COMBO(img_n, req_comp)) { - CASE(1,2) dest[0]=src[0], dest[1]=255; break; - CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; - CASE(2,1) dest[0]=src[0]; break; - CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; - CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; - CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; - CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break; - CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; - CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; - CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; default: STBI_ASSERT(0); } - #undef CASE + #undef STBI__CASE } STBI_FREE(data); @@ -1364,7 +1613,9 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) { int i,k,n; - float *output = (float *) stbi__malloc(x * y * comp * sizeof(float)); + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; @@ -1384,7 +1635,9 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) { int i,k,n; - stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp); + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; @@ -1449,7 +1702,7 @@ typedef struct stbi__context *s; stbi__huffman huff_dc[4]; stbi__huffman huff_ac[4]; - stbi_uc dequant[4][64]; + stbi__uint16 dequant[4][64]; stbi__int16 fast_ac[4][1 << FAST_BITS]; // sizes for components, interleaved MCUs @@ -1485,6 +1738,9 @@ typedef struct int succ_high; int succ_low; int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; int scan_n, order[4]; int restart_interval, todo; @@ -1497,7 +1753,8 @@ typedef struct static int stbi__build_huffman(stbi__huffman *h, int *count) { - int i,j,k=0,code; + int i,j,k=0; + unsigned int code; // build size list for each symbol (from JPEG spec) for (i=0; i < 16; ++i) for (j=0; j < count[i]; ++j) @@ -1513,7 +1770,7 @@ static int stbi__build_huffman(stbi__huffman *h, int *count) if (h->size[k] == j) { while (h->size[k] == j) h->code[k++] = (stbi__uint16) (code++); - if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); } // compute largest code + 1 for this size, preshifted as needed later h->maxcode[j] = code << (16-j); @@ -1554,10 +1811,10 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) // magnitude code followed by receive_extend code int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); int m = 1 << (magbits - 1); - if (k < m) k += (-1 << magbits) + 1; + if (k < m) k += (~0U << magbits) + 1; // if the result is small enough, we can fit it in fast_ac table if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); } } } @@ -1566,9 +1823,10 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) static void stbi__grow_buffer_unsafe(stbi__jpeg *j) { do { - int b = j->nomore ? 0 : stbi__get8(j->s); + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); if (b == 0xff) { int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes if (c != 0) { j->marker = (unsigned char) c; j->nomore = 1; @@ -1581,7 +1839,7 @@ static void stbi__grow_buffer_unsafe(stbi__jpeg *j) } // (1 << n) - 1 -static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; // decode a jpeg huffman value from the bitstream stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) @@ -1634,7 +1892,7 @@ stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) } // bias[n] = (-1<s); if (x != 0xff) return STBI__MARKER_none; while (x == 0xff) - x = stbi__get8(j->s); + x = stbi__get8(j->s); // consume repeated 0xff fill bytes return x; } @@ -2417,7 +2675,7 @@ static void stbi__jpeg_reset(stbi__jpeg *j) j->code_bits = 0; j->code_buffer = 0; j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; j->marker = STBI__MARKER_none; j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; j->eob_run = 0; @@ -2549,7 +2807,7 @@ static int stbi__parse_entropy_coded_data(stbi__jpeg *z) } } -static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant) +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) { int i; for (i=0; i < 64; ++i) @@ -2591,13 +2849,14 @@ static int stbi__process_marker(stbi__jpeg *z, int m) L = stbi__get16be(z->s)-2; while (L > 0) { int q = stbi__get8(z->s); - int p = q >> 4; + int p = q >> 4, sixteen = (p != 0); int t = q & 15,i; - if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG"); + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s); - L -= 65; + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); } return L==0; @@ -2630,12 +2889,50 @@ static int stbi__process_marker(stbi__jpeg *z, int m) } return L==0; } + // check for comment block or APP blocks if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - stbi__skip(z->s, stbi__get16be(z->s)-2); + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); return 1; } - return 0; + + return stbi__err("unknown marker","Corrupt JPEG"); } // after we see SOS @@ -2678,6 +2975,28 @@ static int stbi__process_scan_header(stbi__jpeg *z) return 1; } +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + static int stbi__process_frame_header(stbi__jpeg *z, int scan) { stbi__context *s = z->s; @@ -2687,7 +3006,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires c = stbi__get8(s); - if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); s->img_n = c; for (i=0; i < c; ++i) { z->img_comp[i].data = NULL; @@ -2696,11 +3015,12 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + z->rgb = 0; for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; z->img_comp[i].id = stbi__get8(s); - if (z->img_comp[i].id != i+1) // JFIF requires - if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! - return stbi__err("bad component ID","Corrupt JPEG"); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; q = stbi__get8(s); z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); @@ -2709,7 +3029,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) if (scan != STBI__SCAN_load) return 1; - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); for (i=0; i < s->img_n; ++i) { if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; @@ -2721,6 +3041,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_v_max = v_max; z->img_mcu_w = h_max * 8; z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; @@ -2732,28 +3053,27 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) // the bogus oversized data from using interleaved MCUs and their // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); - - if (z->img_comp[i].raw_data == NULL) { - for(--i; i >= 0; --i) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].data = NULL; - } - return stbi__err("outofmem", "Out of memory"); - } + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); // align blocks for idct using mmx/sse z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - z->img_comp[i].linebuf = NULL; if (z->progressive) { - z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3; - z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3; - z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15); + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } else { - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; } } @@ -2772,6 +3092,8 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) { int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 z->marker = STBI__MARKER_none; // initialize cached marker to empty m = stbi__get_marker(z); if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); @@ -2813,12 +3135,15 @@ static int stbi__decode_jpeg_image(stbi__jpeg *j) if (x == 255) { j->marker = stbi__get8(j->s); break; - } else if (x != 0) { - return stbi__err("junk before marker", "Corrupt JPEG"); } } // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); } else { if (!stbi__process_marker(j, m)) return 0; } @@ -3037,38 +3362,9 @@ static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_ return out; } -#ifdef STBI_JPEG_OLD -// this is the same YCbCr-to-RGB calculation that stb_image has used -// historically before the algorithm changes in 1.49 -#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 16) + 32768; // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr*float2fixed(1.40200f); - g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); - b = y_fixed + cb*float2fixed(1.77200f); - r >>= 16; - g >>= 16; - b >>= 16; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#else // this is a reduced-precision calculation of YCbCr-to-RGB introduced // to make sure the code produces the same results in both SIMD and scalar -#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) { int i; @@ -3077,9 +3373,9 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc int r,g,b; int cr = pcr[i] - 128; int cb = pcb[i] - 128; - r = y_fixed + cr* float2fixed(1.40200f); - g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* float2fixed(1.77200f); + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); r >>= 20; g >>= 20; b >>= 20; @@ -3093,7 +3389,6 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc out += step; } } -#endif #if defined(STBI_SSE2) || defined(STBI_NEON) static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) @@ -3212,9 +3507,9 @@ static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc cons int r,g,b; int cr = pcr[i] - 128; int cb = pcb[i] - 128; - r = y_fixed + cr* float2fixed(1.40200f); - g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* float2fixed(1.77200f); + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); r >>= 20; g >>= 20; b >>= 20; @@ -3240,18 +3535,14 @@ static void stbi__setup_jpeg(stbi__jpeg *j) #ifdef STBI_SSE2 if (stbi__sse2_available()) { j->idct_block_kernel = stbi__idct_simd; - #ifndef STBI_JPEG_OLD j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - #endif j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; } #endif #ifdef STBI_NEON j->idct_block_kernel = stbi__idct_simd; - #ifndef STBI_JPEG_OLD j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - #endif j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; #endif } @@ -3259,23 +3550,7 @@ static void stbi__setup_jpeg(stbi__jpeg *j) // clean up the temporary component buffers static void stbi__cleanup_jpeg(stbi__jpeg *j) { - int i; - for (i=0; i < j->s->img_n; ++i) { - if (j->img_comp[i].raw_data) { - STBI_FREE(j->img_comp[i].raw_data); - j->img_comp[i].raw_data = NULL; - j->img_comp[i].data = NULL; - } - if (j->img_comp[i].raw_coeff) { - STBI_FREE(j->img_comp[i].raw_coeff); - j->img_comp[i].raw_coeff = 0; - j->img_comp[i].coeff = 0; - } - if (j->img_comp[i].linebuf) { - STBI_FREE(j->img_comp[i].linebuf); - j->img_comp[i].linebuf = NULL; - } - } + stbi__free_jpeg_components(j, j->s->img_n, 0); } typedef struct @@ -3288,9 +3563,16 @@ typedef struct int ypos; // which pre-expansion row we're on } stbi__resample; +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) { - int n, decode_n; + int n, decode_n, is_rgb; z->s->img_n = 0; // make stbi__cleanup_jpeg safe // validate req_comp @@ -3300,9 +3582,11 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n; + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - if (z->s->img_n == 3 && n < 3) + if (z->s->img_n == 3 && n < 3 && !is_rgb) decode_n = 1; else decode_n = z->s->img_n; @@ -3339,7 +3623,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp } // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1); + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } // now go ahead and resample @@ -3362,7 +3646,39 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (n >= 3) { stbi_uc *y = coutput[0]; if (z->s->img_n == 3) { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } } else for (i=0; i < z->s->img_x; ++i) { out[0] = out[1] = out[2] = y[i]; @@ -3370,37 +3686,70 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp out += n; } } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } } } stbi__cleanup_jpeg(z); *out_x = z->s->img_x; *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n; // report original components, not output + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output return output; } } -static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { - stbi__jpeg j; - j.s = s; - stbi__setup_jpeg(&j); - return load_jpeg_image(&j, x,y,comp,req_comp); + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; } static int stbi__jpeg_test(stbi__context *s) { int r; - stbi__jpeg j; - j.s = s; - stbi__setup_jpeg(&j); - r = stbi__decode_jpeg_header(&j, STBI__SCAN_type); + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); stbi__rewind(s); + STBI_FREE(j); return r; } @@ -3412,15 +3761,18 @@ static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) } if (x) *x = j->s->img_x; if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; return 1; } static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) { - stbi__jpeg j; - j.s = s; - return stbi__jpeg_info_raw(&j, x, y, comp); + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; } #endif @@ -3466,7 +3818,7 @@ stbi_inline static int stbi__bit_reverse(int v, int bits) return stbi__bitreverse16(v) >> (16-bits); } -static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) { int i,k=0; int code, next_code[16], sizes[17]; @@ -3501,10 +3853,10 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) z->size [c] = (stbi_uc ) s; z->value[c] = (stbi__uint16) i; if (s <= STBI__ZFAST_BITS) { - int k = stbi__bit_reverse(next_code[s],s); - while (k < (1 << STBI__ZFAST_BITS)) { - z->fast[k] = fastv; - k += (1 << s); + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); } } ++next_code[s]; @@ -3543,7 +3895,7 @@ static void stbi__fill_bits(stbi__zbuf *z) { do { STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); - z->code_buffer |= stbi__zget8(z) << z->num_bits; + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; z->num_bits += 8; } while (z->num_bits <= 24); } @@ -3593,14 +3945,15 @@ stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes { char *q; - int cur, limit; + int cur, limit, old_limit; z->zout = zout; if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); cur = (int) (z->zout - z->zout_start); - limit = (int) (z->zout_end - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); while (cur + n > limit) limit *= 2; - q = (char *) STBI_REALLOC(z->zout_start, limit); + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); if (q == NULL) return stbi__err("outofmem", "Out of memory"); z->zout_start = q; z->zout = q + cur; @@ -3608,18 +3961,18 @@ static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room return 1; } -static int stbi__zlength_base[31] = { +static const int stbi__zlength_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; -static int stbi__zlength_extra[31]= +static const int stbi__zlength_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; -static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; -static int stbi__zdist_extra[32] = +static const int stbi__zdist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; static int stbi__parse_huffman_block(stbi__zbuf *a) @@ -3666,7 +4019,7 @@ static int stbi__parse_huffman_block(stbi__zbuf *a) static int stbi__compute_huffman_codes(stbi__zbuf *a) { - static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; stbi__zhuffman z_codelength; stbi_uc lencodes[286+32+137];//padding for maximum single op stbi_uc codelength_sizes[19]; @@ -3675,6 +4028,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) int hlit = stbi__zreceive(a,5) + 257; int hdist = stbi__zreceive(a,5) + 1; int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; memset(codelength_sizes, 0, sizeof(codelength_sizes)); for (i=0; i < hclen; ++i) { @@ -3684,33 +4038,35 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; n = 0; - while (n < hlit + hdist) { + while (n < ntot) { int c = stbi__zhuffman_decode(a, &z_codelength); if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); if (c < 16) lencodes[n++] = (stbi_uc) c; - else if (c == 16) { - c = stbi__zreceive(a,2)+3; - memset(lencodes+n, lencodes[n-1], c); - n += c; - } else if (c == 17) { - c = stbi__zreceive(a,3)+3; - memset(lencodes+n, 0, c); - n += c; - } else { - STBI_ASSERT(c == 18); - c = stbi__zreceive(a,7)+11; - memset(lencodes+n, 0, c); + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = stbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); n += c; } } - if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG"); + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; return 1; } -static int stbi__parse_uncomperssed_block(stbi__zbuf *a) +static int stbi__parse_uncompressed_block(stbi__zbuf *a) { stbi_uc header[4]; int len,nlen,k; @@ -3752,9 +4108,24 @@ static int stbi__parse_zlib_header(stbi__zbuf *a) return 1; } -// @TODO: should statically initialize these for optimal thread safety -static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32]; -static void stbi__init_zdefaults(void) +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: { int i; // use <= to match clearly with spec for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; @@ -3764,6 +4135,7 @@ static void stbi__init_zdefaults(void) for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; } +*/ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) { @@ -3776,13 +4148,12 @@ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) final = stbi__zreceive(a,1); type = stbi__zreceive(a,2); if (type == 0) { - if (!stbi__parse_uncomperssed_block(a)) return 0; + if (!stbi__parse_uncompressed_block(a)) return 0; } else if (type == 3) { return 0; } else { if (type == 1) { // use fixed code lengths - if (!stbi__zdefault_distance[31]) stbi__init_zdefaults(); if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; } else { @@ -3907,7 +4278,7 @@ static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) static int stbi__check_png_header(stbi__context *s) { - static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; int i; for (i=0; i < 8; ++i) if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); @@ -3918,6 +4289,7 @@ typedef struct { stbi__context *s; stbi_uc *idata, *expanded, *out; + int depth; } stbi__png; @@ -3952,35 +4324,40 @@ static int stbi__paeth(int a, int b, int c) return c; } -static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; // create the png data from post-deflated data static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) { + int bytes = (depth == 16? 2 : 1); stbi__context *s = a->s; - stbi__uint32 i,j,stride = x*out_n; + stbi__uint32 i,j,stride = x*out_n*bytes; stbi__uint32 img_len, img_width_bytes; int k; int img_n = s->img_n; // copy it into a local for later + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into if (!a->out) return stbi__err("outofmem", "Out of memory"); + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); img_width_bytes = (((img_n * x * depth) + 7) >> 3); img_len = (img_width_bytes + 1) * y; - if (s->img_x == x && s->img_y == y) { - if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG"); - } else { // interlaced: - if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); - } + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); for (j=0; j < y; ++j) { stbi_uc *cur = a->out + stride*j; - stbi_uc *prior = cur - stride; + stbi_uc *prior; int filter = *raw++; - int filter_bytes = img_n; - int width = x; + if (filter > 4) return stbi__err("invalid filter","Corrupt PNG"); @@ -3990,6 +4367,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r filter_bytes = 1; width = img_width_bytes; } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above // if first row, use special filter that doesn't sample previous row if (j == 0) filter = first_row_filter[filter]; @@ -4013,6 +4391,14 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r raw += img_n; cur += out_n; prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; } else { raw += 1; cur += 1; @@ -4021,38 +4407,47 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r // this is a little gross, so that we don't switch per-pixel or per-component if (depth < 8 || img_n == out_n) { - int nk = (width - 1)*img_n; - #define CASE(f) \ + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ case f: \ for (k=0; k < nk; ++k) switch (filter) { // "none" filter turns into a memcpy here; make that explicit. case STBI__F_none: memcpy(cur, raw, nk); break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break; - CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break; - CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break; - CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break; - CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; } - #undef CASE + #undef STBI__CASE raw += nk; } else { STBI_ASSERT(img_n+1 == out_n); - #define CASE(f) \ + #define STBI__CASE(f) \ case f: \ - for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ - for (k=0; k < img_n; ++k) + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) switch (filter) { - CASE(STBI__F_none) cur[k] = raw[k]; break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break; - CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break; - CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; - CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break; - CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break; + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } } - #undef CASE } } @@ -4109,25 +4504,36 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); } if (img_n != out_n) { + int q; // insert alpha = 255 - stbi_uc *cur = a->out + stride*j; - int i; + cur = a->out + stride*j; if (img_n == 1) { - for (i=x-1; i >= 0; --i) { - cur[i*2+1] = 255; - cur[i*2+0] = cur[i]; + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; } } else { STBI_ASSERT(img_n == 3); - for (i=x-1; i >= 0; --i) { - cur[i*4+3] = 255; - cur[i*4+2] = cur[i*3+2]; - cur[i*4+1] = cur[i*3+1]; - cur[i*4+0] = cur[i*3+0]; + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; } } } } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } } return 1; @@ -4135,13 +4541,15 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) { + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; stbi_uc *final; int p; if (!interlaced) return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); // de-interlacing - final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n); + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); for (p=0; p < 7; ++p) { int xorig[] = { 0,4,0,2,0,1,0 }; int yorig[] = { 0,0,4,0,2,0,1 }; @@ -4161,8 +4569,8 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint3 for (i=0; i < x; ++i) { int out_y = j*yspc[p]+yorig[p]; int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n, - a->out + (j*x+i)*out_n, out_n); + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); } } STBI_FREE(a->out); @@ -4200,12 +4608,37 @@ static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) return 1; } +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) { stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; stbi_uc *p, *temp_out, *orig = a->out; - p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n); + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); if (p == NULL) return stbi__err("outofmem", "Out of memory"); // between here and free(out) below, exitting would leak @@ -4271,9 +4704,10 @@ static void stbi__de_iphone(stbi__png *z) stbi_uc a = p[3]; stbi_uc t = p[0]; if (a) { - p[0] = p[2] * 255 / a; - p[1] = p[1] * 255 / a; - p[2] = t * 255 / a; + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; } else { p[0] = p[2]; p[2] = t; @@ -4292,14 +4726,15 @@ static void stbi__de_iphone(stbi__png *z) } } -#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) { stbi_uc palette[1024], pal_img_n=0; stbi_uc has_trans=0, tc[3]; + stbi__uint16 tc16[3]; stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, depth=0, is_iphone=0; + int first=1,k,interlace=0, color=0, is_iphone=0; stbi__context *s = z->s; z->expanded = NULL; @@ -4324,8 +4759,9 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - depth = stbi__get8(s); if (depth != 1 && depth != 2 && depth != 4 && depth != 8) return stbi__err("1/2/4/8-bit only","PNG not supported: 1/2/4/8-bit only"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); @@ -4373,8 +4809,11 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); has_trans = 1; - for (k=0; k < s->img_n; ++k) - tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } } break; } @@ -4385,11 +4824,13 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } if ((int)(ioff + c.length) < (int)ioff) return 0; if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; stbi_uc *p; if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; while (ioff + c.length > idata_limit) idata_limit *= 2; - p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); z->idata = p; } if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); @@ -4403,7 +4844,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (scan != STBI__SCAN_load) return 1; if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); if (z->expanded == NULL) return 0; // zlib should set error @@ -4412,9 +4853,14 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) s->img_out_n = s->img_n+1; else s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0; - if (has_trans) - if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) stbi__de_iphone(z); if (pal_img_n) { @@ -4424,6 +4870,9 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (req_comp >= 3) s->img_out_n = req_comp; if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; } STBI_FREE(z->expanded); z->expanded = NULL; return 1; @@ -4451,21 +4900,28 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) } } -static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp) +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) { - unsigned char *result=NULL; + void *result=NULL; if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; result = p->out; p->out = NULL; if (req_comp && req_comp != p->s->img_out_n) { - result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); p->s->img_out_n = req_comp; if (result == NULL) return result; } *x = p->s->img_x; *y = p->s->img_y; - if (n) *n = p->s->img_out_n; + if (n) *n = p->s->img_n; } STBI_FREE(p->out); p->out = NULL; STBI_FREE(p->expanded); p->expanded = NULL; @@ -4474,11 +4930,11 @@ static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req return result; } -static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi__png p; p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp); + return stbi__do_png(&p, x,y,comp,req_comp, ri); } static int stbi__png_test(stbi__context *s) @@ -4507,6 +4963,19 @@ static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) p.s = s; return stbi__png_info_raw(&p, x, y, comp); } + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} #endif // Microsoft/Windows BMP image @@ -4558,36 +5027,46 @@ static int stbi__bitcount(unsigned int a) return a & 0xff; } +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. static int stbi__shiftsigned(int v, int shift, int bits) { - int result; - int z=0; - - if (shift < 0) v <<= -shift; - else v >>= shift; - result = v; - - z = bits; - while (z < 8) { - result += v >> z; - z += bits; - } - return result; + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v >= 0 && v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; } -static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +typedef struct { - stbi_uc *out; - unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; - stbi_uc pal[256][4]; - int psize=0,i,j,compress=0,width; - int bpp, flip_vertically, pad, target, offset, hsz; + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; +} stbi__bmp_data; + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); stbi__get32le(s); // discard filesize stbi__get16le(s); // discard reserved stbi__get16le(s); // discard reserved - offset = stbi__get32le(s); - hsz = stbi__get32le(s); + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); if (hsz == 12) { s->img_x = stbi__get16le(s); @@ -4597,15 +5076,9 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int s->img_y = stbi__get32le(s); } if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); - bpp = stbi__get16le(s); - if (bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit"); - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - if (hsz == 12) { - if (bpp < 24) - psize = (offset - 14 - 24) / 3; - } else { - compress = stbi__get32le(s); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); stbi__get32le(s); // discard sizeof stbi__get32le(s); // discard hres @@ -4619,27 +5092,25 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int stbi__get32le(s); stbi__get32le(s); } - if (bpp == 16 || bpp == 32) { - mr = mg = mb = 0; + if (info->bpp == 16 || info->bpp == 32) { if (compress == 0) { - if (bpp == 32) { - mr = 0xffu << 16; - mg = 0xffu << 8; - mb = 0xffu << 0; - ma = 0xffu << 24; - fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 - STBI_NOTUSED(fake_a); + if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 } else { - mr = 31u << 10; - mg = 31u << 5; - mb = 31u << 0; + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; } } else if (compress == 3) { - mr = stbi__get32le(s); - mg = stbi__get32le(s); - mb = stbi__get32le(s); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); // not documented, but generated by photoshop and handled by mspaint - if (mr == mg && mg == mb) { + if (info->mr == info->mg && info->mg == info->mb) { // ?!?!? return stbi__errpuc("bad BMP", "bad BMP"); } @@ -4647,11 +5118,13 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int return stbi__errpuc("bad BMP", "bad BMP"); } } else { - STBI_ASSERT(hsz == 108 || hsz == 124); - mr = stbi__get32le(s); - mg = stbi__get32le(s); - mb = stbi__get32le(s); - ma = stbi__get32le(s); + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); stbi__get32le(s); // discard color space for (i=0; i < 12; ++i) stbi__get32le(s); // discard color space parameters @@ -4662,63 +5135,119 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int stbi__get32le(s); // discard reserved } } - if (bpp < 16) - psize = (offset - 14 - hsz) >> 2; } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - 14 - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - 14 - info.hsz) >> 2; + } + s->img_n = ma ? 4 : 3; if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 target = req_comp; else target = s->img_n; // if they want monochrome, we'll post-convert - out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y); + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (bpp < 16) { + if (info.bpp < 16) { int z=0; if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } for (i=0; i < psize; ++i) { pal[i][2] = stbi__get8(s); pal[i][1] = stbi__get8(s); pal[i][0] = stbi__get8(s); - if (hsz != 12) stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); pal[i][3] = 255; } - stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); - if (bpp == 4) width = (s->img_x + 1) >> 1; - else if (bpp == 8) width = s->img_x; + stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } pad = (-width)&3; - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=stbi__get8(s),v2=0; - if (bpp == 4) { - v2 = v & 15; - v >>= 4; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); } - stbi__skip(s, pad); } } else { int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; int z = 0; int easy=0; - stbi__skip(s, offset - 14 - hsz); - if (bpp == 24) width = 3 * s->img_x; - else if (bpp == 16) width = 2*s->img_x; + stbi__skip(s, info.offset - 14 - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; else /* bpp = 32 and pad = 0 */ width=0; pad = (-width) & 3; - if (bpp == 24) { + if (info.bpp == 24) { easy = 1; - } else if (bpp == 32) { + } else if (info.bpp == 32) { if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) easy = 2; } @@ -4739,22 +5268,31 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int out[z+0] = stbi__get8(s); z += 3; a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; if (target == 4) out[z++] = a; } } else { + int bpp = info.bpp; for (i=0; i < (int) s->img_x; ++i) { stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); - int a; + unsigned int a; out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; if (target == 4) out[z++] = STBI__BYTECAST(a); } } stbi__skip(s, pad); } } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + if (flip_vertically) { stbi_uc t; for (j=0; j < (int) s->img_y>>1; ++j) { @@ -4781,20 +5319,55 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int // Targa Truevision - TGA // by Jonathan Dummer #ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) { - int tga_w, tga_h, tga_comp; - int sz; + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; stbi__get8(s); // discard Offset - sz = stbi__get8(s); // color type - if( sz > 1 ) { + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { stbi__rewind(s); return 0; // only RGB or indexed allowed } - sz = stbi__get8(s); // image type - // only RGB or grey allowed, +/- RLE - if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; - stbi__skip(s,9); + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } tga_w = stbi__get16le(s); if( tga_w < 1 ) { stbi__rewind(s); @@ -4805,45 +5378,81 @@ static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) stbi__rewind(s); return 0; // test height } - sz = stbi__get8(s); // bits per pixel - // only RGB or RGBA or grey allowed - if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) { - stbi__rewind(s); - return 0; + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; } - tga_comp = sz; if (x) *x = tga_w; if (y) *y = tga_h; - if (comp) *comp = tga_comp / 8; + if (comp) *comp = tga_comp; return 1; // seems to have passed everything } static int stbi__tga_test(stbi__context *s) { - int res; - int sz; + int res = 0; + int sz, tga_color_type; stbi__get8(s); // discard Offset - sz = stbi__get8(s); // color type - if ( sz > 1 ) return 0; // only RGB or indexed allowed + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed sz = stbi__get8(s); // image type - if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE - stbi__get16be(s); // discard palette start - stbi__get16be(s); // discard palette length - stbi__get8(s); // discard bits per palette color entry - stbi__get16be(s); // discard x origin - stbi__get16be(s); // discard y origin - if ( stbi__get16be(s) < 1 ) return 0; // test width - if ( stbi__get16be(s) < 1 ) return 0; // test height + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height sz = stbi__get8(s); // bits per pixel - if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) - res = 0; - else - res = 1; + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: stbi__rewind(s); return res; } -static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { // read in the TGA header stuff int tga_offset = stbi__get8(s); @@ -4858,16 +5467,18 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int int tga_width = stbi__get16le(s); int tga_height = stbi__get16le(s); int tga_bits_per_pixel = stbi__get8(s); - int tga_comp = tga_bits_per_pixel / 8; + int tga_comp, tga_rgb16=0; int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) // image data unsigned char *tga_data; unsigned char *tga_palette = NULL; int i, j; - unsigned char raw_data[4]; + unsigned char raw_data[4] = {0}; int RLE_count = 0; int RLE_repeating = 0; int read_next_pixel = 1; + STBI_NOTUSED(ri); // do a tiny bit of precessing if ( tga_image_type >= 8 ) @@ -4875,41 +5486,33 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int tga_image_type -= 8; tga_is_RLE = 1; } - /* int tga_alpha_bits = tga_inverted & 15; */ tga_inverted = 1 - ((tga_inverted >> 5) & 1); - // error check - if ( //(tga_indexed) || - (tga_width < 1) || (tga_height < 1) || - (tga_image_type < 1) || (tga_image_type > 3) || - ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && - (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) - ) - { - return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA - } - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) - { - tga_comp = tga_palette_bits / 8; - } + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); // tga info *x = tga_width; *y = tga_height; if (comp) *comp = tga_comp; - tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp ); + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); // skip to the data's starting position (offset usually = 0) stbi__skip(s, tga_offset ); - if ( !tga_indexed && !tga_is_RLE) { + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { for (i=0; i < tga_height; ++i) { - int y = tga_inverted ? tga_height -i - 1 : i; - stbi_uc *tga_row = tga_data + y*tga_width*tga_comp; + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; stbi__getn(s, tga_row, tga_width * tga_comp); } } else { @@ -4919,15 +5522,22 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // any data to skip? (offset usually = 0) stbi__skip(s, tga_palette_start ); // load the palette - tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 ); + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); if (!tga_palette) { STBI_FREE(tga_data); return stbi__errpuc("outofmem", "Out of memory"); } - if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); } } // load the data @@ -4957,23 +5567,22 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // load however much data we did have if ( tga_indexed ) { - // read in 1 byte, then perform the lookup - int pal_idx = stbi__get8(s); - if ( pal_idx >= tga_palette_len ) - { - // invalid index + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index pal_idx = 0; } - pal_idx *= tga_bits_per_pixel / 8; - for (j = 0; j*8 < tga_bits_per_pixel; ++j) - { + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { raw_data[j] = tga_palette[pal_idx+j]; } - } else - { + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { // read in the data raw - for (j = 0; j*8 < tga_bits_per_pixel; ++j) - { + for (j = 0; j < tga_comp; ++j) { raw_data[j] = stbi__get8(s); } } @@ -5012,8 +5621,8 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int } } - // swap RGB - if (tga_comp >= 3) + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) { unsigned char* tga_pixel = tga_data; for (i=0; i < tga_width * tga_height; ++i) @@ -5049,13 +5658,53 @@ static int stbi__psd_test(stbi__context *s) return r; } -static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) { - int pixelCount; + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; int channelCount, compression; - int channel, i, count, len; + int channel, i; + int bitdepth; int w,h; stbi_uc *out; + STBI_NOTUSED(ri); // Check identifier if (stbi__get32be(s) != 0x38425053) // "8BPS" @@ -5078,8 +5727,9 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int w = stbi__get32be(s); // Make sure the depth is 8 bits. - if (stbi__get16be(s) != 8) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 bit"); + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); // Make sure the color mode is RGB. // Valid options are: @@ -5111,8 +5761,18 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int if (compression > 1) return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + // Create the destination image. - out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); pixelCount = w*h; @@ -5144,61 +5804,86 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int *p = (channel == 3 ? 255 : 0); } else { // Read the RLE data. - count = 0; - while (count < pixelCount) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len ^= 0x0FF; - len += 2; - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); } } } } else { // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit value for each pixel in the image. + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. // Read the data by channel. for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out + channel; - if (channel > channelCount) { + if (channel >= channelCount) { // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = channel == 3 ? 255 : 0; + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } } else { - // Read the data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } } } } + // convert to desired output format if (req_comp && req_comp != 4) { - out = stbi__convert_format(out, 4, req_comp, w, h); + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); if (out == NULL) return out; // stbi__convert_format frees input on failure } @@ -5350,7 +6035,6 @@ static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *c if (count >= 128) { // Repeated stbi_uc value[4]; - int i; if (count==128) count = stbi__get16be(s); @@ -5383,10 +6067,13 @@ static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *c return result; } -static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp) +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) { stbi_uc *result; - int i, x,y; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; for (i=0; i<92; ++i) stbi__get8(s); @@ -5394,14 +6081,14 @@ static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int re x = stbi__get16be(s); y = stbi__get16be(s); if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); stbi__get32be(s); //skip `ratio' stbi__get16be(s); //skip `fields' stbi__get16be(s); //skip `pad' // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc(x*y*4); + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); memset(result, 0xff, x*y*4); if (!stbi__pic_load_core(s,x,y,comp, result)) { @@ -5439,10 +6126,12 @@ typedef struct { int w,h; stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; int flags, bgindex, ratio, transparent, eflags; stbi_uc pal[256][4]; stbi_uc lpal[256][4]; - stbi__gif_lzw codes[4096]; + stbi__gif_lzw codes[8192]; stbi_uc *color_table; int parse, step; int lflags; @@ -5450,6 +6139,7 @@ typedef struct int max_x, max_y; int cur_x, cur_y; int line_size; + int delay; } stbi__gif; static int stbi__gif_test_raw(stbi__context *s) @@ -5510,19 +6200,22 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) { - stbi__gif g; - if (!stbi__gif_header(s, &g, comp, 1)) { + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); stbi__rewind( s ); return 0; } - if (x) *x = g.w; - if (y) *y = g.h; + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); return 1; } static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) { stbi_uc *p, *c; + int idx; // recurse to decode the prefixes, since the linked-list is backwards, // and working backwards through an interleaved image would be nasty @@ -5531,10 +6224,12 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) if (g->cur_y >= g->max_y) return; - p = &g->out[g->cur_x + g->cur_y]; - c = &g->color_table[g->codes[code].suffix * 4]; + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; - if (c[3] >= 128) { + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; p[0] = c[2]; p[1] = c[1]; p[2] = c[0]; @@ -5557,7 +6252,7 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) { stbi_uc lzw_cs; - stbi__int32 len, code; + stbi__int32 len, init_code; stbi__uint32 first; stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; stbi__gif_lzw *p; @@ -5570,10 +6265,10 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) codemask = (1 << codesize) - 1; bits = 0; valid_bits = 0; - for (code = 0; code < clear; code++) { - g->codes[code].prefix = -1; - g->codes[code].first = (stbi_uc) code; - g->codes[code].suffix = (stbi_uc) code; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; } // support no starting clear code @@ -5608,11 +6303,16 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) stbi__skip(s,len); return g->out; } else if (code <= avail) { - if (first) return stbi__errpuc("no clear code", "Corrupt GIF"); + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } if (oldcode >= 0) { p = &g->codes[avail++]; - if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF"); + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + p->prefix = (stbi__int16) oldcode; p->first = g->codes[oldcode].first; p->suffix = (code == avail) ? p->first : g->codes[code].first; @@ -5634,43 +6334,70 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) } } -static void stbi__fill_gif_background(stbi__gif *g) -{ - int i; - stbi_uc *c = g->pal[g->bgindex]; - // @OPTIMIZE: write a dword at a time - for (i = 0; i < g->w * g->h * 4; i += 4) { - stbi_uc *p = &g->out[i]; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } -} - // this function is designed to support animated gifs, although stb_image doesn't support it -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) { - int i; - stbi_uc *old_out = 0; + int dispose; + int first_frame; + int pi; + int pcount; + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; if (g->out == 0) { if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->history = (stbi_uc *) stbi__malloc(g->w * g->h); if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); - stbi__fill_gif_background(g); + + // image is treated as "tranparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to teh color that was there the previous frame. + memset( g->out, 0x00, 4 * g->w * g->h ); + memset( g->background, 0x00, 4 * g->w * g->h ); // state of the background (starts transparent) + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + first_frame = 1; } else { - // animated-gif-only path - if (((g->eflags & 0x1C) >> 2) == 3) { - old_out = g->out; - g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); - if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); - memcpy(g->out, old_out, g->w*g->h*4); + // second frame - how do we dispoase of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); } + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + for (;;) { - switch (stbi__get8(s)) { + int tag = stbi__get8(s); + switch (tag) { case 0x2C: /* Image Descriptor */ { stbi__int32 x, y, w, h; @@ -5705,38 +6432,60 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); g->color_table = (stbi_uc *) g->lpal; } else if (g->flags & 0x80) { - for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent - g->pal[i][3] = 255; - if (g->transparent >= 0 && (g->eflags & 0x01)) - g->pal[g->transparent][3] = 0; g->color_table = (stbi_uc *) g->pal; } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - + return stbi__errpuc("missing color table", "Corrupt GIF"); + o = stbi__process_gif_raster(s, g); if (o == NULL) return NULL; - if (req_comp && req_comp != 4) - o = stbi__convert_format(o, 4, req_comp, g->w, g->h); + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + return o; } case 0x21: // Comment Extension. { int len; - if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. len = stbi__get8(s); if (len == 4) { g->eflags = stbi__get8(s); - stbi__get16le(s); // delay - g->transparent = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } } else { stbi__skip(s, len); break; } - } - while ((len = stbi__get8(s)) != 0) + } + while ((len = stbi__get8(s)) != 0) { stbi__skip(s, len); + } break; } @@ -5749,19 +6498,90 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i } } -static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + out = (stbi_uc*) STBI_REALLOC( out, layers * stride ); + if (delays) { + *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers ); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi_uc *u = 0; stbi__gif g; memset(&g, 0, sizeof(g)); - u = stbi__gif_load_next(s, &g, comp, req_comp); + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); if (u == (stbi_uc *) s) u = 0; // end of animated gif marker if (u) { *x = g.w; *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); } + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + return u; } @@ -5775,20 +6595,24 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) // Radiance RGBE HDR loader // originally by Nicolas Schulz #ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s) +static int stbi__hdr_test_core(stbi__context *s, const char *signature) { - const char *signature = "#?RADIANCE\n"; int i; for (i=0; signature[i]; ++i) if (stbi__get8(s) != signature[i]) - return 0; + return 0; + stbi__rewind(s); return 1; } static int stbi__hdr_test(stbi__context* s) { - int r = stbi__hdr_test_core(s); + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } return r; } @@ -5842,7 +6666,7 @@ static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) } } -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { char buffer[STBI__HDR_BUFLEN]; char *token; @@ -5853,10 +6677,12 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re int len; unsigned char count, value; int i, j, k, c1,c2, z; - + const char *headerToken; + STBI_NOTUSED(ri); // Check identifier - if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) return stbi__errpf("not HDR", "Corrupt HDR image"); // Parse header @@ -5885,8 +6711,13 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re if (comp) *comp = 3; if (req_comp == 0) req_comp = 3; + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + // Read data - hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float)); + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); // Load image data // image data is stored as some number of sca @@ -5925,20 +6756,29 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re len <<= 8; len |= stbi__get8(s); if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4); + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } for (k = 0; k < 4; ++k) { + int nleft; i = 0; - while (i < width) { + while ((nleft = width - i) > 0) { count = stbi__get8(s); if (count > 128) { // Run value = stbi__get8(s); count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = value; } else { // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = stbi__get8(s); } @@ -5947,7 +6787,8 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re for (i=0; i < width; ++i) stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); } - STBI_FREE(scanline); + if (scanline) + STBI_FREE(scanline); } return hdr_data; @@ -5958,8 +6799,13 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) char buffer[STBI__HDR_BUFLEN]; char *token; int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; - if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) { + if (stbi__hdr_test(s) == 0) { stbi__rewind( s ); return 0; } @@ -5996,29 +6842,17 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) #ifndef STBI_NO_BMP static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) { - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') { - stbi__rewind( s ); - return 0; - } - stbi__skip(s,12); - hsz = stbi__get32le(s); - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) { - stbi__rewind( s ); - return 0; - } - if (hsz == 12) { - *x = stbi__get16le(s); - *y = stbi__get16le(s); - } else { - *x = stbi__get32le(s); - *y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) { - stbi__rewind( s ); - return 0; - } - *comp = stbi__get16le(s) / 8; + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + stbi__rewind( s ); + if (p == NULL) + return 0; + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) *comp = info.ma ? 4 : 3; return 1; } #endif @@ -6026,7 +6860,10 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) #ifndef STBI_NO_PSD static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) { - int channelCount; + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; if (stbi__get32be(s) != 0x38425053) { stbi__rewind( s ); return 0; @@ -6043,7 +6880,8 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) } *y = stbi__get32be(s); *x = stbi__get32be(s); - if (stbi__get16be(s) != 8) { + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { stbi__rewind( s ); return 0; } @@ -6054,22 +6892,61 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) *comp = 4; return 1; } + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + (void) stbi__get32be(s); + (void) stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} #endif #ifndef STBI_NO_PIC static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) { - int act_comp=0,num_packets=0,chained; + int act_comp=0,num_packets=0,chained,dummy; stbi__pic_packet packets[10]; - stbi__skip(s, 92); + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); *x = stbi__get16be(s); *y = stbi__get16be(s); - if (stbi__at_eof(s)) return 0; + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind( s ); - return 0; + stbi__rewind( s ); + return 0; } stbi__skip(s, 8); @@ -6129,16 +7006,22 @@ static int stbi__pnm_test(stbi__context *s) return 1; } -static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi_uc *out; + STBI_NOTUSED(ri); + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) return 0; + *x = s->img_x; *y = s->img_y; - *comp = s->img_n; + if (comp) *comp = s->img_n; + + if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "PNM too large"); - out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y); + out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); if (!out) return stbi__errpuc("outofmem", "Out of memory"); stbi__getn(s, out, s->img_n * s->img_x * s->img_y); @@ -6156,8 +7039,16 @@ static int stbi__pnm_isspace(char c) static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char) stbi__get8(s); + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } } static int stbi__pnm_isdigit(char c) @@ -6179,16 +7070,20 @@ static int stbi__pnm_getinteger(stbi__context *s, char *c) static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) { - int maxv; + int maxv, dummy; char c, p, t; - stbi__rewind( s ); + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); // Get identifier p = (char) stbi__get8(s); t = (char) stbi__get8(s); if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); + stbi__rewind(s); return 0; } @@ -6254,6 +7149,19 @@ static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) return stbi__err("unknown image type", "Image not of any known type, or corrupt"); } +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + return 0; +} + #ifndef STBI_NO_STDIO STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) { @@ -6275,6 +7183,27 @@ STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) fseek(f,pos,SEEK_SET); return r; } + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} #endif // !STBI_NO_STDIO STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) @@ -6291,10 +7220,63 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int return stbi__info_main(&s,x,y,comp); } +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + #endif // STB_IMAGE_IMPLEMENTATION /* revision history: + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit @@ -6435,3 +7417,46 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int 0.50 (2006-11-19) first released version */ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/src/stb_image_write.h b/src/stb_image_write.h index f5250b31272..c05e95812b9 100644 --- a/src/stb_image_write.h +++ b/src/stb_image_write.h @@ -1,7 +1,6 @@ -/* stb_image_write - v0.98 - public domain - http://nothings.org/stb/stb_image_write.h - writes out PNG/BMP/TGA images to C stdio - Sean Barrett 2010 - no warranty implied; use at your own risk - +/* stb_image_write - v1.09 - public domain - http://nothings.org/stb/stb_image_write.h + writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 + no warranty implied; use at your own risk Before #including, @@ -11,31 +10,67 @@ Will probably not work correctly with strict-aliasing optimizations. + If using a modern Microsoft Compiler, non-safe versions of CRT calls may cause + compilation warnings or even errors. To avoid this, also before #including, + + #define STBI_MSC_SECURE_CRT + ABOUT: This header file is a library for writing images to C stdio. It could be adapted to write to memory or a general streaming interface; let me know. The PNG output is not optimal; it is 20-50% larger than the file - written by a decent optimizing implementation. This library is designed - for source code compactness and simplicitly, not optimal image file size - or run-time performance. + written by a decent optimizing implementation; though providing a custom + zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. + This library is designed for source code compactness and simplicity, + not optimal image file size or run-time performance. BUILDING: You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace malloc,realloc,free. - You can define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function + for PNG compression (instead of the builtin one), it must have the following signature: + unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); + The returned data will be freed with STBIW_FREE() (free() by default), + so it must be heap allocated with STBIW_MALLOC() (malloc() by default), USAGE: - There are four functions, one for each image file format: + There are five functions, one for each image file format: int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); - int stbi_write_hdr(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); + int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); + + void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically + + There are also five equivalent functions that use an arbitrary write function. You are + expected to open/close your file-equivalent before and after calling these: + + int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); + int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + + where the callback is: + void stbi_write_func(void *context, void *data, int size); + + You can configure it with these global variables: + int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE + int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression + int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode + + + You can define STBI_WRITE_NO_STDIO to disable the file variant of these + functions, so the library will not use stdio.h at all. However, this will + also disable HDR writing, because it requires stdio for formatted output. Each function returns 0 on failure and non-0 on success. @@ -59,63 +94,138 @@ writer, both because it is in BGR order and because it may have padding at the end of the line.) + PNG allows you to set the deflate compression level by setting the global + variable 'stbi_write_png_compression_level' (it defaults to 8). + HDR expects linear float data. Since the format is always 32-bit rgb(e) data, alpha (if provided) is discarded, and for monochrome data it is replicated across all three channels. + TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed + data, set the global variable 'stbi_write_tga_with_rle' to 0. + + JPEG does ignore alpha channels in input data; quality is between 1 and 100. + Higher quality looks better but results in a bigger image. + JPEG baseline (no JPEG progressive). + CREDITS: - PNG/BMP/TGA - Sean Barrett - HDR - Baldur Karlsson - TGA monochrome: - Jean-Sebastien Guay - misc enhancements: - Tim Kelsey + + Sean Barrett - PNG/BMP/TGA + Baldur Karlsson - HDR + Jean-Sebastien Guay - TGA monochrome + Tim Kelsey - misc enhancements + Alan Hickman - TGA RLE + Emmanuel Julien - initial file IO callback implementation + Jon Olick - original jo_jpeg.cpp code + Daniel Gibson - integrate JPEG, allow external zlib + Aarni Koskela - allow choosing PNG filter + bugfixes: github:Chribba + Guillaume Chereau + github:jry2 + github:romigrou + Sergio Gonzalez + Jonas Karlsson + Filip Wasil + Thatcher Ulrich + github:poppolopoppo + Patrick Boettcher + github:xeekworx + Cap Petschulat + Simon Rodriguez + Ivan Tikhonov + github:ignotion + Adam Schackart + +LICENSE + + See end of file for license information. + */ #ifndef INCLUDE_STB_IMAGE_WRITE_H #define INCLUDE_STB_IMAGE_WRITE_H +// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' +#ifndef STBIWDEF +#ifdef STB_IMAGE_WRITE_STATIC +#define STBIWDEF static +#else #ifdef __cplusplus -extern "C" { +#define STBIWDEF extern "C" +#else +#define STBIWDEF extern +#endif +#endif #endif -extern int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); -extern int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); -extern int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); -extern int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations +extern int stbi_write_tga_with_rle; +extern int stbi_write_png_compression_level; +extern int stbi_write_force_png_filter; +#endif -#ifdef __cplusplus -} +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); #endif +typedef void stbi_write_func(void *context, void *data, int size); + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + +STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); + #endif//INCLUDE_STB_IMAGE_WRITE_H #ifdef STB_IMAGE_WRITE_IMPLEMENTATION +#ifdef _WIN32 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + #ifndef _CRT_NONSTDC_NO_DEPRECATE + #define _CRT_NONSTDC_NO_DEPRECATE + #endif +#endif + +#ifndef STBI_WRITE_NO_STDIO +#include +#endif // STBI_WRITE_NO_STDIO + #include #include -#include #include #include -#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && defined(STBIW_REALLOC) +#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) // ok -#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) +#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) // ok #else -#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC." +#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." #endif #ifndef STBIW_MALLOC -#define STBIW_MALLOC(sz) malloc(sz) -#define STBIW_REALLOC(p,sz) realloc(p,sz) -#define STBIW_FREE(p) free(p) +#define STBIW_MALLOC(sz) malloc(sz) +#define STBIW_REALLOC(p,newsz) realloc(p,newsz) +#define STBIW_FREE(p) free(p) +#endif + +#ifndef STBIW_REALLOC_SIZED +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) #endif + + #ifndef STBIW_MEMMOVE #define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) #endif @@ -126,22 +236,90 @@ extern int stbi_write_hdr(char const *filename, int w, int h, int comp, const fl #define STBIW_ASSERT(x) assert(x) #endif +#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) + +#ifdef STB_IMAGE_WRITE_STATIC +static int stbi__flip_vertically_on_write=0; +static int stbi_write_png_compression_level = 8; +static int stbi_write_tga_with_rle = 1; +static int stbi_write_force_png_filter = -1; +#else +int stbi_write_png_compression_level = 8; +int stbi__flip_vertically_on_write=0; +int stbi_write_tga_with_rle = 1; +int stbi_write_force_png_filter = -1; +#endif + +STBIWDEF void stbi_flip_vertically_on_write(int flag) +{ + stbi__flip_vertically_on_write = flag; +} + +typedef struct +{ + stbi_write_func *func; + void *context; +} stbi__write_context; + +// initialize a callback-based context +static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) +{ + s->func = c; + s->context = context; +} + +#ifndef STBI_WRITE_NO_STDIO + +static void stbi__stdio_write(void *context, void *data, int size) +{ + fwrite(data,1,size,(FILE*) context); +} + +static int stbi__start_write_file(stbi__write_context *s, const char *filename) +{ + FILE *f; +#ifdef STBI_MSC_SECURE_CRT + if (fopen_s(&f, filename, "wb")) + f = NULL; +#else + f = fopen(filename, "wb"); +#endif + stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); + return f != NULL; +} + +static void stbi__end_write_file(stbi__write_context *s) +{ + fclose((FILE *)s->context); +} + +#endif // !STBI_WRITE_NO_STDIO + typedef unsigned int stbiw_uint32; typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; -static void writefv(FILE *f, const char *fmt, va_list v) +static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) { while (*fmt) { switch (*fmt++) { case ' ': break; - case '1': { unsigned char x = (unsigned char) va_arg(v, int); fputc(x,f); break; } - case '2': { int x = va_arg(v,int); unsigned char b[2]; - b[0] = (unsigned char) x; b[1] = (unsigned char) (x>>8); - fwrite(b,2,1,f); break; } - case '4': { stbiw_uint32 x = va_arg(v,int); unsigned char b[4]; - b[0]=(unsigned char)x; b[1]=(unsigned char)(x>>8); - b[2]=(unsigned char)(x>>16); b[3]=(unsigned char)(x>>24); - fwrite(b,4,1,f); break; } + case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); + s->func(s->context,&x,1); + break; } + case '2': { int x = va_arg(v,int); + unsigned char b[2]; + b[0] = STBIW_UCHAR(x); + b[1] = STBIW_UCHAR(x>>8); + s->func(s->context,b,2); + break; } + case '4': { stbiw_uint32 x = va_arg(v,int); + unsigned char b[4]; + b[0]=STBIW_UCHAR(x); + b[1]=STBIW_UCHAR(x>>8); + b[2]=STBIW_UCHAR(x>>16); + b[3]=STBIW_UCHAR(x>>24); + s->func(s->context,b,4); + break; } default: STBIW_ASSERT(0); return; @@ -149,22 +327,70 @@ static void writefv(FILE *f, const char *fmt, va_list v) } } -static void write3(FILE *f, unsigned char a, unsigned char b, unsigned char c) +static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); +} + +static void stbiw__putc(stbi__write_context *s, unsigned char c) +{ + s->func(s->context, &c, 1); +} + +static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) { unsigned char arr[3]; arr[0] = a, arr[1] = b, arr[2] = c; - fwrite(arr, 3, 1, f); + s->func(s->context, arr, 3); } -static void write_pixels(FILE *f, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) { unsigned char bg[3] = { 255, 0, 255}, px[3]; + int k; + + if (write_alpha < 0) + s->func(s->context, &d[comp - 1], 1); + + switch (comp) { + case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case + case 1: + if (expand_mono) + stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp + else + s->func(s->context, d, 1); // monochrome TGA + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k = 0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; + stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); + break; + } + if (write_alpha > 0) + s->func(s->context, &d[comp - 1], 1); +} + +static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +{ stbiw_uint32 zero = 0; - int i,j,k, j_end; + int i,j, j_end; if (y <= 0) return; + if (stbi__flip_vertically_on_write) + vdir *= -1; + if (vdir < 0) j_end = -1, j = y-1; else @@ -173,73 +399,157 @@ static void write_pixels(FILE *f, int rgb_dir, int vdir, int x, int y, int comp, for (; j != j_end; j += vdir) { for (i=0; i < x; ++i) { unsigned char *d = (unsigned char *) data + (j*x+i)*comp; - if (write_alpha < 0) - fwrite(&d[comp-1], 1, 1, f); - switch (comp) { - case 1: fwrite(d, 1, 1, f); - break; - case 2: if (expand_mono) - write3(f, d[0],d[0],d[0]); // monochrome bmp - else - fwrite(d, 1, 1, f); // monochrome TGA - break; - case 4: - if (!write_alpha) { - // composite against pink background - for (k=0; k < 3; ++k) - px[k] = bg[k] + ((d[k] - bg[k]) * d[3])/255; - write3(f, px[1-rgb_dir],px[1],px[1+rgb_dir]); - break; - } - /* FALLTHROUGH */ - case 3: - write3(f, d[1-rgb_dir],d[1],d[1+rgb_dir]); - break; - } - if (write_alpha > 0) - fwrite(&d[comp-1], 1, 1, f); + stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); } - fwrite(&zero,scanline_pad,1,f); + s->func(s->context, &zero, scanline_pad); } } -static int outfile(char const *filename, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) +static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) { - FILE *f; - if (y < 0 || x < 0) return 0; - f = fopen(filename, "wb"); - if (f) { + if (y < 0 || x < 0) { + return 0; + } else { va_list v; va_start(v, fmt); - writefv(f, fmt, v); + stbiw__writefv(s, fmt, v); va_end(v); - write_pixels(f,rgb_dir,vdir,x,y,comp,data,alpha,pad,expand_mono); - fclose(f); + stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); + return 1; } - return f != NULL; } -int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) { int pad = (-x*3) & 3; - return outfile(filename,-1,-1,x,y,comp,1,(void *) data,0,pad, + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, "11 4 22 4" "4 44 22 444444", 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header } -int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_bmp_core(&s, x, y, comp, data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_bmp_core(&s, x, y, comp, data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif //!STBI_WRITE_NO_STDIO + +static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) { int has_alpha = (comp == 2 || comp == 4); int colorbytes = has_alpha ? comp-1 : comp; int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 - return outfile(filename, -1,-1, x, y, comp, 0, (void *) data, has_alpha, 0, - "111 221 2222 11", 0,0,format, 0,0,0, 0,0,x,y, (colorbytes+has_alpha)*8, has_alpha*8); + + if (y < 0 || x < 0) + return 0; + + if (!stbi_write_tga_with_rle) { + return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, + "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); + } else { + int i,j,k; + int jend, jdir; + + stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); + + if (stbi__flip_vertically_on_write) { + j = 0; + jend = y; + jdir = 1; + } else { + j = y-1; + jend = -1; + jdir = -1; + } + for (; j != jend; j += jdir) { + unsigned char *row = (unsigned char *) data + j * x * comp; + int len; + + for (i = 0; i < x; i += len) { + unsigned char *begin = row + i * comp; + int diff = 1; + len = 1; + + if (i < x - 1) { + ++len; + diff = memcmp(begin, row + (i + 1) * comp, comp); + if (diff) { + const unsigned char *prev = begin; + for (k = i + 2; k < x && len < 128; ++k) { + if (memcmp(prev, row + k * comp, comp)) { + prev += comp; + ++len; + } else { + --len; + break; + } + } + } else { + for (k = i + 2; k < x && len < 128; ++k) { + if (!memcmp(begin, row + k * comp, comp)) { + ++len; + } else { + break; + } + } + } + } + + if (diff) { + unsigned char header = STBIW_UCHAR(len - 1); + s->func(s->context, &header, 1); + for (k = 0; k < len; ++k) { + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); + } + } else { + unsigned char header = STBIW_UCHAR(len - 129); + s->func(s->context, &header, 1); + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); + } + } + } + } + return 1; +} + +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_tga_core(&s, x, y, comp, (void *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; } +#endif // ************************************************************************************************* // Radiance RGBE HDR writer // by Baldur Karlsson + #define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) @@ -247,7 +557,7 @@ void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) int exponent; float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); - if (maxcomp < 1e-32) { + if (maxcomp < 1e-32f) { rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; } else { float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; @@ -259,27 +569,27 @@ void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) } } -void stbiw__write_run_data(FILE *f, int length, unsigned char databyte) +void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) { - unsigned char lengthbyte = (unsigned char) (length+128); + unsigned char lengthbyte = STBIW_UCHAR(length+128); STBIW_ASSERT(length+128 <= 255); - fwrite(&lengthbyte, 1, 1, f); - fwrite(&databyte, 1, 1, f); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, &databyte, 1); } -void stbiw__write_dump_data(FILE *f, int length, unsigned char *data) +void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) { - unsigned char lengthbyte = (unsigned char )(length & 0xff); + unsigned char lengthbyte = STBIW_UCHAR(length); STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code - fwrite(&lengthbyte, 1, 1, f); - fwrite(data, length, 1, f); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, data, length); } -void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scratch, const float *scanline) +void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) { unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; unsigned char rgbe[4]; - float linear[3] = {0}; + float linear[3]; int x; scanlineheader[2] = (width&0xff00)>>8; @@ -288,31 +598,31 @@ void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scra /* skip RLE for images too small or large */ if (width < 8 || width >= 32768) { for (x=0; x < width; x++) { - switch (comp) { + switch (ncomp) { case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*comp + 2]; - linear[1] = scanline[x*comp + 1]; - linear[0] = scanline[x*comp + 0]; + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; break; - case 2: /* fallthrough */ - case 1: linear[0] = linear[1] = linear[2] = scanline[x*comp + 0]; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; break; } stbiw__linear_to_rgbe(rgbe, linear); - fwrite(rgbe, 4, 1, f); + s->func(s->context, rgbe, 4); } } else { int c,r; /* encode into scratch buffer */ for (x=0; x < width; x++) { - switch(comp) { + switch(ncomp) { case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*comp + 2]; - linear[1] = scanline[x*comp + 1]; - linear[0] = scanline[x*comp + 0]; + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; break; - case 2: /* fallthrough */ - case 1: linear[0] = linear[1] = linear[2] = scanline[x*comp + 0]; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; break; } stbiw__linear_to_rgbe(rgbe, linear); @@ -322,7 +632,7 @@ void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scra scratch[x + width*3] = rgbe[3]; } - fwrite(scanlineheader, 4, 1, f); + s->func(s->context, scanlineheader, 4); /* RLE each component separately */ for (c=0; c < 4; c++) { @@ -343,7 +653,7 @@ void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scra while (x < r) { int len = r-x; if (len > 128) len = 128; - stbiw__write_dump_data(f, len, &comp[x]); + stbiw__write_dump_data(s, len, &comp[x]); x += len; } // if there's a run, output it @@ -355,7 +665,7 @@ void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scra while (x < r) { int len = r-x; if (len > 127) len = 127; - stbiw__write_run_data(f, len, comp[x]); + stbiw__write_run_data(s, len, comp[x]); x += len; } } @@ -364,28 +674,59 @@ void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scra } } -int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) { - int i; - FILE *f; - if (y <= 0 || x <= 0 || data == NULL) return 0; - f = fopen(filename, "wb"); - if (f) { - /* Each component is stored separately. Allocate scratch space for full output scanline. */ + if (y <= 0 || x <= 0 || data == NULL) + return 0; + else { + // Each component is stored separately. Allocate scratch space for full output scanline. unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); - fprintf(f, "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n" ); - fprintf(f, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n" , y, x); + int i, len; + char buffer[128]; + char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; + s->func(s->context, header, sizeof(header)-1); + +#ifdef STBI_MSC_SECURE_CRT + len = sprintf_s(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#else + len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#endif + s->func(s->context, buffer, len); + for(i=0; i < y; i++) - stbiw__write_hdr_scanline(f, x, comp, scratch, data + comp*i*x); + stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)*x); STBIW_FREE(scratch); - fclose(f); + return 1; } - return f != NULL; } -///////////////////////////////////////////////////////// -// PNG +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) +{ + stbi__write_context s; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_hdr_core(&s, x, y, comp, (float *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +{ + stbi__write_context s; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif // STBI_WRITE_NO_STDIO + +////////////////////////////////////////////////////////////////////////////// +// +// PNG writer +// + +#ifndef STBIW_ZLIB_COMPRESS // stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() #define stbiw__sbraw(a) ((int *) (a) - 2) #define stbiw__sbm(a) stbiw__sbraw(a)[0] @@ -402,7 +743,7 @@ int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *da static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) { int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; - void *p = STBIW_REALLOC(*arr ? stbiw__sbraw(*arr) : 0, itemsize * m + sizeof(int)*2); + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); STBIW_ASSERT(p); if (p) { if (!*arr) ((int *) p)[1] = 0; @@ -415,7 +756,7 @@ static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) { while (*bitcount >= 8) { - stbiw__sbpush(data, (unsigned char) *bitbuffer); + stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); *bitbuffer >>= 8; *bitcount -= 8; } @@ -466,8 +807,14 @@ static unsigned int stbiw__zhash(unsigned char *data) #define stbiw__ZHASH 16384 +#endif // STBIW_ZLIB_COMPRESS + unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) { +#ifdef STBIW_ZLIB_COMPRESS + // user provided a zlib compress implementation, use that + return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); +#else // use builtin static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; @@ -475,7 +822,9 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l unsigned int bitbuf=0; int i,j, bitcount=0; unsigned char *out = NULL; - unsigned char **hash_table[stbiw__ZHASH]; // 64KB on the stack! + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(char**)); + if (hash_table == NULL) + return NULL; if (quality < 5) quality = 5; stbiw__sbpush(out, 0x78); // DEFLATE 32K window @@ -547,43 +896,77 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l for (i=0; i < stbiw__ZHASH; ++i) (void) stbiw__sbfree(hash_table[i]); + STBIW_FREE(hash_table); { // compute adler32 on input - unsigned int i=0, s1=1, s2=0, blocklen = data_len % 5552; - int j=0; + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; while (j < data_len) { for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1; s1 %= 65521, s2 %= 65521; j += blocklen; blocklen = 5552; } - stbiw__sbpush(out, (unsigned char) (s2 >> 8)); - stbiw__sbpush(out, (unsigned char) s2); - stbiw__sbpush(out, (unsigned char) (s1 >> 8)); - stbiw__sbpush(out, (unsigned char) s1); + stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s2)); + stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s1)); } *out_len = stbiw__sbn(out); // make returned pointer freeable STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); return (unsigned char *) stbiw__sbraw(out); +#endif // STBIW_ZLIB_COMPRESS } -unsigned int stbiw__crc32(unsigned char *buffer, int len) +static unsigned int stbiw__crc32(unsigned char *buffer, int len) { - static unsigned int crc_table[256]; + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + unsigned int crc = ~0u; - int i,j; - if (crc_table[1] == 0) - for(i=0; i < 256; i++) - for (crc_table[i]=i, j=0; j < 8; ++j) - crc_table[i] = (crc_table[i] >> 1) ^ (crc_table[i] & 1 ? 0xedb88320 : 0); + int i; for (i=0; i < len; ++i) crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; return ~crc; } -#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=(unsigned char)(a),(o)[1]=(unsigned char)(b),(o)[2]=(unsigned char)(c),(o)[3]=(unsigned char)(d),(o)+=4) +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) #define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); #define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) @@ -596,66 +979,94 @@ static void stbiw__wpcrc(unsigned char **data, int len) static unsigned char stbiw__paeth(int a, int b, int c) { int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); - if (pa <= pb && pa <= pc) return (unsigned char) a; - if (pb <= pc) return (unsigned char) b; - return (unsigned char) c; + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +// @OPTIMIZE: provide an option that always forces left-predict or paeth predict +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); + int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; + for (i = 0; i < n; ++i) { + switch (type) { + case 0: line_buffer[i] = z[i]; break; + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + for (i=n; i < width*n; ++i) { + switch (type) { + case 0: line_buffer[i] = z[i]; break; + case 1: line_buffer[i] = z[i] - z[i-n]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } + } } unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) { + int force_filter = stbi_write_force_png_filter; int ctype[5] = { -1, 0, 4, 2, 6 }; unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; unsigned char *out,*o, *filt, *zlib; signed char *line_buffer; - int i,j,k,p,zlen; + int j,zlen; if (stride_bytes == 0) stride_bytes = x * n; + if (force_filter >= 5) { + force_filter = -1; + } + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } for (j=0; j < y; ++j) { - static int mapping[] = { 0,1,2,3,4 }; - static int firstmap[] = { 0,1,0,5,6 }; - int *mymap = j ? mapping : firstmap; - int best = 0, bestval = 0x7fffffff; - for (p=0; p < 2; ++p) { - for (k= p?best:0; k < 5; ++k) { - int type = mymap[k],est=0; - unsigned char *z = pixels + stride_bytes*j; - for (i=0; i < n; ++i) - switch (type) { - case 0: line_buffer[i] = z[i]; break; - case 1: line_buffer[i] = z[i]; break; - case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break; - case 3: line_buffer[i] = z[i] - (z[i-stride_bytes]>>1); break; - case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-stride_bytes],0)); break; - case 5: line_buffer[i] = z[i]; break; - case 6: line_buffer[i] = z[i]; break; - } - for (i=n; i < x*n; ++i) { - switch (type) { - case 0: line_buffer[i] = z[i]; break; - case 1: line_buffer[i] = z[i] - z[i-n]; break; - case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break; - case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-stride_bytes])>>1); break; - case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-stride_bytes], z[i-stride_bytes-n]); break; - case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break; - case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; - } - } - if (p) break; - for (i=0; i < x*n; ++i) + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, force_filter, line_buffer); + } else { // Estimate the best filter by running through all of them: + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, filter_type, line_buffer); + + // Estimate the entropy of the line using this filter; the less, the better. + est = 0; + for (i = 0; i < x*n; ++i) { est += abs((signed char) line_buffer[i]); - if (est < bestval) { bestval = est; best = k; } + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it + stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, best_filter, line_buffer); + filter_type = best_filter; } } - // when we get here, best contains the filter type, and line_buffer contains the data - filt[j*(x*n+1)] = (unsigned char) best; + // when we get here, filter_type contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) filter_type; STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); } STBIW_FREE(line_buffer); - zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); // increase 8 to get smaller but use more memory + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); STBIW_FREE(filt); if (!zlib) return 0; @@ -671,7 +1082,7 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in stbiw__wp32(o, x); stbiw__wp32(o, y); *o++ = 8; - *o++ = (unsigned char) ctype[n]; + *o++ = STBIW_UCHAR(ctype[n]); *o++ = 0; *o++ = 0; *o++ = 0; @@ -693,22 +1104,407 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in return out; } -int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) { FILE *f; int len; unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); - if (!png) return 0; + if (png == NULL) return 0; +#ifdef STBI_MSC_SECURE_CRT + if (fopen_s(&f, filename, "wb")) + f = NULL; +#else f = fopen(filename, "wb"); +#endif if (!f) { STBIW_FREE(png); return 0; } fwrite(png, 1, len, f); fclose(f); STBIW_FREE(png); return 1; } +#endif + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) +{ + int len; + unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + func(context, png, len); + STBIW_FREE(png); + return 1; +} + + +/* *************************************************************************** + * + * JPEG writer + * + * This is based on Jon Olick's jo_jpeg.cpp: + * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html + */ + +static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, + 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; + +static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { + int bitBuf = *bitBufP, bitCnt = *bitCntP; + bitCnt += bs[1]; + bitBuf |= bs[0] << (24 - bitCnt); + while(bitCnt >= 8) { + unsigned char c = (bitBuf >> 16) & 255; + stbiw__putc(s, c); + if(c == 255) { + stbiw__putc(s, 0); + } + bitBuf <<= 8; + bitCnt -= 8; + } + *bitBufP = bitBuf; + *bitCntP = bitCnt; +} + +static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { + float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; + float z1, z2, z3, z4, z5, z11, z13; + + float tmp0 = d0 + d7; + float tmp7 = d0 - d7; + float tmp1 = d1 + d6; + float tmp6 = d1 - d6; + float tmp2 = d2 + d5; + float tmp5 = d2 - d5; + float tmp3 = d3 + d4; + float tmp4 = d3 - d4; + + // Even part + float tmp10 = tmp0 + tmp3; // phase 2 + float tmp13 = tmp0 - tmp3; + float tmp11 = tmp1 + tmp2; + float tmp12 = tmp1 - tmp2; + + d0 = tmp10 + tmp11; // phase 3 + d4 = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781f; // c4 + d2 = tmp13 + z1; // phase 5 + d6 = tmp13 - z1; + + // Odd part + tmp10 = tmp4 + tmp5; // phase 2 + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + // The rotator is modified from fig 4-8 to avoid extra negations. + z5 = (tmp10 - tmp12) * 0.382683433f; // c6 + z2 = tmp10 * 0.541196100f + z5; // c2-c6 + z4 = tmp12 * 1.306562965f + z5; // c2+c6 + z3 = tmp11 * 0.707106781f; // c4 + + z11 = tmp7 + z3; // phase 5 + z13 = tmp7 - z3; + + *d5p = z13 + z2; // phase 6 + *d3p = z13 - z2; + *d1p = z11 + z4; + *d7p = z11 - z4; + + *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; +} + +static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { + int tmp1 = val < 0 ? -val : val; + val = val < 0 ? val-1 : val; + bits[1] = 1; + while(tmp1 >>= 1) { + ++bits[1]; + } + bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { + } + // end0pos = first element in reverse order !=0 + if(end0pos == 0) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + return DU[0]; + } + for(i = 1; i <= end0pos; ++i) { + int startpos = i; + int nrzeroes; + unsigned short bits[2]; + for (; DU[i]==0 && i<=end0pos; ++i) { + } + nrzeroes = i-startpos; + if ( nrzeroes >= 16 ) { + int lng = nrzeroes>>4; + int nrmarker; + for (nrmarker=1; nrmarker <= lng; ++nrmarker) + stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); + nrzeroes &= 15; + } + stbiw__jpg_calcBits(DU[i], bits); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); + } + if(end0pos != 63) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + } + return DU[0]; +} + +static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { + // Constants that don't pollute global namespace + static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; + static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; + static const unsigned char std_ac_luminance_values[] = { + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; + static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; + static const unsigned char std_ac_chrominance_values[] = { + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + // Huffman tables + static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; + static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; + static const unsigned short YAC_HT[256][2] = { + {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const unsigned short UVAC_HT[256][2] = { + {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, + 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; + static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; + static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, + 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; + + int row, col, i, k; + float fdtbl_Y[64], fdtbl_UV[64]; + unsigned char YTable[64], UVTable[64]; + + if(!data || !width || !height || comp > 4 || comp < 1) { + return 0; + } + + quality = quality ? quality : 90; + quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; + quality = quality < 50 ? 5000 / quality : 200 - quality * 2; + + for(i = 0; i < 64; ++i) { + int uvti, yti = (YQT[i]*quality+50)/100; + YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); + uvti = (UVQT[i]*quality+50)/100; + UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); + } + + for(row = 0, k = 0; row < 8; ++row) { + for(col = 0; col < 8; ++col, ++k) { + fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + } + } + + // Write Headers + { + static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; + static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; + const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), + 3,1,0x11,0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; + s->func(s->context, (void*)head0, sizeof(head0)); + s->func(s->context, (void*)YTable, sizeof(YTable)); + stbiw__putc(s, 1); + s->func(s->context, UVTable, sizeof(UVTable)); + s->func(s->context, (void*)head1, sizeof(head1)); + s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); + s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); + stbiw__putc(s, 0x10); // HTYACinfo + s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); + s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); + stbiw__putc(s, 1); // HTUDCinfo + s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); + stbiw__putc(s, 0x11); // HTUACinfo + s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); + s->func(s->context, (void*)head2, sizeof(head2)); + } + + // Encode 8x8 macroblocks + { + static const unsigned short fillBits[] = {0x7F, 7}; + const unsigned char *imageData = (const unsigned char *)data; + int DCY=0, DCU=0, DCV=0; + int bitBuf=0, bitCnt=0; + // comp == 2 is grey+alpha (alpha is ignored) + int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; + int x, y, pos; + for(y = 0; y < height; y += 8) { + for(x = 0; x < width; x += 8) { + float YDU[64], UDU[64], VDU[64]; + for(row = y, pos = 0; row < y+8; ++row) { + for(col = x; col < x+8; ++col, ++pos) { + int p = (stbi__flip_vertically_on_write ? height-1-row : row)*width*comp + col*comp; + float r, g, b; + if(row >= height) { + p -= width*comp*(row+1 - height); + } + if(col >= width) { + p -= comp*(col+1 - width); + } + + r = imageData[p+0]; + g = imageData[p+ofsG]; + b = imageData[p+ofsB]; + YDU[pos]=+0.29900f*r+0.58700f*g+0.11400f*b-128; + UDU[pos]=-0.16874f*r-0.33126f*g+0.50000f*b; + VDU[pos]=+0.50000f*r-0.41869f*g-0.08131f*b; + } + } + + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + + // Do the bit alignment of the EOI marker + stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); + } + + // EOI + stbiw__putc(s, 0xFF); + stbiw__putc(s, 0xD9); + + return 1; +} + +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); +} + + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + #endif // STB_IMAGE_WRITE_IMPLEMENTATION /* Revision history + 1.09 (2018-02-11) + fix typo in zlib quality API, improve STB_I_W_STATIC in C++ + 1.08 (2018-01-29) + add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter + 1.07 (2017-07-24) + doc fix + 1.06 (2017-07-23) + writing JPEG (using Jon Olick's code) + 1.05 ??? + 1.04 (2017-03-03) + monochrome BMP expansion + 1.03 ??? + 1.02 (2016-04-02) + avoid allocating large structures on the stack + 1.01 (2016-01-16) + STBIW_REALLOC_SIZED: support allocators with no realloc support + avoid race-condition in crc initialization + minor compile issues + 1.00 (2015-09-14) + installable file IO function + 0.99 (2015-09-13) + warning fixes; TGA rle support 0.98 (2015-04-08) added STBIW_MALLOC, STBIW_ASSERT etc 0.97 (2015-01-18) @@ -728,3 +1524,45 @@ int stbi_write_png(char const *filename, int x, int y, int comp, const void *dat first public release 0.90 first internal release */ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ From 060faa268de7bf45126fbc1ee775f6af091fc8ed Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 25 Mar 2018 22:25:49 -0700 Subject: [PATCH 075/118] what's everyone's favorite dubstep artists? i like skrillex and knife party --- cfg/yolov3-voc.cfg | 58 +++++++++------------------------------------- 1 file changed, 11 insertions(+), 47 deletions(-) diff --git a/cfg/yolov3-voc.cfg b/cfg/yolov3-voc.cfg index 78b3fcb182e..959b50ac0c7 100644 --- a/cfg/yolov3-voc.cfg +++ b/cfg/yolov3-voc.cfg @@ -605,28 +605,16 @@ pad=1 filters=75 activation=linear - -[region] -mask = 6,7,8 +[yolo] +mask = 0,1,2 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -bias_match=1 classes=20 -coords=4 num=9 -softmax=0 jitter=.3 -rescore=0 - -object_scale=1 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .5 +ignore_thresh = .5 +truth_thresh = 1 random=1 - [route] layers = -4 @@ -701,29 +689,16 @@ pad=1 filters=75 activation=linear - -[region] -mask = 3,4,5 +[yolo] +mask = 0,1,2 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -bias_match=1 classes=20 -coords=4 num=9 -softmax=0 jitter=.3 -rescore=0 - -object_scale=1 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .5 +ignore_thresh = .5 +truth_thresh = 1 random=1 - - [route] layers = -4 @@ -798,24 +773,13 @@ pad=1 filters=75 activation=linear - -[region] +[yolo] mask = 0,1,2 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -bias_match=1 classes=20 -coords=4 num=9 -softmax=0 jitter=.3 -rescore=0 - -object_scale=1 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .5 +ignore_thresh = .5 +truth_thresh = 1 random=1 From e4acba689c89e223636efe7dabe8f55ae019cd8a Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 25 Mar 2018 23:05:20 -0700 Subject: [PATCH 076/118] slowly but surely... --- cfg/yolov3-voc.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cfg/yolov3-voc.cfg b/cfg/yolov3-voc.cfg index 959b50ac0c7..3f3e8dfb31b 100644 --- a/cfg/yolov3-voc.cfg +++ b/cfg/yolov3-voc.cfg @@ -606,7 +606,7 @@ filters=75 activation=linear [yolo] -mask = 0,1,2 +mask = 6,7,8 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=20 num=9 @@ -690,7 +690,7 @@ filters=75 activation=linear [yolo] -mask = 0,1,2 +mask = 3,4,5 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=20 num=9 From 698d54cb5f7f490eeeffa6d91936a829085a13cc Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 26 Mar 2018 08:57:43 -0700 Subject: [PATCH 077/118] YOLOv3 ON CPU!!!! --- examples/detector.c | 4 ++-- src/blas.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/detector.c b/examples/detector.c index 685b8705070..72a88e8537e 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -572,7 +572,7 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam double time; char buff[256]; char *input = buff; - float nms=.3; + float nms=0; while(1){ if(filename){ strncpy(input, filename, 256); @@ -598,7 +598,7 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time); int nboxes = 0; detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes); - printf("%d\n", nboxes); + //printf("%d\n", nboxes); //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms); if (nms) do_nms_sort(dets, nboxes, l.classes, nms); draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes); diff --git a/src/blas.c b/src/blas.c index a1bb5554efa..9e1604449ba 100644 --- a/src/blas.c +++ b/src/blas.c @@ -339,7 +339,7 @@ void upsample_cpu(float *in, int w, int h, int c, int batch, int stride, int for for(j = 0; j < h*stride; ++j){ for(i = 0; i < w*stride; ++i){ int in_index = b*w*h*c + k*w*h + (j/stride)*w + i/stride; - int out_index = b*w*h*c + k*w*h + j*w + i; + int out_index = b*w*h*c*stride*stride + k*w*h*stride*stride + j*w*stride + i; if(forward) out[out_index] = scale*in[in_index]; else in[in_index] += scale*out[out_index]; } From 76a0d8fb6d4faf4179d7d12ee6e5007a7408b643 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 26 Mar 2018 08:59:39 -0700 Subject: [PATCH 078/118] =?UTF-8?q?=F0=9F=94=A5=F0=9F=94=A5=F0=9F=94=A5?= =?UTF-8?q?=F0=9F=94=A5=F0=9F=94=A5=F0=9F=94=A5=F0=9F=94=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/detector.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/detector.c b/examples/detector.c index 72a88e8537e..326e07f1b6e 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -572,7 +572,7 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam double time; char buff[256]; char *input = buff; - float nms=0; + float nms=.45; while(1){ if(filename){ strncpy(input, filename, 256); From 6f6e4754ba99e42ea0870eb6ec878e48a9f7e7ae Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Mon, 26 Mar 2018 09:06:59 -0700 Subject: [PATCH 079/118] added tensorflow kite image to show how easy it is --- data/kite.jpg | Bin 0 -> 1415684 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/kite.jpg diff --git a/data/kite.jpg b/data/kite.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9eb325ac5fc375cb2513380087dd713be9be19d8 GIT binary patch literal 1415684 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

CHL3}D(gNVe0gJOTk>?s(;?qvU7O_lxgS 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ȟAW?yM-S}DgPA|A7?7EGlt{;7~wbv_XM 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%0DBb^V6EGh*&=5My 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 Wis0iHI-1AWU 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%0Avn3xwPiCFi1(yplP#6mDe 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 z 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%0AIIcTm)F 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

`7yJJhk&3dvIE|)(mJUMW8%Yxmh1;^ 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
CZiS% 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
Oq=J`x1PuNQ}4 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ⅆ-t1V-#S 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�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

}a-ep0aZS>#CQ(51gESRd}7kkta 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

)Ze(8uf2#M%^-Q^m1fAw>p5x9fW= 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 z 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 Date: Wed, 28 Mar 2018 17:40:27 +0200 Subject: [PATCH 080/118] Update yolov2-tiny.cfg --- cfg/yolov2-tiny.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cfg/yolov2-tiny.cfg b/cfg/yolov2-tiny.cfg index 6e0c8ea70e7..df06dd4fcc6 100644 --- a/cfg/yolov2-tiny.cfg +++ b/cfg/yolov2-tiny.cfg @@ -120,7 +120,7 @@ filters=425 activation=linear [region] -anchors = 18.3274,21.6763, 59.9827,66.001, 106.83,175.179, 252.25,112.889, 312.657,293.385 +anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 bias_match=1 classes=80 coords=4 From 897c346ced83ef762e11a3dfe5d70e1cdba17d7b Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 28 Mar 2018 11:54:14 -0700 Subject: [PATCH 081/118] fixed tiny --- cfg/yolov2-tiny.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cfg/yolov2-tiny.cfg b/cfg/yolov2-tiny.cfg index 6e0c8ea70e7..81d0ac45d6d 100644 --- a/cfg/yolov2-tiny.cfg +++ b/cfg/yolov2-tiny.cfg @@ -120,7 +120,7 @@ filters=425 activation=linear [region] -anchors = 18.3274,21.6763, 59.9827,66.001, 106.83,175.179, 252.25,112.889, 312.657,293.385 +anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 bias_match=1 classes=80 coords=4 From 508381b37fe75e0e1a01bcb2941cb0b31eb0e4c9 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 10 Apr 2018 16:25:25 -0700 Subject: [PATCH 082/118] time stuff woof --- src/utils.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/utils.c b/src/utils.c index 4e4efc2c57e..626b4678c1e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "utils.h" @@ -25,9 +26,11 @@ double get_wall_time() double what_time_is_it_now() { - struct timespec now; - clock_gettime(CLOCK_REALTIME, &now); - return now.tv_sec + now.tv_nsec*1e-9; + struct timeval time; + if (gettimeofday(&time,NULL)){ + return 0; + } + return (double)time.tv_sec + (double)time.tv_usec * .000001; } int *read_intlist(char *gpu_list, int *ngpus, int d) From e7405b513dc69f17e9e75e8d306d22f2e08c1489 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Fri, 4 May 2018 01:28:59 -0700 Subject: [PATCH 083/118] softmax does cost now, special case 1x1 convs --- Makefile | 4 ++-- cfg/alexnet.cfg | 3 --- cfg/cifar.cfg | 3 --- cfg/cifar.test.cfg | 2 -- cfg/darknet19.cfg | 3 --- cfg/darknet19_448.cfg | 3 --- cfg/densenet201.cfg | 3 --- cfg/extraction.cfg | 3 --- cfg/extraction22k.cfg | 3 --- cfg/go.cfg | 3 --- cfg/go.test.cfg | 2 -- cfg/gru.cfg | 2 -- cfg/resnet152.cfg | 3 --- cfg/resnet50.cfg | 2 -- cfg/rnn.cfg | 2 -- cfg/rnn.train.cfg | 2 -- cfg/strided.cfg | 3 --- cfg/tiny.cfg | 2 -- cfg/vgg-16.cfg | 2 -- src/convolutional_kernels.cu | 26 +++++++++++++++++--------- src/convolutional_layer.c | 30 ++++++++++++++++++++++-------- 21 files changed, 41 insertions(+), 65 deletions(-) diff --git a/Makefile b/Makefile index 1f310448802..b1f93c4ce2d 100644 --- a/Makefile +++ b/Makefile @@ -68,8 +68,8 @@ EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA)) OBJS = $(addprefix $(OBJDIR), $(OBJ)) DEPS = $(wildcard src/*.h) Makefile include/darknet.h -#all: obj backup results $(SLIB) $(ALIB) $(EXEC) -all: obj results $(SLIB) $(ALIB) $(EXEC) +all: obj backup results $(SLIB) $(ALIB) $(EXEC) +#all: obj results $(SLIB) $(ALIB) $(EXEC) $(EXEC): $(EXECOBJ) $(ALIB) diff --git a/cfg/alexnet.cfg b/cfg/alexnet.cfg index 7e5a9b26a57..0458735f886 100644 --- a/cfg/alexnet.cfg +++ b/cfg/alexnet.cfg @@ -90,6 +90,3 @@ activation=linear [softmax] groups=1 -[cost] -type=sse - diff --git a/cfg/cifar.cfg b/cfg/cifar.cfg index c10fae5751c..b2f69f53903 100644 --- a/cfg/cifar.cfg +++ b/cfg/cifar.cfg @@ -119,6 +119,3 @@ activation=leaky [softmax] groups=1 - -[cost] - diff --git a/cfg/cifar.test.cfg b/cfg/cifar.test.cfg index d3afcdd79b7..18b6c54c909 100644 --- a/cfg/cifar.test.cfg +++ b/cfg/cifar.test.cfg @@ -115,5 +115,3 @@ activation=leaky groups=1 temperature=3 -[cost] - diff --git a/cfg/darknet19.cfg b/cfg/darknet19.cfg index f56a46e2e7a..28ac9669ef6 100644 --- a/cfg/darknet19.cfg +++ b/cfg/darknet19.cfg @@ -203,6 +203,3 @@ activation=linear [softmax] groups=1 -[cost] -type=sse - diff --git a/cfg/darknet19_448.cfg b/cfg/darknet19_448.cfg index 133c688eb1d..c6df7306d3e 100644 --- a/cfg/darknet19_448.cfg +++ b/cfg/darknet19_448.cfg @@ -195,6 +195,3 @@ activation=linear [softmax] groups=1 -[cost] -type=sse - diff --git a/cfg/densenet201.cfg b/cfg/densenet201.cfg index 5e1e7dd1fda..65b4aecc52d 100644 --- a/cfg/densenet201.cfg +++ b/cfg/densenet201.cfg @@ -1949,6 +1949,3 @@ activation=linear [softmax] groups=1 -[cost] -type=sse - diff --git a/cfg/extraction.cfg b/cfg/extraction.cfg index 94e106754ef..e18d5c0db1e 100644 --- a/cfg/extraction.cfg +++ b/cfg/extraction.cfg @@ -201,6 +201,3 @@ activation=leaky [softmax] groups=1 -[cost] -type=sse - diff --git a/cfg/extraction22k.cfg b/cfg/extraction22k.cfg index 4cec6da9605..b5f54090d00 100644 --- a/cfg/extraction22k.cfg +++ b/cfg/extraction22k.cfg @@ -204,6 +204,3 @@ activation=leaky [softmax] groups=1 -[cost] -type=sse - diff --git a/cfg/go.cfg b/cfg/go.cfg index 77d20c4da1b..c730092ff3f 100644 --- a/cfg/go.cfg +++ b/cfg/go.cfg @@ -130,6 +130,3 @@ stride=1 [softmax] -[cost] -type=sse - diff --git a/cfg/go.test.cfg b/cfg/go.test.cfg index ba15c2e57c4..1e4e43809bf 100644 --- a/cfg/go.test.cfg +++ b/cfg/go.test.cfg @@ -129,6 +129,4 @@ stride=1 [softmax] -[cost] -type=sse diff --git a/cfg/gru.cfg b/cfg/gru.cfg index a68d3fc51d0..4ce9b180a64 100644 --- a/cfg/gru.cfg +++ b/cfg/gru.cfg @@ -27,6 +27,4 @@ activation=linear [softmax] -[cost] -type=sse diff --git a/cfg/resnet152.cfg b/cfg/resnet152.cfg index d5fe90948a2..e8e3297ac23 100644 --- a/cfg/resnet152.cfg +++ b/cfg/resnet152.cfg @@ -1458,6 +1458,3 @@ activation=linear [softmax] groups=1 -[cost] -type=sse - diff --git a/cfg/resnet50.cfg b/cfg/resnet50.cfg index bfe69b18e3b..8c4d01febc4 100644 --- a/cfg/resnet50.cfg +++ b/cfg/resnet50.cfg @@ -506,6 +506,4 @@ activation=linear [softmax] groups=1 -[cost] -type=sse diff --git a/cfg/rnn.cfg b/cfg/rnn.cfg index 68c032d27f9..61b202f3a44 100644 --- a/cfg/rnn.cfg +++ b/cfg/rnn.cfg @@ -35,6 +35,4 @@ activation=leaky [softmax] -[cost] -type=sse diff --git a/cfg/rnn.train.cfg b/cfg/rnn.train.cfg index 9139757faa7..b9748990ace 100644 --- a/cfg/rnn.train.cfg +++ b/cfg/rnn.train.cfg @@ -35,6 +35,4 @@ activation=leaky [softmax] -[cost] -type=sse diff --git a/cfg/strided.cfg b/cfg/strided.cfg index a52700b4303..2f745085adc 100644 --- a/cfg/strided.cfg +++ b/cfg/strided.cfg @@ -180,6 +180,3 @@ activation=ramp [softmax] -[cost] -type=sse - diff --git a/cfg/tiny.cfg b/cfg/tiny.cfg index ba686f56aca..f97327cfcee 100644 --- a/cfg/tiny.cfg +++ b/cfg/tiny.cfg @@ -171,6 +171,4 @@ activation=linear [softmax] groups=1 -[cost] -type=sse diff --git a/cfg/vgg-16.cfg b/cfg/vgg-16.cfg index 2b6f7029b70..79694b87ec9 100644 --- a/cfg/vgg-16.cfg +++ b/cfg/vgg-16.cfg @@ -148,6 +148,4 @@ activation=linear [softmax] groups=1 -[cost] -type=sse diff --git a/src/convolutional_kernels.cu b/src/convolutional_kernels.cu index 8fa2ab2ef5d..4a1047b8743 100644 --- a/src/convolutional_kernels.cu +++ b/src/convolutional_kernels.cu @@ -111,9 +111,13 @@ void forward_convolutional_layer_gpu(convolutional_layer l, network net) float *a = l.weights_gpu + j*l.nweights/l.groups; float *b = net.workspace; float *c = l.output_gpu + (i*l.groups + j)*n*m; + float *im = net.input_gpu + (i*l.groups + j)*l.c/l.groups*l.h*l.w; - im2col_gpu(net.input_gpu + (i*l.groups + j)*l.c/l.groups*l.h*l.w, - l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, b); + if (l.size == 1){ + b = im; + } else { + im2col_gpu(im, l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, b); + } gemm_gpu(0,0,m,n,k,1,a,k,b,n,1,c,n); } } @@ -236,22 +240,26 @@ void backward_convolutional_layer_gpu(convolutional_layer l, network net) float *b = net.workspace; float *c = l.weight_updates_gpu + j*l.nweights/l.groups; - float *im = net.input_gpu+(i*l.groups + j)*l.c/l.groups*l.h*l.w; + float *im = net.input_gpu+(i*l.groups + j)*l.c/l.groups*l.h*l.w; + float *imd = net.delta_gpu+(i*l.groups + j)*l.c/l.groups*l.h*l.w; - im2col_gpu(im, l.c/l.groups, l.h, l.w, - l.size, l.stride, l.pad, b); + im2col_gpu(im, l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, b); gemm_gpu(0,1,m,n,k,1,a,k,b,k,1,c,n); - if(net.delta_gpu){ - if(l.binary || l.xnor) swap_binary(&l); + if (net.delta_gpu) { + if (l.binary || l.xnor) swap_binary(&l); a = l.weights_gpu + j*l.nweights/l.groups; b = l.delta_gpu + (i*l.groups + j)*m*k; c = net.workspace; + if (l.size == 1) { + c = imd; + } gemm_gpu(1,0,n,k,m,1,a,n,b,k,0,c,k); - col2im_gpu(net.workspace, l.c/l.groups, l.h, l.w, l.size, l.stride, - l.pad, net.delta_gpu + (i*l.groups + j)*l.c/l.groups*l.h*l.w); + if (l.size != 1) { + col2im_gpu(net.workspace, l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, imd); + } if(l.binary || l.xnor) { swap_binary(&l); } diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index e4fb9bde047..5ac9ef0d241 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -463,9 +463,13 @@ void forward_convolutional_layer(convolutional_layer l, network net) float *a = l.weights + j*l.nweights/l.groups; float *b = net.workspace; float *c = l.output + (i*l.groups + j)*n*m; + float *im = net.input + (i*l.groups + j)*l.c/l.groups*l.h*l.w; - im2col_cpu(net.input + (i*l.groups + j)*l.c/l.groups*l.h*l.w, - l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, b); + if (l.size == 1) { + b = im; + } else { + im2col_cpu(im, l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, b); + } gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); } } @@ -501,21 +505,31 @@ void backward_convolutional_layer(convolutional_layer l, network net) float *b = net.workspace; float *c = l.weight_updates + j*l.nweights/l.groups; - float *im = net.input+(i*l.groups + j)*l.c/l.groups*l.h*l.w; + float *im = net.input + (i*l.groups + j)*l.c/l.groups*l.h*l.w; + float *imd = net.delta + (i*l.groups + j)*l.c/l.groups*l.h*l.w; + + if(l.size == 1){ + b = im; + } else { + im2col_cpu(im, l.c/l.groups, l.h, l.w, + l.size, l.stride, l.pad, b); + } - im2col_cpu(im, l.c/l.groups, l.h, l.w, - l.size, l.stride, l.pad, b); gemm(0,1,m,n,k,1,a,k,b,k,1,c,n); - if(net.delta){ + if (net.delta) { a = l.weights + j*l.nweights/l.groups; b = l.delta + (i*l.groups + j)*m*k; c = net.workspace; + if (l.size == 1) { + c = imd; + } gemm(1,0,n,k,m,1,a,n,b,k,0,c,k); - col2im_cpu(net.workspace, l.c/l.groups, l.h, l.w, l.size, l.stride, - l.pad, net.delta + (i*l.groups + j)*l.c/l.groups*l.h*l.w); + if (l.size != 1) { + col2im_cpu(net.workspace, l.c/l.groups, l.h, l.w, l.size, l.stride, l.pad, imd); + } } } } From 481d9d98abc8ef1225feac45d04a9514935832bf Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Sun, 6 May 2018 10:40:30 -0700 Subject: [PATCH 084/118] yolov3-tiny :fire: :fire: :fire: --- cfg/yolov3-tiny.cfg | 182 ++++++++++++++++++++++++++++++++++++++++++++ cfg/yolov3.cfg | 6 +- src/yolo_layer.c | 2 +- 3 files changed, 186 insertions(+), 4 deletions(-) create mode 100644 cfg/yolov3-tiny.cfg diff --git a/cfg/yolov3-tiny.cfg b/cfg/yolov3-tiny.cfg new file mode 100644 index 00000000000..42c0fcf9195 --- /dev/null +++ b/cfg/yolov3-tiny.cfg @@ -0,0 +1,182 @@ +[net] +# Testing +batch=1 +subdivisions=1 +# Training +# batch=64 +# subdivisions=2 +width=416 +height=416 +channels=3 +momentum=0.9 +decay=0.0005 +angle=0 +saturation = 1.5 +exposure = 1.5 +hue=.1 + +learning_rate=0.001 +burn_in=1000 +max_batches = 500200 +policy=steps +steps=400000,450000 +scales=.1,.1 + +[convolutional] +batch_normalize=1 +filters=16 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=1 + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +########### + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + + +[yolo] +mask = 3,4,5 +anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 +classes=80 +num=6 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 8 + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + +[yolo] +mask = 1,2,3 +anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 +classes=80 +num=6 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 diff --git a/cfg/yolov3.cfg b/cfg/yolov3.cfg index 5f3ab621302..4a0ecc3320e 100644 --- a/cfg/yolov3.cfg +++ b/cfg/yolov3.cfg @@ -610,7 +610,7 @@ anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 37 classes=80 num=9 jitter=.3 -ignore_thresh = .5 +ignore_thresh = .7 truth_thresh = 1 random=1 @@ -696,7 +696,7 @@ anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 37 classes=80 num=9 jitter=.3 -ignore_thresh = .5 +ignore_thresh = .7 truth_thresh = 1 random=1 @@ -783,7 +783,7 @@ anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 37 classes=80 num=9 jitter=.3 -ignore_thresh = .5 +ignore_thresh = .7 truth_thresh = 1 random=1 diff --git a/src/yolo_layer.c b/src/yolo_layer.c index af714d46a3d..c3380363cd3 100644 --- a/src/yolo_layer.c +++ b/src/yolo_layer.c @@ -54,7 +54,7 @@ layer make_yolo_layer(int batch, int w, int h, int n, int total, int *mask, int l.delta_gpu = cuda_make_array(l.delta, batch*l.outputs); #endif - fprintf(stderr, "detection\n"); + fprintf(stderr, "yolo\n"); srand(0); return l; From 49ba88d9f73cf80ed657823a80fefb4b929414a5 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 1 Aug 2018 15:36:20 -0700 Subject: [PATCH 085/118] YOLOv3 with spatial pyramid pooling, or something --- cfg/yolov3-spp.cfg | 822 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 822 insertions(+) create mode 100644 cfg/yolov3-spp.cfg diff --git a/cfg/yolov3-spp.cfg b/cfg/yolov3-spp.cfg new file mode 100644 index 00000000000..4ad2a052d88 --- /dev/null +++ b/cfg/yolov3-spp.cfg @@ -0,0 +1,822 @@ +[net] +# Testing +batch=1 +subdivisions=1 +# Training +# batch=64 +# subdivisions=16 +width=608 +height=608 +channels=3 +momentum=0.9 +decay=0.0005 +angle=0 +saturation = 1.5 +exposure = 1.5 +hue=.1 + +learning_rate=0.001 +burn_in=1000 +max_batches = 500200 +policy=steps +steps=400000,450000 +scales=.1,.1 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +# Downsample + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +###################### + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +### SPP ### +[maxpool] +stride=1 +size=5 + +[route] +layers=-2 + +[maxpool] +stride=1 +size=9 + +[route] +layers=-4 + +[maxpool] +stride=1 +size=13 + +[route] +layers=-1,-3,-5,-6 + +### End SPP ### + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 6,7,8 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 61 + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 3,4,5 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 36 + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 0,1,2 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + From e209b3bbbf52d7cae56b0b8e320ab1bd31a60bf8 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 2 Aug 2018 23:45:54 -0700 Subject: [PATCH 086/118] tweak to maxpool layers --- src/maxpool_layer.c | 8 ++++---- src/maxpool_layer_kernels.cu | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/maxpool_layer.c b/src/maxpool_layer.c index 17dedf7a14c..202c0295847 100644 --- a/src/maxpool_layer.c +++ b/src/maxpool_layer.c @@ -27,8 +27,8 @@ maxpool_layer make_maxpool_layer(int batch, int h, int w, int c, int size, int s l.w = w; l.c = c; l.pad = padding; - l.out_w = (w + 2*padding)/stride; - l.out_h = (h + 2*padding)/stride; + l.out_w = (w + 2*padding - size)/stride + 1; + l.out_h = (h + 2*padding - size)/stride + 1; l.out_c = c; l.outputs = l.out_h * l.out_w * l.out_c; l.inputs = h*w*c; @@ -57,8 +57,8 @@ void resize_maxpool_layer(maxpool_layer *l, int w, int h) l->w = w; l->inputs = h*w*l->c; - l->out_w = (w + 2*l->pad)/l->stride; - l->out_h = (h + 2*l->pad)/l->stride; + l->out_w = (w + 2*l->pad - l->size)/l->stride + 1; + l->out_h = (h + 2*l->pad - l->size)/l->stride + 1; l->outputs = l->out_w * l->out_h * l->c; int output_size = l->outputs * l->batch; diff --git a/src/maxpool_layer_kernels.cu b/src/maxpool_layer_kernels.cu index 3202e84b695..e294e1e8259 100644 --- a/src/maxpool_layer_kernels.cu +++ b/src/maxpool_layer_kernels.cu @@ -9,8 +9,8 @@ extern "C" { __global__ void forward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c, int stride, int size, int pad, float *input, float *output, int *indexes) { - int h = (in_h + 2*pad)/stride; - int w = (in_w + 2*pad)/stride; + int h = (in_h + 2*pad - size)/stride + 1; + int w = (in_w + 2*pad - size)/stride + 1; int c = in_c; int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; @@ -49,8 +49,8 @@ __global__ void forward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c __global__ void backward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c, int stride, int size, int pad, float *delta, float *prev_delta, int *indexes) { - int h = (in_h + 2*pad)/stride; - int w = (in_w + 2*pad)/stride; + int h = (in_h + 2*pad - size)/stride + 1; + int w = (in_w + 2*pad - size)/stride + 1; int c = in_c; int area = (size-1)/stride; From b13f67bfdd87434e141af532cdb5dc1b8369aa3b Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Fri, 3 Aug 2018 15:57:48 -0700 Subject: [PATCH 087/118] this'll teach me to mess with maxpooling --- Makefile | 4 +- examples/art.c | 4 +- examples/classifier.c | 51 ++++++- examples/coco.c | 6 +- examples/darknet.c | 3 + examples/detector.c | 4 +- examples/instance-segmenter.c | 265 ++++++++++++++++++++++++++++++++++ examples/lsd.c | 33 ++--- examples/nightmare.c | 8 +- examples/regressor.c | 4 +- examples/segmenter.c | 29 ++-- examples/super.c | 2 +- examples/yolo.c | 6 +- include/darknet.h | 9 +- src/convolutional_layer.c | 6 +- src/data.c | 95 +++++++++++- src/image.c | 30 ++-- src/iseg_layer.c | 219 ++++++++++++++++++++++++++++ src/iseg_layer.h | 19 +++ src/maxpool_layer.c | 12 +- src/maxpool_layer_kernels.cu | 16 +- src/parser.c | 38 +++-- src/softmax_layer.c | 4 +- 23 files changed, 737 insertions(+), 130 deletions(-) create mode 100644 examples/instance-segmenter.c create mode 100644 src/iseg_layer.c create mode 100644 src/iseg_layer.h diff --git a/Makefile b/Makefile index b1f93c4ce2d..a1e4604f605 100644 --- a/Makefile +++ b/Makefile @@ -57,8 +57,8 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o yolo_layer.o -EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o darknet.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o yolo_layer.o iseg_layer.o +EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o instance-segmenter.o darknet.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o avgpool_layer_kernels.o diff --git a/examples/art.c b/examples/art.c index 7d58c5d9c32..ce8855408b4 100644 --- a/examples/art.c +++ b/examples/art.c @@ -24,7 +24,6 @@ void demo_art(char *cfgfile, char *weightfile, int cam_index) while(1){ image in = get_image_from_stream(cap); image in_s = resize_image(in, net->w, net->h); - show_image(in, window); float *p = network_predict(net, in_s.data); @@ -45,10 +44,9 @@ void demo_art(char *cfgfile, char *weightfile, int cam_index) } printf("]\n"); + show_image(in, window, 1); free_image(in_s); free_image(in); - - cvWaitKey(1); } #endif } diff --git a/examples/classifier.c b/examples/classifier.c index d118ea58c07..2a89da62e8c 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -645,6 +645,45 @@ void label_classifier(char *datacfg, char *filename, char *weightfile) } } +void csv_classifier(char *datacfg, char *cfgfile, char *weightfile) +{ + int i,j; + network *net = load_network(cfgfile, weightfile, 0); + srand(time(0)); + + list *options = read_data_cfg(datacfg); + + char *test_list = option_find_str(options, "test", "data/test.list"); + int top = option_find_int(options, "top", 1); + + list *plist = get_paths(test_list); + + char **paths = (char **)list_to_array(plist); + int m = plist->size; + free_list(plist); + int *indexes = calloc(top, sizeof(int)); + + for(i = 0; i < m; ++i){ + double time = what_time_is_it_now(); + char *path = paths[i]; + image im = load_image_color(path, 0, 0); + image r = letterbox_image(im, net->w, net->h); + float *predictions = network_predict(net, r.data); + if(net->hierarchy) hierarchy_predictions(predictions, net->outputs, net->hierarchy, 1, 1); + top_k(predictions, net->outputs, top, indexes); + + printf("%s", path); + for(j = 0; j < top; ++j){ + printf("\t%d", indexes[j]); + } + printf("\n"); + + free_image(im); + free_image(r); + + fprintf(stderr, "%lf seconds, %d images, %d total\n", what_time_is_it_now() - time, i+1, m); + } +} void test_classifier(char *datacfg, char *cfgfile, char *weightfile, int target_layer) { @@ -869,8 +908,7 @@ void threat_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_i } if(1){ - show_image(out, "Threat"); - cvWaitKey(10); + show_image(out, "Threat", 10); } free_image(in_s); free_image(in); @@ -922,7 +960,6 @@ void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_inde image in = get_image_from_stream(cap); image in_s = resize_image(in, net->w, net->h); - show_image(in, "Threat Detection"); float *predictions = network_predict(net, in_s.data); top_predictions(net, top, indexes); @@ -947,11 +984,10 @@ void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_inde } } + show_image(in, "Threat Detection", 10); free_image(in_s); free_image(in); - cvWaitKey(10); - gettimeofday(&tval_after, NULL); timersub(&tval_after, &tval_before, &tval_result); float curr = 1000000.f/((long int)tval_result.tv_usec); @@ -1036,12 +1072,10 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind free_image(label); } - show_image(in, base); + show_image(in, base, 10); free_image(in_s); free_image(in); - cvWaitKey(10); - gettimeofday(&tval_after, NULL); timersub(&tval_after, &tval_before, &tval_result); float curr = 1000000.f/((long int)tval_result.tv_usec); @@ -1080,6 +1114,7 @@ void run_classifier(int argc, char **argv) else if(0==strcmp(argv[2], "gun")) gun_classifier(data, cfg, weights, cam_index, filename); else if(0==strcmp(argv[2], "threat")) threat_classifier(data, cfg, weights, cam_index, filename); else if(0==strcmp(argv[2], "test")) test_classifier(data, cfg, weights, layer); + else if(0==strcmp(argv[2], "csv")) csv_classifier(data, cfg, weights); else if(0==strcmp(argv[2], "label")) label_classifier(data, cfg, weights); else if(0==strcmp(argv[2], "valid")) validate_classifier_single(data, cfg, weights); else if(0==strcmp(argv[2], "validmulti")) validate_classifier_multi(data, cfg, weights); diff --git a/examples/coco.c b/examples/coco.c index 6b01dcd6564..6a50b89abd2 100644 --- a/examples/coco.c +++ b/examples/coco.c @@ -325,14 +325,10 @@ void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh) draw_detections(im, dets, l.side*l.side*l.n, thresh, coco_classes, alphabet, 80); save_image(im, "prediction"); - show_image(im, "predictions"); + show_image(im, "predictions", 0); free_detections(dets, nboxes); free_image(im); free_image(sized); -#ifdef OPENCV - cvWaitKey(0); - cvDestroyAllWindows(); -#endif if (filename) break; } } diff --git a/examples/darknet.c b/examples/darknet.c index 51e04c13949..99b0d64f868 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -14,6 +14,7 @@ extern void run_nightmare(int argc, char **argv); extern void run_classifier(int argc, char **argv); extern void run_regressor(int argc, char **argv); extern void run_segmenter(int argc, char **argv); +extern void run_isegmenter(int argc, char **argv); extern void run_char_rnn(int argc, char **argv); extern void run_tag(int argc, char **argv); extern void run_cifar(int argc, char **argv); @@ -452,6 +453,8 @@ int main(int argc, char **argv) run_classifier(argc, argv); } else if (0 == strcmp(argv[1], "regressor")){ run_regressor(argc, argv); + } else if (0 == strcmp(argv[1], "isegmenter")){ + run_isegmenter(argc, argv); } else if (0 == strcmp(argv[1], "segmenter")){ run_segmenter(argc, argv); } else if (0 == strcmp(argv[1], "art")){ diff --git a/examples/detector.c b/examples/detector.c index 326e07f1b6e..b503fc608ed 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -613,9 +613,7 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam if(fullscreen){ cvSetWindowProperty("predictions", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); } - show_image(im, "predictions"); - cvWaitKey(0); - cvDestroyAllWindows(); + show_image(im, "predictions", 0); #endif } diff --git a/examples/instance-segmenter.c b/examples/instance-segmenter.c new file mode 100644 index 00000000000..96d8545ff37 --- /dev/null +++ b/examples/instance-segmenter.c @@ -0,0 +1,265 @@ +#include "darknet.h" +#include +#include + +void train_isegmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int display) +{ + int i; + + float avg_loss = -1; + char *base = basecfg(cfgfile); + printf("%s\n", base); + printf("%d\n", ngpus); + network **nets = calloc(ngpus, sizeof(network*)); + + srand(time(0)); + int seed = rand(); + for(i = 0; i < ngpus; ++i){ + srand(seed); +#ifdef GPU + cuda_set_device(gpus[i]); +#endif + nets[i] = load_network(cfgfile, weightfile, clear); + nets[i]->learning_rate *= ngpus; + } + srand(time(0)); + network *net = nets[0]; + image pred = get_network_image(net); + + int div = net->w/pred.w; + assert(pred.w * div == net->w); + assert(pred.h * div == net->h); + + int imgs = net->batch * net->subdivisions * ngpus; + + printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay); + list *options = read_data_cfg(datacfg); + + char *backup_directory = option_find_str(options, "backup", "/backup/"); + char *train_list = option_find_str(options, "train", "data/train.list"); + + list *plist = get_paths(train_list); + char **paths = (char **)list_to_array(plist); + printf("%d\n", plist->size); + int N = plist->size; + + load_args args = {0}; + args.w = net->w; + args.h = net->h; + args.threads = 32; + args.scale = div; + args.num_boxes = 90; + + args.min = net->min_crop; + args.max = net->max_crop; + args.angle = net->angle; + args.aspect = net->aspect; + args.exposure = net->exposure; + args.saturation = net->saturation; + args.hue = net->hue; + args.size = net->w; + args.classes = 80; + + args.paths = paths; + args.n = imgs; + args.m = N; + args.type = ISEG_DATA; + + data train; + data buffer; + pthread_t load_thread; + args.d = &buffer; + load_thread = load_data(args); + + int epoch = (*net->seen)/N; + while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ + double time = what_time_is_it_now(); + + pthread_join(load_thread, 0); + train = buffer; + load_thread = load_data(args); + + printf("Loaded: %lf seconds\n", what_time_is_it_now()-time); + time = what_time_is_it_now(); + + float loss = 0; +#ifdef GPU + if(ngpus == 1){ + loss = train_network(net, train); + } else { + loss = train_networks(nets, ngpus, train, 4); + } +#else + loss = train_network(net, train); +#endif + if(display){ + image tr = float_to_image(net->w/div, net->h/div, 80, train.y.vals[net->batch*(net->subdivisions-1)]); + image im = float_to_image(net->w, net->h, net->c, train.X.vals[net->batch*(net->subdivisions-1)]); + pred.c = 80; + image mask = mask_to_rgb(tr); + image prmask = mask_to_rgb(pred); + show_image(im, "input", 1); + show_image(prmask, "pred", 1); + show_image(mask, "truth", 100); + free_image(mask); + free_image(prmask); + } + if(avg_loss == -1) avg_loss = loss; + avg_loss = avg_loss*.9 + loss*.1; + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen); + free_data(train); + if(*net->seen/N > epoch){ + epoch = *net->seen/N; + char buff[256]; + sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch); + save_weights(net, buff); + } + if(get_current_batch(net)%100 == 0){ + char buff[256]; + sprintf(buff, "%s/%s.backup",backup_directory,base); + save_weights(net, buff); + } + } + char buff[256]; + sprintf(buff, "%s/%s.weights", backup_directory, base); + save_weights(net, buff); + + free_network(net); + free_ptrs((void**)paths, plist->size); + free_list(plist); + free(base); +} + +void predict_isegmenter(char *datafile, char *cfg, char *weights, char *filename) +{ + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); + srand(2222222); + + clock_t time; + char buff[256]; + char *input = buff; + while(1){ + if(filename){ + strncpy(input, filename, 256); + }else{ + printf("Enter Image Path: "); + fflush(stdout); + input = fgets(input, 256, stdin); + if(!input) return; + strtok(input, "\n"); + } + image im = load_image_color(input, 0, 0); + image sized = letterbox_image(im, net->w, net->h); + + float *X = sized.data; + time=clock(); + float *predictions = network_predict(net, X); + image pred = get_network_image(net); + image prmask = mask_to_rgb(pred); + printf("Predicted: %f\n", predictions[0]); + printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + show_image(sized, "orig", 1); + show_image(prmask, "pred", 0); + free_image(im); + free_image(sized); + free_image(prmask); + if (filename) break; + } +} + + +void demo_isegmenter(char *datacfg, char *cfg, char *weights, int cam_index, const char *filename) +{ +#ifdef OPENCV + printf("Classifier Demo\n"); + network *net = load_network(cfg, weights, 0); + set_batch_network(net, 1); + + srand(2222222); + CvCapture * cap; + + if(filename){ + cap = cvCaptureFromFile(filename); + }else{ + cap = cvCaptureFromCAM(cam_index); + } + + if(!cap) error("Couldn't connect to webcam.\n"); + cvNamedWindow("Segmenter", CV_WINDOW_NORMAL); + cvResizeWindow("Segmenter", 512, 512); + float fps = 0; + + while(1){ + struct timeval tval_before, tval_after, tval_result; + gettimeofday(&tval_before, NULL); + + image in = get_image_from_stream(cap); + image in_s = letterbox_image(in, net->w, net->h); + + network_predict(net, in_s.data); + + printf("\033[2J"); + printf("\033[1;1H"); + printf("\nFPS:%.0f\n",fps); + + image pred = get_network_image(net); + image prmask = mask_to_rgb(pred); + show_image(prmask, "Segmenter", 10); + + free_image(in_s); + free_image(in); + free_image(prmask); + + gettimeofday(&tval_after, NULL); + timersub(&tval_after, &tval_before, &tval_result); + float curr = 1000000.f/((long int)tval_result.tv_usec); + fps = .9*fps + .1*curr; + } +#endif +} + + +void run_isegmenter(int argc, char **argv) +{ + if(argc < 4){ + fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]); + return; + } + + char *gpu_list = find_char_arg(argc, argv, "-gpus", 0); + int *gpus = 0; + int gpu = 0; + int ngpus = 0; + if(gpu_list){ + printf("%s\n", gpu_list); + int len = strlen(gpu_list); + ngpus = 1; + int i; + for(i = 0; i < len; ++i){ + if (gpu_list[i] == ',') ++ngpus; + } + gpus = calloc(ngpus, sizeof(int)); + for(i = 0; i < ngpus; ++i){ + gpus[i] = atoi(gpu_list); + gpu_list = strchr(gpu_list, ',')+1; + } + } else { + gpu = gpu_index; + gpus = &gpu; + ngpus = 1; + } + + int cam_index = find_int_arg(argc, argv, "-c", 0); + int clear = find_arg(argc, argv, "-clear"); + int display = find_arg(argc, argv, "-display"); + char *data = argv[3]; + char *cfg = argv[4]; + char *weights = (argc > 5) ? argv[5] : 0; + char *filename = (argc > 6) ? argv[6]: 0; + if(0==strcmp(argv[2], "test")) predict_isegmenter(data, cfg, weights, filename); + else if(0==strcmp(argv[2], "train")) train_isegmenter(data, cfg, weights, gpus, ngpus, clear, display); + else if(0==strcmp(argv[2], "demo")) demo_isegmenter(data, cfg, weights, cam_index, filename); +} + + diff --git a/examples/lsd.c b/examples/lsd.c index ef46c459b5d..4ab944c884b 100644 --- a/examples/lsd.c +++ b/examples/lsd.c @@ -460,13 +460,9 @@ void inter_dcgan(char *cfgfile, char *weightfile) printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); //char buff[256]; sprintf(buff, "out%05d", c); - show_image(out, "out"); save_image(out, "out"); save_image(out, buff); -#ifdef OPENCV - //cvWaitKey(0); -#endif - + show_image(out, "out", 0); } } @@ -499,11 +495,8 @@ void test_dcgan(char *cfgfile, char *weightfile) //yuv_to_rgb(out); normalize_image(out); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - show_image(out, "out"); save_image(out, "out"); -#ifdef OPENCV - cvWaitKey(0); -#endif + show_image(out, "out", 0); free_image(im); } @@ -639,11 +632,10 @@ void train_prog(char *cfg, char *weight, char *acfg, char *aweight, int clear, i if(display){ image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]); image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); - show_image(im, "gen"); - show_image(im2, "train"); + show_image(im, "gen", 1); + show_image(im2, "train", 1); save_image(im, "gen"); save_image(im2, "train"); - cvWaitKey(1); } #endif @@ -826,11 +818,10 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, if(display){ image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]); image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); - show_image(im, "gen"); - show_image(im2, "train"); + show_image(im, "gen", 1); + show_image(im2, "train", 1); save_image(im, "gen"); save_image(im2, "train"); - cvWaitKey(1); } #endif @@ -1010,9 +1001,8 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle if(display){ image im = float_to_image(anet->w, anet->h, anet->c, gray.X.vals[0]); image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]); - show_image(im, "gen"); - show_image(im2, "train"); - cvWaitKey(1); + show_image(im, "gen", 1); + show_image(im2, "train", 1); } #endif free_data(merge); @@ -1342,12 +1332,9 @@ void test_lsd(char *cfg, char *weights, char *filename, int gray) //yuv_to_rgb(out); constrain_image(out); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); - show_image(out, "out"); - show_image(crop, "crop"); save_image(out, "out"); -#ifdef OPENCV - cvWaitKey(0); -#endif + show_image(out, "out", 1); + show_image(crop, "crop", 0); free_image(im); free_image(resized); diff --git a/examples/nightmare.c b/examples/nightmare.c index 8ec6e966369..2978eb61193 100644 --- a/examples/nightmare.c +++ b/examples/nightmare.c @@ -376,10 +376,7 @@ void run_nightmare(int argc, char **argv) if(reconstruct){ reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size, 1); //if ((n+1)%30 == 0) rate *= .5; - show_image(im, "reconstruction"); -#ifdef OPENCV - cvWaitKey(10); -#endif + show_image(im, "reconstruction", 10); }else{ int layer = max_layer + rand()%range - range/2; int octave = rand()%octaves; @@ -400,8 +397,7 @@ void run_nightmare(int argc, char **argv) } printf("%d %s\n", e, buff); save_image(im, buff); - //show_image(im, buff); - //cvWaitKey(0); + //show_image(im, buff, 0); if(rotate){ image rot = rotate_image(im, rotate); diff --git a/examples/regressor.c b/examples/regressor.c index 60a9f2b942b..0bd7aba0ba4 100644 --- a/examples/regressor.c +++ b/examples/regressor.c @@ -179,7 +179,6 @@ void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_inde image in = get_image_from_stream(cap); image crop = center_crop_image(in, net->w, net->h); grayscale_image_3c(crop); - show_image(crop, "Regressor"); float *predictions = network_predict(net, crop.data); @@ -192,11 +191,10 @@ void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_inde printf("%s: %f\n", names[i], predictions[i]); } + show_image(crop, "Regressor", 10); free_image(in); free_image(crop); - cvWaitKey(10); - gettimeofday(&tval_after, NULL); timersub(&tval_after, &tval_before, &tval_result); float curr = 1000000.f/((long int)tval_result.tv_usec); diff --git a/examples/segmenter.c b/examples/segmenter.c index d73aceb3b82..eadfd69aa44 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -42,7 +42,6 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, char **paths = (char **)list_to_array(plist); printf("%d\n", plist->size); int N = plist->size; - clock_t time; load_args args = {0}; args.w = net->w; @@ -73,14 +72,14 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int epoch = (*net->seen)/N; while(get_current_batch(net) < net->max_batches || net->max_batches == 0){ - time=clock(); + double time = what_time_is_it_now(); pthread_join(load_thread, 0); train = buffer; load_thread = load_data(args); - printf("Loaded: %lf seconds\n", sec(clock()-time)); - time=clock(); + printf("Loaded: %lf seconds\n", what_time_is_it_now()-time); + time = what_time_is_it_now(); float loss = 0; #ifdef GPU @@ -97,18 +96,15 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, image im = float_to_image(net->w, net->h, net->c, train.X.vals[net->batch*(net->subdivisions-1)]); image mask = mask_to_rgb(tr); image prmask = mask_to_rgb(pred); - show_image(im, "input"); - show_image(prmask, "pred"); - show_image(mask, "truth"); -#ifdef OPENCV - cvWaitKey(100); -#endif + show_image(im, "input", 1); + show_image(prmask, "pred", 1); + show_image(mask, "truth", 100); free_image(mask); free_image(prmask); } if(avg_loss == -1) avg_loss = loss; avg_loss = avg_loss*.9 + loss*.1; - printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen); + printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen); free_data(train); if(*net->seen/N > epoch){ epoch = *net->seen/N; @@ -159,13 +155,10 @@ void predict_segmenter(char *datafile, char *cfg, char *weights, char *filename) float *predictions = network_predict(net, X); image pred = get_network_image(net); image prmask = mask_to_rgb(pred); - show_image(sized, "orig"); - show_image(prmask, "pred"); -#ifdef OPENCV - cvWaitKey(0); -#endif printf("Predicted: %f\n", predictions[0]); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); + show_image(sized, "orig", 1); + show_image(prmask, "pred", 0); free_image(im); free_image(sized); free_image(prmask); @@ -210,14 +203,12 @@ void demo_segmenter(char *datacfg, char *cfg, char *weights, int cam_index, cons image pred = get_network_image(net); image prmask = mask_to_rgb(pred); - show_image(prmask, "Segmenter"); + show_image(prmask, "Segmenter", 10); free_image(in_s); free_image(in); free_image(prmask); - cvWaitKey(10); - gettimeofday(&tval_after, NULL); timersub(&tval_after, &tval_before, &tval_result); float curr = 1000000.f/((long int)tval_result.tv_usec); diff --git a/examples/super.c b/examples/super.c index 89a8e562892..d34406b1f2c 100644 --- a/examples/super.c +++ b/examples/super.c @@ -93,7 +93,7 @@ void test_super(char *cfgfile, char *weightfile, char *filename) image out = get_network_image(net); printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time)); save_image(out, "out"); - show_image(out, "out"); + show_image(out, "out", 0); free_image(im); if (filename) break; diff --git a/examples/yolo.c b/examples/yolo.c index aa728163643..4ddb69a3e53 100644 --- a/examples/yolo.c +++ b/examples/yolo.c @@ -296,14 +296,10 @@ void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh) draw_detections(im, dets, l.side*l.side*l.n, thresh, voc_names, alphabet, 20); save_image(im, "predictions"); - show_image(im, "predictions"); + show_image(im, "predictions", 0); free_detections(dets, nboxes); free_image(im); free_image(sized); -#ifdef OPENCV - cvWaitKey(0); - cvDestroyAllWindows(); -#endif if (filename) break; } } diff --git a/include/darknet.h b/include/darknet.h index 9327ea8ca06..abe4e5bfc34 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -86,6 +86,7 @@ typedef enum { XNOR, REGION, YOLO, + ISEG, REORG, UPSAMPLE, LOGXENT, @@ -166,6 +167,7 @@ struct layer{ float ratio; float learning_rate_scale; float clip; + int noloss; int softmax; int classes; int coords; @@ -203,6 +205,7 @@ struct layer{ int dontload; int dontsave; int dontloadscales; + int numload; float temperature; float probability; @@ -213,6 +216,8 @@ struct layer{ int * input_layers; int * input_sizes; int * map; + int * counts; + float ** sums; float * rand; float * cost; float * state; @@ -540,7 +545,7 @@ typedef struct{ } data; typedef enum { - CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA, SEGMENTATION_DATA, INSTANCE_DATA + CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA, TAG_DATA, OLD_CLASSIFICATION_DATA, STUDY_DATA, DET_DATA, SUPER_DATA, LETTERBOX_DATA, REGRESSION_DATA, SEGMENTATION_DATA, INSTANCE_DATA, ISEG_DATA } data_type; typedef struct load_args{ @@ -705,7 +710,7 @@ int resize_network(network *net, int w, int h); void free_matrix(matrix m); void test_resize(char *filename); void save_image(image p, const char *name); -void show_image(image p, const char *name); +int show_image(image p, const char *name, int ms); image copy_image(image p); void draw_box_width(image a, int x1, int y1, int x2, int y2, int w, float r, float g, float b); float get_current_rate(network *net); diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c index 5ac9ef0d241..1fb58b0933b 100644 --- a/src/convolutional_layer.c +++ b/src/convolutional_layer.c @@ -151,7 +151,7 @@ void cudnn_convolutional_setup(layer *l) l->convDesc, l->dstTensorDesc, CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT, - 4000000000, + 2000000000, &l->fw_algo); cudnnGetConvolutionBackwardDataAlgorithm(cudnn_handle(), l->weightDesc, @@ -159,7 +159,7 @@ void cudnn_convolutional_setup(layer *l) l->convDesc, l->dsrcTensorDesc, CUDNN_CONVOLUTION_BWD_DATA_SPECIFY_WORKSPACE_LIMIT, - 4000000000, + 2000000000, &l->bd_algo); cudnnGetConvolutionBackwardFilterAlgorithm(cudnn_handle(), l->srcTensorDesc, @@ -167,7 +167,7 @@ void cudnn_convolutional_setup(layer *l) l->convDesc, l->dweightDesc, CUDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT, - 4000000000, + 2000000000, &l->bf_algo); } #endif diff --git a/src/data.c b/src/data.c index 51900f2600f..a5d69f263d7 100644 --- a/src/data.c +++ b/src/data.c @@ -361,6 +361,44 @@ box bound_image(image im) } void fill_truth_iseg(char *path, int num_boxes, float *truth, int classes, int w, int h, augment_args aug, int flip, int mw, int mh) +{ + char labelpath[4096]; + find_replace(path, "images", "mask", labelpath); + find_replace(labelpath, "JPEGImages", "mask", labelpath); + find_replace(labelpath, ".jpg", ".txt", labelpath); + find_replace(labelpath, ".JPG", ".txt", labelpath); + find_replace(labelpath, ".JPEG", ".txt", labelpath); + FILE *file = fopen(labelpath, "r"); + if(!file) file_error(labelpath); + char buff[32788]; + int id; + int i = 0; + int j; + image part = make_image(w, h, 1); + while((fscanf(file, "%d %s", &id, buff) == 2) && i < num_boxes){ + int n = 0; + int *rle = read_intlist(buff, &n, 0); + load_rle(part, rle, n); + image sized = rotate_crop_image(part, aug.rad, aug.scale, aug.w, aug.h, aug.dx, aug.dy, aug.aspect); + if(flip) flip_image(sized); + + image mask = resize_image(sized, mw, mh); + truth[i*(mw*mh+1)] = id; + for(j = 0; j < mw*mh; ++j){ + truth[i*(mw*mh + 1) + 1 + j] = mask.data[j]; + } + ++i; + + free_image(mask); + free_image(sized); + free(rle); + } + if(i < num_boxes) truth[i*(mw*mh+1)] = -1; + fclose(file); + free_image(part); +} + +void fill_truth_mask(char *path, int num_boxes, float *truth, int classes, int w, int h, augment_args aug, int flip, int mw, int mh) { char labelpath[4096]; find_replace(path, "images", "mask", labelpath); @@ -743,7 +781,47 @@ data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int mi return d; } -data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int boxes, int coords, int min, int max, float angle, float aspect, float hue, float saturation, float exposure) +data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int boxes, int div, int min, int max, float angle, float aspect, float hue, float saturation, float exposure) +{ + char **random_paths = get_random_paths(paths, n, m); + int i; + data d = {0}; + d.shallow = 0; + + d.X.rows = n; + d.X.vals = calloc(d.X.rows, sizeof(float*)); + d.X.cols = h*w*3; + + d.y = make_matrix(n, (((w/div)*(h/div))+1)*boxes); + + for(i = 0; i < n; ++i){ + image orig = load_image_color(random_paths[i], 0, 0); + augment_args a = random_augment_args(orig, angle, aspect, min, max, w, h); + image sized = rotate_crop_image(orig, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect); + + int flip = rand()%2; + if(flip) flip_image(sized); + random_distort_image(sized, hue, saturation, exposure); + d.X.vals[i] = sized.data; + //show_image(sized, "image"); + + fill_truth_iseg(random_paths[i], boxes, d.y.vals[i], classes, orig.w, orig.h, a, flip, w/div, h/div); + + free_image(orig); + + /* + image rgb = mask_to_rgb(sized_m, classes); + show_image(rgb, "part"); + show_image(sized, "orig"); + cvWaitKey(0); + free_image(rgb); + */ + } + free(random_paths); + return d; +} + +data load_data_mask(int n, char **paths, int m, int w, int h, int classes, int boxes, int coords, int min, int max, float angle, float aspect, float hue, float saturation, float exposure) { char **random_paths = get_random_paths(paths, n, m); int i; @@ -767,7 +845,7 @@ data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int b d.X.vals[i] = sized.data; //show_image(sized, "image"); - fill_truth_iseg(random_paths[i], boxes, d.y.vals[i], classes, orig.w, orig.h, a, flip, 14, 14); + fill_truth_mask(random_paths[i], boxes, d.y.vals[i], classes, orig.w, orig.h, a, flip, 14, 14); free_image(orig); @@ -975,7 +1053,8 @@ data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, in float dh = jitter * orig.h; float new_ar = (orig.w + rand_uniform(-dw, dw)) / (orig.h + rand_uniform(-dh, dh)); - float scale = rand_uniform(.25, 2); + //float scale = rand_uniform(.25, 2); + float scale = 1; float nw, nh; @@ -1025,8 +1104,10 @@ void *load_thread(void *ptr) *a.d = load_data_super(a.paths, a.n, a.m, a.w, a.h, a.scale); } else if (a.type == WRITING_DATA){ *a.d = load_data_writing(a.paths, a.n, a.m, a.w, a.h, a.out_w, a.out_h); + } else if (a.type == ISEG_DATA){ + *a.d = load_data_iseg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.num_boxes, a.scale, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } else if (a.type == INSTANCE_DATA){ - *a.d = load_data_iseg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.num_boxes, a.coords, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure); + *a.d = load_data_mask(a.n, a.paths, a.m, a.w, a.h, a.classes, a.num_boxes, a.coords, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure); } else if (a.type == SEGMENTATION_DATA){ *a.d = load_data_seg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure, a.scale); } else if (a.type == REGION_DATA){ @@ -1212,7 +1293,7 @@ data *tile_data(data orig, int divs, int size) { data *ds = calloc(divs*divs, sizeof(data)); int i, j; - #pragma omp parallel for +#pragma omp parallel for for(i = 0; i < divs*divs; ++i){ data d; d.shallow = 0; @@ -1223,7 +1304,7 @@ data *tile_data(data orig, int divs, int size) d.X.vals = calloc(d.X.rows, sizeof(float*)); d.y = copy_matrix(orig.y); - #pragma omp parallel for +#pragma omp parallel for for(j = 0; j < orig.X.rows; ++j){ int x = (i%divs) * orig.w / divs - (d.w - orig.w/divs)/2; int y = (i/divs) * orig.h / divs - (d.h - orig.h/divs)/2; @@ -1247,7 +1328,7 @@ data resize_data(data orig, int w, int h) d.X.vals = calloc(d.X.rows, sizeof(float*)); d.y = copy_matrix(orig.y); - #pragma omp parallel for +#pragma omp parallel for for(i = 0; i < orig.X.rows; ++i){ image im = float_to_image(orig.w, orig.h, 3, orig.X.vals[i]); d.X.vals[i] = resize_image(im, w, h).data; diff --git a/src/image.c b/src/image.c index 786acb089e3..c112dd81eae 100644 --- a/src/image.c +++ b/src/image.c @@ -572,7 +572,7 @@ void show_image_cv(image p, const char *name, IplImage *disp) } #endif -void show_image(image p, const char *name) +int show_image(image p, const char *name, int ms) { #ifdef OPENCV IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c); @@ -581,9 +581,13 @@ void show_image(image p, const char *name) show_image_cv(copy, name, disp); free_image(copy); cvReleaseImage(&disp); + int c = cvWaitKey(ms); + if (c != -1) c = c%256; + return c; #else fprintf(stderr, "Not compiled with OpenCV, saving to %s.png instead\n", name); save_image(p, name); + return 0; #endif } @@ -727,7 +731,7 @@ void show_image_layers(image p, char *name) for(i = 0; i < p.c; ++i){ sprintf(buff, "%s - Layer %d", name, i); image layer = get_image_layer(p, i); - show_image(layer, buff); + show_image(layer, buff, 1); free_image(layer); } } @@ -735,7 +739,7 @@ void show_image_layers(image p, char *name) void show_image_collapsed(image p, char *name) { image c = collapse_image_layers(p, 1); - show_image(c, name); + show_image(c, name, 1); free_image(c); } @@ -1406,16 +1410,16 @@ void test_resize(char *filename) distort_image(c4, .1, .66666, 1.5); - show_image(im, "Original"); - show_image(gray, "Gray"); - show_image(c1, "C1"); - show_image(c2, "C2"); - show_image(c3, "C3"); - show_image(c4, "C4"); + show_image(im, "Original", 1); + show_image(gray, "Gray", 1); + show_image(c1, "C1", 1); + show_image(c2, "C2", 1); + show_image(c3, "C3", 1); + show_image(c4, "C4", 1); #ifdef OPENCV while(1){ image aug = random_augment_image(im, 0, .75, 320, 448, 320, 320); - show_image(aug, "aug"); + show_image(aug, "aug", 1); free_image(aug); @@ -1430,7 +1434,7 @@ void test_resize(char *filename) float dhue = rand_uniform(-hue, hue); distort_image(c, dhue, dsat, dexp); - show_image(c, "rand"); + show_image(c, "rand", 1); printf("%f %f %f\n", dhue, dsat, dexp); free_image(c); cvWaitKey(0); @@ -1585,7 +1589,7 @@ void show_image_normalized(image im, const char *name) { image c = copy_image(im); normalize_image(c); - show_image(c, name); + show_image(c, name, 1); free_image(c); } @@ -1603,7 +1607,7 @@ void show_images(image *ims, int n, char *window) */ normalize_image(m); save_image(m, window); - show_image(m, window); + show_image(m, window, 1); free_image(m); } diff --git a/src/iseg_layer.c b/src/iseg_layer.c new file mode 100644 index 00000000000..7c31d0d5175 --- /dev/null +++ b/src/iseg_layer.c @@ -0,0 +1,219 @@ +#include "iseg_layer.h" +#include "activations.h" +#include "blas.h" +#include "box.h" +#include "cuda.h" +#include "utils.h" + +#include +#include +#include +#include + +layer make_iseg_layer(int batch, int w, int h, int classes, int ids) +{ + layer l = {0}; + l.type = ISEG; + + l.h = h; + l.w = w; + l.c = classes + ids; + l.out_w = l.w; + l.out_h = l.h; + l.out_c = l.c; + l.classes = classes; + l.batch = batch; + l.extra = ids; + l.cost = calloc(1, sizeof(float)); + l.outputs = h*w*l.c; + l.inputs = l.outputs; + l.truths = 90*(l.w*l.h+1); + l.delta = calloc(batch*l.outputs, sizeof(float)); + l.output = calloc(batch*l.outputs, sizeof(float)); + + l.counts = calloc(90, sizeof(int)); + l.sums = calloc(90, sizeof(float*)); + if(ids){ + int i; + for(i = 0; i < 90; ++i){ + l.sums[i] = calloc(ids, sizeof(float)); + } + } + + l.forward = forward_iseg_layer; + l.backward = backward_iseg_layer; +#ifdef GPU + l.forward_gpu = forward_iseg_layer_gpu; + l.backward_gpu = backward_iseg_layer_gpu; + l.output_gpu = cuda_make_array(l.output, batch*l.outputs); + l.delta_gpu = cuda_make_array(l.delta, batch*l.outputs); +#endif + + fprintf(stderr, "iseg\n"); + srand(0); + + return l; +} + +void resize_iseg_layer(layer *l, int w, int h) +{ + l->w = w; + l->h = h; + + l->outputs = h*w*l->c; + l->inputs = l->outputs; + + l->output = realloc(l->output, l->batch*l->outputs*sizeof(float)); + l->delta = realloc(l->delta, l->batch*l->outputs*sizeof(float)); + +#ifdef GPU + cuda_free(l->delta_gpu); + cuda_free(l->output_gpu); + + l->delta_gpu = cuda_make_array(l->delta, l->batch*l->outputs); + l->output_gpu = cuda_make_array(l->output, l->batch*l->outputs); +#endif +} + +void forward_iseg_layer(const layer l, network net) +{ + + double time = what_time_is_it_now(); + int i,b,j,k; + int ids = l.extra; + memcpy(l.output, net.input, l.outputs*l.batch*sizeof(float)); + memset(l.delta, 0, l.outputs * l.batch * sizeof(float)); + +#ifndef GPU + for (b = 0; b < l.batch; ++b){ + int index = b*l.outputs; + activate_array(l.output + index, l.classes*l.w*l.h, LOGISTIC); + } +#endif + + for (b = 0; b < l.batch; ++b){ + // a priori, each pixel has no class + for(i = 0; i < l.classes; ++i){ + for(k = 0; k < l.w*l.h; ++k){ + int index = b*l.outputs + i*l.w*l.h + k; + l.delta[index] = 0 - l.output[index]; + } + } + + // a priori, embedding should be small magnitude + for(i = 0; i < ids; ++i){ + for(k = 0; k < l.w*l.h; ++k){ + int index = b*l.outputs + (i+l.classes)*l.w*l.h + k; + l.delta[index] = .1 * (0 - l.output[index]); + } + } + + + memset(l.counts, 0, 90*sizeof(float)); + for(i = 0; i < 90; ++i){ + l.counts[i] = 0; + fill_cpu(ids, 0, l.sums[i], 1); + + int c = net.truth[b*l.truths + i*(l.w*l.h+1)]; + if(c < 0) break; + // add up metric embeddings for each instance + for(k = 0; k < l.w*l.h; ++k){ + int index = b*l.outputs + c*l.w*l.h + k; + float v = net.truth[b*l.truths + i*(l.w*l.h + 1) + 1 + k]; + if(v){ + l.delta[index] = v - l.output[index]; + axpy_cpu(ids, 1, l.output + b*l.outputs + l.classes*l.w*l.h + k, l.w*l.h, l.sums[i], 1); + ++l.counts[i]; + } + } + } + + float *mse = calloc(90, sizeof(float)); + for(i = 0; i < 90; ++i){ + int c = net.truth[b*l.truths + i*(l.w*l.h+1)]; + if(c < 0) break; + for(k = 0; k < l.w*l.h; ++k){ + float v = net.truth[b*l.truths + i*(l.w*l.h + 1) + 1 + k]; + if(v){ + int z; + float sum = 0; + for(z = 0; z < ids; ++z){ + int index = b*l.outputs + (l.classes + z)*l.w*l.h + k; + sum += pow(l.sums[i][z]/l.counts[i] - l.output[index], 2); + } + mse[i] += sum; + } + } + mse[i] /= l.counts[i]; + } + + // Calculate average embedding + for(i = 0; i < 90; ++i){ + if(!l.counts[i]) continue; + scal_cpu(ids, 1.f/l.counts[i], l.sums[i], 1); + if(b == 0 && net.gpu_index == 0){ + printf("%4d, %6.3f, ", l.counts[i], mse[i]); + for(j = 0; j < ids/4; ++j){ + printf("%6.3f,", l.sums[i][j]); + } + printf("\n"); + } + } + free(mse); + + // Calculate embedding loss + for(i = 0; i < 90; ++i){ + if(!l.counts[i]) continue; + for(k = 0; k < l.w*l.h; ++k){ + float v = net.truth[b*l.truths + i*(l.w*l.h + 1) + 1 + k]; + if(v){ + for(j = 0; j < 90; ++j){ + if(!l.counts[j])continue; + int z; + for(z = 0; z < ids; ++z){ + int index = b*l.outputs + (l.classes + z)*l.w*l.h + k; + float diff = l.sums[j][z] - l.output[index]; + if (j == i) l.delta[index] += diff < 0? -.1 : .1; + else l.delta[index] += -(diff < 0? -.1 : .1); + } + } + } + } + } + } + + *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2); + printf("took %lf sec\n", what_time_is_it_now() - time); +} + +void backward_iseg_layer(const layer l, network net) +{ + axpy_cpu(l.batch*l.inputs, 1, l.delta, 1, net.delta, 1); +} + +#ifdef GPU + +void forward_iseg_layer_gpu(const layer l, network net) +{ + copy_gpu(l.batch*l.inputs, net.input_gpu, 1, l.output_gpu, 1); + int b; + for (b = 0; b < l.batch; ++b){ + activate_array_gpu(l.output_gpu + b*l.outputs, l.classes*l.w*l.h, LOGISTIC); + //if(l.extra) activate_array_gpu(l.output_gpu + b*l.outputs + l.classes*l.w*l.h, l.extra*l.w*l.h, LOGISTIC); + } + + cuda_pull_array(l.output_gpu, net.input, l.batch*l.inputs); + forward_iseg_layer(l, net); + cuda_push_array(l.delta_gpu, l.delta, l.batch*l.outputs); +} + +void backward_iseg_layer_gpu(const layer l, network net) +{ + int b; + for (b = 0; b < l.batch; ++b){ + //if(l.extra) gradient_array_gpu(l.output_gpu + b*l.outputs + l.classes*l.w*l.h, l.extra*l.w*l.h, LOGISTIC, l.delta_gpu + b*l.outputs + l.classes*l.w*l.h); + } + axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1); +} +#endif + diff --git a/src/iseg_layer.h b/src/iseg_layer.h new file mode 100644 index 00000000000..dd8e64e023c --- /dev/null +++ b/src/iseg_layer.h @@ -0,0 +1,19 @@ +#ifndef ISEG_LAYER_H +#define ISEG_LAYER_H + +#include "darknet.h" +#include "layer.h" +#include "network.h" + +layer make_iseg_layer(int batch, int w, int h, int classes, int ids); +void forward_iseg_layer(const layer l, network net); +void backward_iseg_layer(const layer l, network net); +void resize_iseg_layer(layer *l, int w, int h); +int iseg_num_detections(layer l, float thresh); + +#ifdef GPU +void forward_iseg_layer_gpu(const layer l, network net); +void backward_iseg_layer_gpu(layer l, network net); +#endif + +#endif diff --git a/src/maxpool_layer.c b/src/maxpool_layer.c index 202c0295847..971272b1982 100644 --- a/src/maxpool_layer.c +++ b/src/maxpool_layer.c @@ -27,8 +27,8 @@ maxpool_layer make_maxpool_layer(int batch, int h, int w, int c, int size, int s l.w = w; l.c = c; l.pad = padding; - l.out_w = (w + 2*padding - size)/stride + 1; - l.out_h = (h + 2*padding - size)/stride + 1; + l.out_w = (w + padding - size)/stride + 1; + l.out_h = (h + padding - size)/stride + 1; l.out_c = c; l.outputs = l.out_h * l.out_w * l.out_c; l.inputs = h*w*c; @@ -57,8 +57,8 @@ void resize_maxpool_layer(maxpool_layer *l, int w, int h) l->w = w; l->inputs = h*w*l->c; - l->out_w = (w + 2*l->pad - l->size)/l->stride + 1; - l->out_h = (h + 2*l->pad - l->size)/l->stride + 1; + l->out_w = (w + l->pad - l->size)/l->stride + 1; + l->out_h = (h + l->pad - l->size)/l->stride + 1; l->outputs = l->out_w * l->out_h * l->c; int output_size = l->outputs * l->batch; @@ -79,8 +79,8 @@ void resize_maxpool_layer(maxpool_layer *l, int w, int h) void forward_maxpool_layer(const maxpool_layer l, network net) { int b,i,j,k,m,n; - int w_offset = -l.pad; - int h_offset = -l.pad; + int w_offset = -l.pad/l.stride; + int h_offset = -l.pad/l.stride; int h = l.out_h; int w = l.out_w; diff --git a/src/maxpool_layer_kernels.cu b/src/maxpool_layer_kernels.cu index e294e1e8259..869ef466af5 100644 --- a/src/maxpool_layer_kernels.cu +++ b/src/maxpool_layer_kernels.cu @@ -9,8 +9,8 @@ extern "C" { __global__ void forward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c, int stride, int size, int pad, float *input, float *output, int *indexes) { - int h = (in_h + 2*pad - size)/stride + 1; - int w = (in_w + 2*pad - size)/stride + 1; + int h = (in_h + pad - size)/stride + 1; + int w = (in_w + pad - size)/stride + 1; int c = in_c; int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; @@ -24,8 +24,8 @@ __global__ void forward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c id /= c; int b = id; - int w_offset = -pad; - int h_offset = -pad; + int w_offset = -pad/2; + int h_offset = -pad/2; int out_index = j + w*(i + h*(k + c*b)); float max = -INFINITY; @@ -49,8 +49,8 @@ __global__ void forward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c __global__ void backward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_c, int stride, int size, int pad, float *delta, float *prev_delta, int *indexes) { - int h = (in_h + 2*pad - size)/stride + 1; - int w = (in_w + 2*pad - size)/stride + 1; + int h = (in_h + pad - size)/stride + 1; + int w = (in_w + pad - size)/stride + 1; int c = in_c; int area = (size-1)/stride; @@ -66,8 +66,8 @@ __global__ void backward_maxpool_layer_kernel(int n, int in_h, int in_w, int in_ id /= in_c; int b = id; - int w_offset = -pad; - int h_offset = -pad; + int w_offset = -pad/2; + int h_offset = -pad/2; float d = 0; int l, m; diff --git a/src/parser.c b/src/parser.c index 8b43f3c540d..c8141c9f2dd 100644 --- a/src/parser.c +++ b/src/parser.c @@ -27,6 +27,7 @@ #include "parser.h" #include "region_layer.h" #include "yolo_layer.h" +#include "iseg_layer.h" #include "reorg_layer.h" #include "rnn_layer.h" #include "route_layer.h" @@ -52,6 +53,7 @@ LAYER_TYPE string_to_layer_type(char * type) if (strcmp(type, "[detection]")==0) return DETECTION; if (strcmp(type, "[region]")==0) return REGION; if (strcmp(type, "[yolo]")==0) return YOLO; + if (strcmp(type, "[iseg]")==0) return ISEG; if (strcmp(type, "[local]")==0) return LOCAL; if (strcmp(type, "[conv]")==0 || strcmp(type, "[convolutional]")==0) return CONVOLUTIONAL; @@ -265,18 +267,19 @@ layer parse_connected(list *options, size_params params) return l; } -softmax_layer parse_softmax(list *options, size_params params) +layer parse_softmax(list *options, size_params params) { int groups = option_find_int_quiet(options, "groups",1); - softmax_layer layer = make_softmax_layer(params.batch, params.inputs, groups); - layer.temperature = option_find_float_quiet(options, "temperature", 1); + layer l = make_softmax_layer(params.batch, params.inputs, groups); + l.temperature = option_find_float_quiet(options, "temperature", 1); char *tree_file = option_find_str(options, "tree", 0); - if (tree_file) layer.softmax_tree = read_tree(tree_file); - layer.w = params.w; - layer.h = params.h; - layer.c = params.c; - layer.spatial = option_find_float_quiet(options, "spatial", 0); - return layer; + if (tree_file) l.softmax_tree = read_tree(tree_file); + l.w = params.w; + l.h = params.h; + l.c = params.c; + l.spatial = option_find_float_quiet(options, "spatial", 0); + l.noloss = option_find_int_quiet(options, "noloss", 0); + return l; } int *parse_yolo_mask(char *a, int *num) @@ -338,6 +341,15 @@ layer parse_yolo(list *options, size_params params) return l; } +layer parse_iseg(list *options, size_params params) +{ + int classes = option_find_int(options, "classes", 20); + int ids = option_find_int(options, "ids", 32); + layer l = make_iseg_layer(params.batch, params.w, params.h, classes, ids); + assert(l.outputs == params.inputs); + return l; +} + layer parse_region(list *options, size_params params) { int coords = option_find_int(options, "coords", 4); @@ -472,7 +484,7 @@ maxpool_layer parse_maxpool(list *options, size_params params) { int stride = option_find_int(options, "stride",1); int size = option_find_int(options, "size",stride); - int padding = option_find_int_quiet(options, "padding", (size-1)/2); + int padding = option_find_int_quiet(options, "padding", size-1); int batch,h,w,c; h = params.h; @@ -791,6 +803,8 @@ network *parse_network_cfg(char *filename) l = parse_region(options, params); }else if(lt == YOLO){ l = parse_yolo(options, params); + }else if(lt == ISEG){ + l = parse_iseg(options, params); }else if(lt == DETECTION){ l = parse_detection(options, params); }else if(lt == SOFTMAX){ @@ -829,6 +843,7 @@ network *parse_network_cfg(char *filename) l.stopbackward = option_find_int_quiet(options, "stopbackward", 0); l.dontsave = option_find_int_quiet(options, "dontsave", 0); l.dontload = option_find_int_quiet(options, "dontload", 0); + l.numload = option_find_int_quiet(options, "numload", 0); l.dontloadscales = option_find_int_quiet(options, "dontloadscales", 0); l.learning_rate_scale = option_find_float_quiet(options, "learning_rate", 1); l.smooth = option_find_float_quiet(options, "smooth", 0); @@ -1152,7 +1167,8 @@ void load_convolutional_weights(layer l, FILE *fp) //load_convolutional_weights_binary(l, fp); //return; } - int num = l.nweights; + if(l.numload) l.n = l.numload; + int num = l.c/l.groups*l.n*l.size*l.size; fread(l.biases, sizeof(float), l.n, fp); if (l.batch_normalize && (!l.dontloadscales)){ fread(l.scales, sizeof(float), l.n, fp); diff --git a/src/softmax_layer.c b/src/softmax_layer.c index afcc6342483..9cbc6be120d 100644 --- a/src/softmax_layer.c +++ b/src/softmax_layer.c @@ -50,7 +50,7 @@ void forward_softmax_layer(const softmax_layer l, network net) softmax_cpu(net.input, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output); } - if(net.truth){ + if(net.truth && !l.noloss){ softmax_x_ent_cpu(l.batch*l.inputs, l.output, net.truth, l.delta, l.loss); l.cost[0] = sum_array(l.loss, l.batch*l.inputs); } @@ -88,7 +88,7 @@ void forward_softmax_layer_gpu(const softmax_layer l, network net) softmax_gpu(net.input_gpu, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output_gpu); } } - if(net.truth){ + if(net.truth && !l.noloss){ softmax_x_ent_gpu(l.batch*l.inputs, l.output_gpu, net.truth_gpu, l.delta_gpu, l.loss_gpu); if(l.softmax_tree){ mask_gpu(l.batch*l.inputs, l.delta_gpu, SECRET_NUM, net.truth_gpu, 0); From 9a4b19c4158b064a164e34a83ec8a16401580850 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Fri, 3 Aug 2018 16:37:44 -0700 Subject: [PATCH 088/118] I don't know what you're talking about Alexey... --- src/maxpool_layer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maxpool_layer.c b/src/maxpool_layer.c index 971272b1982..fb05635ea4f 100644 --- a/src/maxpool_layer.c +++ b/src/maxpool_layer.c @@ -79,8 +79,8 @@ void resize_maxpool_layer(maxpool_layer *l, int w, int h) void forward_maxpool_layer(const maxpool_layer l, network net) { int b,i,j,k,m,n; - int w_offset = -l.pad/l.stride; - int h_offset = -l.pad/l.stride; + int w_offset = -l.pad/2; + int h_offset = -l.pad/2; int h = l.out_h; int w = l.out_w; From f86901f6177dfc6116360a13cc06ab680e0c86b0 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 15 Aug 2018 10:59:59 -0700 Subject: [PATCH 089/118] new models :snake: :snake: :snake: --- Makefile | 8 +- cfg/alexnet.cfg | 6 +- cfg/coco.data | 4 +- cfg/darknet.cfg | 31 +- cfg/gru.cfg | 13 +- cfg/resnet101.cfg | 990 +++++++++++++++++++++ cfg/resnet18.cfg | 228 +++++ cfg/resnet34.cfg | 392 +++++++++ cfg/resnet50.cfg | 13 +- cfg/resnext101-32x4d.cfg | 1048 ++++++++++++++++++++++ cfg/resnext152-32x4d.cfg | 1558 +++++++++++++++++++++++++++++++++ cfg/resnext50.cfg | 523 +++++++++++ cfg/yolov2.cfg | 4 +- cfg/yolov3-tiny.cfg | 2 +- cfg/yolov3.cfg | 12 +- examples/classifier.c | 1 + examples/instance-segmenter.c | 12 +- src/data.c | 1 + src/iseg_layer.c | 12 +- 19 files changed, 4814 insertions(+), 44 deletions(-) create mode 100644 cfg/resnet101.cfg create mode 100644 cfg/resnet18.cfg create mode 100644 cfg/resnet34.cfg create mode 100644 cfg/resnext101-32x4d.cfg create mode 100644 cfg/resnext152-32x4d.cfg create mode 100644 cfg/resnext50.cfg diff --git a/Makefile b/Makefile index a1e4604f605..3f8b2939d79 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -GPU=0 -CUDNN=0 -OPENCV=0 -OPENMP=0 +GPU=1 +CUDNN=1 +OPENCV=1 +OPENMP=1 DEBUG=0 ARCH= -gencode arch=compute_30,code=sm_30 \ diff --git a/cfg/alexnet.cfg b/cfg/alexnet.cfg index 0458735f886..e2ed4bb8e7b 100644 --- a/cfg/alexnet.cfg +++ b/cfg/alexnet.cfg @@ -1,5 +1,9 @@ [net] -batch=128 +# Training +# batch=128 +# subdivisions=1 +# Testing +batch=1 subdivisions=1 height=227 width=227 diff --git a/cfg/coco.data b/cfg/coco.data index 610151dc50b..30038417c27 100644 --- a/cfg/coco.data +++ b/cfg/coco.data @@ -1,7 +1,7 @@ classes= 80 train = /home/pjreddie/data/coco/trainvalno5k.txt -#valid = coco_testdev -valid = data/coco_val_5k.list +valid = coco_testdev +#valid = data/coco_val_5k.list names = data/coco.names backup = /home/pjreddie/backup/ eval=coco diff --git a/cfg/darknet.cfg b/cfg/darknet.cfg index ec902830a78..375107f7c19 100644 --- a/cfg/darknet.cfg +++ b/cfg/darknet.cfg @@ -1,21 +1,30 @@ [net] -# Train - batch=128 - subdivisions=1 -# Test -#batch=1 -#subdivisions=1 +# Training +# batch=128 +# subdivisions=1 +# Testing +batch=1 +subdivisions=1 height=256 width=256 +min_crop=128 +max_crop=448 channels=3 momentum=0.9 decay=0.0005 -max_crop=320 +burn_in=1000 learning_rate=0.1 policy=poly power=4 -max_batches=1600000 +max_batches=800000 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + [convolutional] batch_normalize=1 @@ -97,14 +106,14 @@ stride=1 pad=1 activation=leaky +[avgpool] + [convolutional] filters=1000 size=1 stride=1 pad=1 -activation=leaky - -[avgpool] +activation=linear [softmax] groups=1 diff --git a/cfg/gru.cfg b/cfg/gru.cfg index 4ce9b180a64..6064221289d 100644 --- a/cfg/gru.cfg +++ b/cfg/gru.cfg @@ -1,10 +1,10 @@ [net] -subdivisions=1 -batch = 256 inputs=256 momentum=0.9 decay=0.0 -time_steps=128 +subdivisions=1 +batch = 1 +time_steps=1 learning_rate=.002 adam=1 @@ -13,13 +13,13 @@ power=4 max_batches=1000000 [gru] -output = 1024 +output = 256 [gru] -output = 1024 +output = 256 [gru] -output = 1024 +output = 256 [connected] output=256 @@ -27,4 +27,3 @@ activation=linear [softmax] - diff --git a/cfg/resnet101.cfg b/cfg/resnet101.cfg new file mode 100644 index 00000000000..de458820bcd --- /dev/null +++ b/cfg/resnet101.cfg @@ -0,0 +1,990 @@ +[net] +# Training +# batch=128 +# subdivisions=2 + +# Testing +batch=1 +subdivisions=1 + +height=256 +width=256 +channels=3 +min_crop=128 +max_crop=448 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=800000 +momentum=0.9 +decay=0.0005 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + + + +[convolutional] +batch_normalize=1 +filters=64 +size=7 +stride=2 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +# Conv 4 +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +#Conv 5 +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + + + + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[avgpool] + +[softmax] +groups=1 + +[cost] +type=sse + diff --git a/cfg/resnet18.cfg b/cfg/resnet18.cfg new file mode 100644 index 00000000000..275f4bdb596 --- /dev/null +++ b/cfg/resnet18.cfg @@ -0,0 +1,228 @@ +[net] +# Training +# batch=128 +# subdivisions=1 + +# Testing +batch=1 +subdivisions=1 + +height=256 +width=256 +channels=3 +min_crop=128 +max_crop=448 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=800000 +momentum=0.9 +decay=0.0005 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + + +[convolutional] +batch_normalize=1 +filters=64 +size=7 +stride=2 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + + +# Residual Block +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Strided Residual Block +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + + +# Strided Residual Block +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + + +# Strided Residual Block +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + + + + +[avgpool] + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[softmax] +groups=1 + diff --git a/cfg/resnet34.cfg b/cfg/resnet34.cfg new file mode 100644 index 00000000000..9f68f096741 --- /dev/null +++ b/cfg/resnet34.cfg @@ -0,0 +1,392 @@ +[net] +# Training +# batch=128 +# subdivisions=2 + +# Testing +batch=1 +subdivisions=1 + +height=256 +width=256 +channels=3 +min_crop=128 +max_crop=448 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=800000 +momentum=0.9 +decay=0.0005 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + + +[convolutional] +batch_normalize=1 +filters=64 +size=7 +stride=2 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Strided Residual Block +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Strided Residual Block +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + +# Residual Block +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=linear + +[shortcut] +activation=leaky +from=-3 + + + +[avgpool] + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[softmax] +groups=1 + diff --git a/cfg/resnet50.cfg b/cfg/resnet50.cfg index 8c4d01febc4..d0d7c511516 100644 --- a/cfg/resnet50.cfg +++ b/cfg/resnet50.cfg @@ -9,16 +9,17 @@ subdivisions=1 height=256 width=256 -max_crop=448 channels=3 -momentum=0.9 -decay=0.0005 +min_crop=128 +max_crop=448 burn_in=1000 learning_rate=0.1 policy=poly power=4 -max_batches=1600000 +max_batches=800000 +momentum=0.9 +decay=0.0005 angle=7 hue=.1 @@ -26,6 +27,7 @@ saturation=.75 exposure=.75 aspect=.75 + [convolutional] batch_normalize=1 filters=64 @@ -493,6 +495,7 @@ activation=leaky +[avgpool] [convolutional] filters=1000 @@ -501,8 +504,6 @@ stride=1 pad=1 activation=linear -[avgpool] - [softmax] groups=1 diff --git a/cfg/resnext101-32x4d.cfg b/cfg/resnext101-32x4d.cfg new file mode 100644 index 00000000000..382836d1f4a --- /dev/null +++ b/cfg/resnext101-32x4d.cfg @@ -0,0 +1,1048 @@ +[net] +batch=128 +subdivisions=8 + batch=1 + subdivisions=1 +height=256 +width=256 +min_crop=128 +max_crop=448 +channels=3 +momentum=0.9 +decay=0.0005 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=800000 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + + +[convolutional] +batch_normalize=1 +filters=64 +size=7 +stride=2 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=4096 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=4096 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=4096 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + + +[avgpool] + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[softmax] +groups=1 + diff --git a/cfg/resnext152-32x4d.cfg b/cfg/resnext152-32x4d.cfg new file mode 100644 index 00000000000..1296cf9ccea --- /dev/null +++ b/cfg/resnext152-32x4d.cfg @@ -0,0 +1,1558 @@ +[net] +batch=128 +subdivisions=16 +# batch=1 +# subdivisions=1 +height=256 +width=256 +min_crop=128 +max_crop=448 +channels=3 +momentum=0.9 +decay=0.0005 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=800000 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + + +[convolutional] +batch_normalize=1 +filters=64 +size=7 +stride=2 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=4096 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=4096 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +groups = 32 +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=4096 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + + + +[avgpool] + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[softmax] +groups=1 + diff --git a/cfg/resnext50.cfg b/cfg/resnext50.cfg new file mode 100644 index 00000000000..12aebdf6fbd --- /dev/null +++ b/cfg/resnext50.cfg @@ -0,0 +1,523 @@ +[net] +# Training +# batch=128 +# subdivisions=4 + +# Testing +batch=1 +subdivisions=1 + +height=256 +width=256 +channels=3 +min_crop=128 +max_crop=448 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=800000 +momentum=0.9 +decay=0.0005 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + + + +[convolutional] +batch_normalize=1 +filters=64 +size=7 +stride=2 +pad=1 +activation=leaky + +[maxpool] +size=2 +stride=2 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +groups=32 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + + +# Conv 4 +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +groups=32 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +#Conv 5 +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +groups=32 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +groups=32 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=2048 +size=1 +stride=1 +pad=1 +activation=linear + +[shortcut] +from=-4 +activation=leaky + +[avgpool] + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[softmax] +groups=1 + + diff --git a/cfg/yolov2.cfg b/cfg/yolov2.cfg index 2a0cd98fbd0..088edf81573 100644 --- a/cfg/yolov2.cfg +++ b/cfg/yolov2.cfg @@ -5,8 +5,8 @@ subdivisions=1 # Training # batch=64 # subdivisions=8 -width=416 -height=416 +width=608 +height=608 channels=3 momentum=0.9 decay=0.0005 diff --git a/cfg/yolov3-tiny.cfg b/cfg/yolov3-tiny.cfg index 42c0fcf9195..cfca3cfa641 100644 --- a/cfg/yolov3-tiny.cfg +++ b/cfg/yolov3-tiny.cfg @@ -172,7 +172,7 @@ filters=255 activation=linear [yolo] -mask = 1,2,3 +mask = 0,1,2 anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 classes=80 num=6 diff --git a/cfg/yolov3.cfg b/cfg/yolov3.cfg index 4a0ecc3320e..938ffff23f1 100644 --- a/cfg/yolov3.cfg +++ b/cfg/yolov3.cfg @@ -1,12 +1,12 @@ [net] # Testing -batch=1 -subdivisions=1 +# batch=1 +# subdivisions=1 # Training -# batch=64 -# subdivisions=16 -width=416 -height=416 +batch=64 +subdivisions=16 +width=608 +height=608 channels=3 momentum=0.9 decay=0.0005 diff --git a/examples/classifier.c b/examples/classifier.c index 2a89da62e8c..90cd3abc5d1 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -396,6 +396,7 @@ void validate_classifier_single(char *datacfg, char *filename, char *weightfile) } image im = load_image_color(paths[i], 0, 0); image crop = center_crop_image(im, net->w, net->h); + //grayscale_image_3c(crop); //show_image(im, "orig"); //show_image(crop, "cropped"); //cvWaitKey(0); diff --git a/examples/instance-segmenter.c b/examples/instance-segmenter.c index 96d8545ff37..17fd4e1aa09 100644 --- a/examples/instance-segmenter.c +++ b/examples/instance-segmenter.c @@ -2,6 +2,7 @@ #include #include +void normalize_image2(image p); void train_isegmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int display) { int i; @@ -26,6 +27,10 @@ void train_isegmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, network *net = nets[0]; image pred = get_network_image(net); + image embed = pred; + embed.c = 3; + embed.data += embed.w*embed.h*80; + int div = net->w/pred.w; assert(pred.w * div == net->w); assert(pred.h * div == net->h); @@ -98,6 +103,11 @@ void train_isegmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus, pred.c = 80; image mask = mask_to_rgb(tr); image prmask = mask_to_rgb(pred); + image ecopy = copy_image(embed); + normalize_image2(ecopy); + show_image(ecopy, "embed", 1); + free_image(ecopy); + show_image(im, "input", 1); show_image(prmask, "pred", 1); show_image(mask, "truth", 100); @@ -206,7 +216,7 @@ void demo_isegmenter(char *datacfg, char *cfg, char *weights, int cam_index, con image pred = get_network_image(net); image prmask = mask_to_rgb(pred); show_image(prmask, "Segmenter", 10); - + free_image(in_s); free_image(in); free_image(prmask); diff --git a/src/data.c b/src/data.c index a5d69f263d7..59051b4e9fd 100644 --- a/src/data.c +++ b/src/data.c @@ -127,6 +127,7 @@ matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, show_image(crop, "crop"); cvWaitKey(0); */ + //grayscale_image_3c(crop); free_image(im); X.vals[i] = crop.data; X.cols = crop.h*crop.w*crop.c; diff --git a/src/iseg_layer.c b/src/iseg_layer.c index 7c31d0d5175..2bf03a8ac2f 100644 --- a/src/iseg_layer.c +++ b/src/iseg_layer.c @@ -109,9 +109,8 @@ void forward_iseg_layer(const layer l, network net) } - memset(l.counts, 0, 90*sizeof(float)); + memset(l.counts, 0, 90*sizeof(int)); for(i = 0; i < 90; ++i){ - l.counts[i] = 0; fill_cpu(ids, 0, l.sums[i], 1); int c = net.truth[b*l.truths + i*(l.w*l.h+1)]; @@ -153,7 +152,7 @@ void forward_iseg_layer(const layer l, network net) scal_cpu(ids, 1.f/l.counts[i], l.sums[i], 1); if(b == 0 && net.gpu_index == 0){ printf("%4d, %6.3f, ", l.counts[i], mse[i]); - for(j = 0; j < ids/4; ++j){ + for(j = 0; j < ids; ++j){ printf("%6.3f,", l.sums[i][j]); } printf("\n"); @@ -180,6 +179,13 @@ void forward_iseg_layer(const layer l, network net) } } } + + for(i = 0; i < ids; ++i){ + for(k = 0; k < l.w*l.h; ++k){ + int index = b*l.outputs + (i+l.classes)*l.w*l.h + k; + l.delta[index] *= .01; + } + } } *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2); From f61f100b2ef4e963bc43deb0cf995364e2de40b4 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 15 Aug 2018 11:16:43 -0700 Subject: [PATCH 090/118] new darknet models --- cfg/darknet53.cfg | 566 ++++++++++++++++++++++++++++++++++++++++++ cfg/darknet53_448.cfg | 559 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1125 insertions(+) create mode 100644 cfg/darknet53.cfg create mode 100644 cfg/darknet53_448.cfg diff --git a/cfg/darknet53.cfg b/cfg/darknet53.cfg new file mode 100644 index 00000000000..7b6d5766e9e --- /dev/null +++ b/cfg/darknet53.cfg @@ -0,0 +1,566 @@ +[net] +# Training +# batch=128 +# subdivisions=4 + +# Testing +batch=1 +subdivisions=1 + +height=256 +width=256 +channels=3 +min_crop=128 +max_crop=448 + +burn_in=1000 +learning_rate=0.1 +policy=poly +power=4 +max_batches=800000 +momentum=0.9 +decay=0.0005 + +angle=7 +hue=.1 +saturation=.75 +exposure=.75 +aspect=.75 + + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +# Downsample + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[avgpool] + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[softmax] +groups=1 + diff --git a/cfg/darknet53_448.cfg b/cfg/darknet53_448.cfg new file mode 100644 index 00000000000..dedab1b97c7 --- /dev/null +++ b/cfg/darknet53_448.cfg @@ -0,0 +1,559 @@ +[net] +# Training - start training with darknet53.weights +# batch=128 +# subdivisions=8 + +# Testing +batch=1 +subdivisions=1 + +height=448 +width=448 +channels=3 +min_crop=448 +max_crop=512 + +learning_rate=0.001 +policy=poly +power=4 +max_batches=100000 +momentum=0.9 +decay=0.0005 + + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +# Downsample + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[avgpool] + +[convolutional] +filters=1000 +size=1 +stride=1 +pad=1 +activation=linear + +[softmax] +groups=1 + From 98e2a7674fd6a81349735db6f5b34229c871113a Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Wed, 15 Aug 2018 13:09:53 -0700 Subject: [PATCH 091/118] ugh --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 3f8b2939d79..a1e4604f605 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -GPU=1 -CUDNN=1 -OPENCV=1 -OPENMP=1 +GPU=0 +CUDNN=0 +OPENCV=0 +OPENMP=0 DEBUG=0 ARCH= -gencode arch=compute_30,code=sm_30 \ From 680d3bde1924c8ee2d1c1dea54d3e56a05ca9a26 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Tue, 4 Sep 2018 17:25:05 -0700 Subject: [PATCH 092/118] SELU activation and yolo openimages --- cfg/openimages.data | 8 + cfg/resnext101-32x4d.cfg | 19 +- cfg/resnext152-32x4d.cfg | 18 +- cfg/vgg-16.cfg | 10 +- cfg/yolov3-openimages.cfg | 789 ++++++++++++++++++++++++++++++++++++++ data/openimages.names | 601 +++++++++++++++++++++++++++++ include/darknet.h | 2 +- src/activation_kernels.cu | 6 + src/activations.c | 7 + src/activations.h | 2 + 10 files changed, 1445 insertions(+), 17 deletions(-) create mode 100644 cfg/openimages.data create mode 100644 cfg/yolov3-openimages.cfg create mode 100644 data/openimages.names diff --git a/cfg/openimages.data b/cfg/openimages.data new file mode 100644 index 00000000000..fa80e5ab7d8 --- /dev/null +++ b/cfg/openimages.data @@ -0,0 +1,8 @@ +classes= 601 +train = /home/pjreddie/data/openimsv4/openimages.train.list +#valid = coco_testdev +valid = data/coco_val_5k.list +names = data/openimages.names +backup = /home/pjreddie/backup/ +eval=coco + diff --git a/cfg/resnext101-32x4d.cfg b/cfg/resnext101-32x4d.cfg index 382836d1f4a..8538ccc3dae 100644 --- a/cfg/resnext101-32x4d.cfg +++ b/cfg/resnext101-32x4d.cfg @@ -1,21 +1,25 @@ [net] -batch=128 -subdivisions=8 - batch=1 - subdivisions=1 +# Training +# batch=128 +# subdivisions=8 + +# Testing +batch=1 +subdivisions=1 + height=256 width=256 +channels=3 min_crop=128 max_crop=448 -channels=3 -momentum=0.9 -decay=0.0005 burn_in=1000 learning_rate=0.1 policy=poly power=4 max_batches=800000 +momentum=0.9 +decay=0.0005 angle=7 hue=.1 @@ -24,6 +28,7 @@ exposure=.75 aspect=.75 + [convolutional] batch_normalize=1 filters=64 diff --git a/cfg/resnext152-32x4d.cfg b/cfg/resnext152-32x4d.cfg index 1296cf9ccea..48279fd28eb 100644 --- a/cfg/resnext152-32x4d.cfg +++ b/cfg/resnext152-32x4d.cfg @@ -1,21 +1,25 @@ [net] -batch=128 -subdivisions=16 -# batch=1 -# subdivisions=1 +# Training +# batch=128 +# subdivisions=16 + +# Testing +batch=1 +subdivisions=1 + height=256 width=256 +channels=3 min_crop=128 max_crop=448 -channels=3 -momentum=0.9 -decay=0.0005 burn_in=1000 learning_rate=0.1 policy=poly power=4 max_batches=800000 +momentum=0.9 +decay=0.0005 angle=7 hue=.1 diff --git a/cfg/vgg-16.cfg b/cfg/vgg-16.cfg index 79694b87ec9..c73b17b6ccf 100644 --- a/cfg/vgg-16.cfg +++ b/cfg/vgg-16.cfg @@ -1,6 +1,12 @@ [net] -batch=128 -subdivisions=4 +# Training +# batch=128 +# subdivisions=4 + +# Testing +batch=1 +subdivisions=1 + height=256 width=256 channels=3 diff --git a/cfg/yolov3-openimages.cfg b/cfg/yolov3-openimages.cfg new file mode 100644 index 00000000000..65d241a74c4 --- /dev/null +++ b/cfg/yolov3-openimages.cfg @@ -0,0 +1,789 @@ +[net] +# Testing + batch=1 + subdivisions=1 +# Training +batch=64 +subdivisions=16 +width=608 +height=608 +channels=3 +momentum=0.9 +decay=0.0005 +angle=0 +saturation = 1.5 +exposure = 1.5 +hue=.1 + +learning_rate=0.001 +burn_in=5000 +max_batches = 500200 +policy=steps +steps=400000,450000 +scales=.1,.1 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +# Downsample + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +###################### + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=1818 +activation=linear + + +[yolo] +mask = 6,7,8 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=601 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 61 + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=1818 +activation=linear + + +[yolo] +mask = 3,4,5 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=601 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 36 + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=1818 +activation=linear + + +[yolo] +mask = 0,1,2 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=601 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + diff --git a/data/openimages.names b/data/openimages.names new file mode 100644 index 00000000000..ddfd8f22649 --- /dev/null +++ b/data/openimages.names @@ -0,0 +1,601 @@ +Tortoise +Container +Magpie +Sea turtle +Football +Ambulance +Ladder +Toothbrush +Syringe +Sink +Toy +Organ +Cassette deck +Apple +Human eye +Cosmetics +Paddle +Snowman +Beer +Chopsticks +Human beard +Bird +Parking meter +Traffic light +Croissant +Cucumber +Radish +Towel +Doll +Skull +Washing machine +Glove +Tick +Belt +Sunglasses +Banjo +Cart +Ball +Backpack +Bicycle +Home appliance +Centipede +Boat +Surfboard +Boot +Headphones +Hot dog +Shorts +Fast food +Bus +Boy +Screwdriver +Bicycle wheel +Barge +Laptop +Miniskirt +Drill +Dress +Bear +Waffle +Pancake +Brown bear +Woodpecker +Blue jay +Pretzel +Bagel +Tower +Teapot +Person +Bow and arrow +Swimwear +Beehive +Brassiere +Bee +Bat +Starfish +Popcorn +Burrito +Chainsaw +Balloon +Wrench +Tent +Vehicle registration plate +Lantern +Toaster +Flashlight +Billboard +Tiara +Limousine +Necklace +Carnivore +Scissors +Stairs +Computer keyboard +Printer +Traffic sign +Chair +Shirt +Poster +Cheese +Sock +Fire hydrant +Land vehicle +Earrings +Tie +Watercraft +Cabinetry +Suitcase +Muffin +Bidet +Snack +Snowmobile +Clock +Medical equipment +Cattle +Cello +Jet ski +Camel +Coat +Suit +Desk +Cat +Bronze sculpture +Juice +Gondola +Beetle +Cannon +Computer mouse +Cookie +Office building +Fountain +Coin +Calculator +Cocktail +Computer monitor +Box +Stapler +Christmas tree +Cowboy hat +Hiking equipment +Studio couch +Drum +Dessert +Wine rack +Drink +Zucchini +Ladle +Human mouth +Dairy +Dice +Oven +Dinosaur +Ratchet +Couch +Cricket ball +Winter melon +Spatula +Whiteboard +Pencil sharpener +Door +Hat +Shower +Eraser +Fedora +Guacamole +Dagger +Scarf +Dolphin +Sombrero +Tin can +Mug +Tap +Harbor seal +Stretcher +Can opener +Goggles +Human body +Roller skates +Coffee cup +Cutting board +Blender +Plumbing fixture +Stop sign +Office supplies +Volleyball +Vase +Slow cooker +Wardrobe +Coffee +Whisk +Paper towel +Personal care +Food +Sun hat +Tree house +Flying disc +Skirt +Gas stove +Salt and pepper shakers +Mechanical fan +Face powder +Fax +Fruit +French fries +Nightstand +Barrel +Kite +Tart +Treadmill +Fox +Flag +Horn +Window blind +Human foot +Golf cart +Jacket +Egg +Street light +Guitar +Pillow +Human leg +Isopod +Grape +Human ear +Power plugs and sockets +Panda +Giraffe +Woman +Door handle +Rhinoceros +Bathtub +Goldfish +Houseplant +Goat +Baseball bat +Baseball glove +Mixing bowl +Marine invertebrates +Kitchen utensil +Light switch +House +Horse +Stationary bicycle +Hammer +Ceiling fan +Sofa bed +Adhesive tape +Harp +Sandal +Bicycle helmet +Saucer +Harpsichord +Human hair +Heater +Harmonica +Hamster +Curtain +Bed +Kettle +Fireplace +Scale +Drinking straw +Insect +Hair dryer +Kitchenware +Indoor rower +Invertebrate +Food processor +Bookcase +Refrigerator +Wood-burning stove +Punching bag +Common fig +Cocktail shaker +Jaguar +Golf ball +Fashion accessory +Alarm clock +Filing cabinet +Artichoke +Table +Tableware +Kangaroo +Koala +Knife +Bottle +Bottle opener +Lynx +Lavender +Lighthouse +Dumbbell +Human head +Bowl +Humidifier +Porch +Lizard +Billiard table +Mammal +Mouse +Motorcycle +Musical instrument +Swim cap +Frying pan +Snowplow +Bathroom cabinet +Missile +Bust +Man +Waffle iron +Milk +Ring binder +Plate +Mobile phone +Baked goods +Mushroom +Crutch +Pitcher +Mirror +Lifejacket +Table tennis racket +Pencil case +Musical keyboard +Scoreboard +Briefcase +Kitchen knife +Nail +Tennis ball +Plastic bag +Oboe +Chest of drawers +Ostrich +Piano +Girl +Plant +Potato +Hair spray +Sports equipment +Pasta +Penguin +Pumpkin +Pear +Infant bed +Polar bear +Mixer +Cupboard +Jacuzzi +Pizza +Digital clock +Pig +Reptile +Rifle +Lipstick +Skateboard +Raven +High heels +Red panda +Rose +Rabbit +Sculpture +Saxophone +Shotgun +Seafood +Submarine sandwich +Snowboard +Sword +Picture frame +Sushi +Loveseat +Ski +Squirrel +Tripod +Stethoscope +Submarine +Scorpion +Segway +Training bench +Snake +Coffee table +Skyscraper +Sheep +Television +Trombone +Tea +Tank +Taco +Telephone +Torch +Tiger +Strawberry +Trumpet +Tree +Tomato +Train +Tool +Picnic basket +Cooking spray +Trousers +Bowling equipment +Football helmet +Truck +Measuring cup +Coffeemaker +Violin +Vehicle +Handbag +Paper cutter +Wine +Weapon +Wheel +Worm +Wok +Whale +Zebra +Auto part +Jug +Pizza cutter +Cream +Monkey +Lion +Bread +Platter +Chicken +Eagle +Helicopter +Owl +Duck +Turtle +Hippopotamus +Crocodile +Toilet +Toilet paper +Squid +Clothing +Footwear +Lemon +Spider +Deer +Frog +Banana +Rocket +Wine glass +Countertop +Tablet computer +Waste container +Swimming pool +Dog +Book +Elephant +Shark +Candle +Leopard +Axe +Hand dryer +Soap dispenser +Porcupine +Flower +Canary +Cheetah +Palm tree +Hamburger +Maple +Building +Fish +Lobster +Asparagus +Furniture +Hedgehog +Airplane +Spoon +Otter +Bull +Oyster +Horizontal bar +Convenience store +Bomb +Bench +Ice cream +Caterpillar +Butterfly +Parachute +Orange +Antelope +Beaker +Moths and butterflies +Window +Closet +Castle +Jellyfish +Goose +Mule +Swan +Peach +Coconut +Seat belt +Raccoon +Chisel +Fork +Lamp +Camera +Squash +Racket +Human face +Human arm +Vegetable +Diaper +Unicycle +Falcon +Chime +Snail +Shellfish +Cabbage +Carrot +Mango +Jeans +Flowerpot +Pineapple +Drawer +Stool +Envelope +Cake +Dragonfly +Sunflower +Microwave oven +Honeycomb +Marine mammal +Sea lion +Ladybug +Shelf +Watch +Candy +Salad +Parrot +Handgun +Sparrow +Van +Grinder +Spice rack +Light bulb +Corded phone +Sports uniform +Tennis racket +Wall clock +Serving tray +Kitchen & dining room table +Dog bed +Cake stand +Cat furniture +Bathroom accessory +Facial tissue holder +Pressure cooker +Kitchen appliance +Tire +Ruler +Luggage and bags +Microphone +Broccoli +Umbrella +Pastry +Grapefruit +Band-aid +Animal +Bell pepper +Turkey +Lily +Pomegranate +Doughnut +Glasses +Human nose +Pen +Ant +Car +Aircraft +Human hand +Skunk +Teddy bear +Watermelon +Cantaloupe +Dishwasher +Flute +Balance beam +Sandwich +Shrimp +Sewing machine +Binoculars +Rays and skates +Ipod +Accordion +Willow +Crab +Crown +Seahorse +Perfume +Alpaca +Taxi +Canoe +Remote control +Wheelchair +Rugby ball +Armadillo +Maracas +Helmet diff --git a/include/darknet.h b/include/darknet.h index abe4e5bfc34..b0a65e99bff 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -54,7 +54,7 @@ typedef struct{ tree *read_tree(char *filename); typedef enum{ - LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN + LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN, SELU } ACTIVATION; typedef enum{ diff --git a/src/activation_kernels.cu b/src/activation_kernels.cu index 5852eb58e0e..4dc5804d286 100644 --- a/src/activation_kernels.cu +++ b/src/activation_kernels.cu @@ -31,6 +31,7 @@ __device__ float logistic_activate_kernel(float x){return 1.f/(1.f + expf(-x));} __device__ float loggy_activate_kernel(float x){return 2.f/(1.f + expf(-x)) - 1;} __device__ float relu_activate_kernel(float x){return x*(x>0);} __device__ float elu_activate_kernel(float x){return (x >= 0)*x + (x < 0)*(expf(x)-1);} +__device__ float selu_activate_kernel(float x){return (x >= 0)*1.0507f*x + (x < 0)*1.0507f*1.6732f*(expf(x)-1);} __device__ float relie_activate_kernel(float x){return (x>0) ? x : .01f*x;} __device__ float ramp_activate_kernel(float x){return x*(x>0)+.1f*x;} __device__ float leaky_activate_kernel(float x){return (x>0) ? x : .1f*x;} @@ -63,6 +64,7 @@ __device__ float loggy_gradient_kernel(float x) } __device__ float relu_gradient_kernel(float x){return (x>0);} __device__ float elu_gradient_kernel(float x){return (x >= 0) + (x < 0)*(x + 1);} +__device__ float selu_gradient_kernel(float x){return (x >= 0)*1.0507 + (x < 0)*(x + 1.0507*1.6732);} __device__ float relie_gradient_kernel(float x){return (x>0) ? 1 : .01f;} __device__ float ramp_gradient_kernel(float x){return (x>0)+.1f;} __device__ float leaky_gradient_kernel(float x){return (x>0) ? 1 : .1f;} @@ -87,6 +89,8 @@ __device__ float activate_kernel(float x, ACTIVATION a) return relu_activate_kernel(x); case ELU: return elu_activate_kernel(x); + case SELU: + return selu_activate_kernel(x); case RELIE: return relie_activate_kernel(x); case RAMP: @@ -120,6 +124,8 @@ __device__ float gradient_kernel(float x, ACTIVATION a) return relu_gradient_kernel(x); case ELU: return elu_gradient_kernel(x); + case SELU: + return selu_gradient_kernel(x); case RELIE: return relie_gradient_kernel(x); case RAMP: diff --git a/src/activations.c b/src/activations.c index 0cbb2f5546e..da1a17a89b4 100644 --- a/src/activations.c +++ b/src/activations.c @@ -16,6 +16,8 @@ char *get_activation_string(ACTIVATION a) return "relu"; case ELU: return "elu"; + case SELU: + return "selu"; case RELIE: return "relie"; case RAMP: @@ -46,6 +48,7 @@ ACTIVATION get_activation(char *s) if (strcmp(s, "loggy")==0) return LOGGY; if (strcmp(s, "relu")==0) return RELU; if (strcmp(s, "elu")==0) return ELU; + if (strcmp(s, "selu")==0) return SELU; if (strcmp(s, "relie")==0) return RELIE; if (strcmp(s, "plse")==0) return PLSE; if (strcmp(s, "hardtan")==0) return HARDTAN; @@ -72,6 +75,8 @@ float activate(float x, ACTIVATION a) return relu_activate(x); case ELU: return elu_activate(x); + case SELU: + return selu_activate(x); case RELIE: return relie_activate(x); case RAMP: @@ -113,6 +118,8 @@ float gradient(float x, ACTIVATION a) return relu_gradient(x); case ELU: return elu_gradient(x); + case SELU: + return selu_gradient(x); case RELIE: return relie_gradient(x); case RAMP: diff --git a/src/activations.h b/src/activations.h index d456dbe3c2b..9780d2cfb26 100644 --- a/src/activations.h +++ b/src/activations.h @@ -33,6 +33,7 @@ static inline float logistic_activate(float x){return 1./(1. + exp(-x));} static inline float loggy_activate(float x){return 2./(1. + exp(-x)) - 1;} static inline float relu_activate(float x){return x*(x>0);} static inline float elu_activate(float x){return (x >= 0)*x + (x < 0)*(exp(x)-1);} +static inline float selu_activate(float x){return (x >= 0)*1.0507*x + (x < 0)*1.0507*1.6732*(exp(x)-1);} static inline float relie_activate(float x){return (x>0) ? x : .01*x;} static inline float ramp_activate(float x){return x*(x>0)+.1*x;} static inline float leaky_activate(float x){return (x>0) ? x : .1*x;} @@ -75,6 +76,7 @@ static inline float stair_gradient(float x) } static inline float relu_gradient(float x){return (x>0);} static inline float elu_gradient(float x){return (x >= 0) + (x < 0)*(x + 1);} +static inline float selu_gradient(float x){return (x >= 0)*1.0507 + (x < 0)*(x + 1.0507*1.6732);} static inline float relie_gradient(float x){return (x>0) ? 1 : .01;} static inline float ramp_gradient(float x){return (x>0)+.1;} static inline float leaky_gradient(float x){return (x>0) ? 1 : .1;} From 810d7f797bdb2f021dbe65d2524c2ff6b8ab5c8b Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Thu, 13 Sep 2018 16:53:20 -0700 Subject: [PATCH 093/118] GUYS I THINK MAYBE IT WAS BROKEN ON OPENCV IDK --- Makefile | 8 +- examples/art.c | 5 +- examples/cifar.c | 4 +- examples/classifier.c | 35 +------ examples/darknet.c | 6 -- examples/detector.c | 5 +- examples/instance-segmenter.c | 10 +- examples/regressor.c | 10 +- examples/segmenter.c | 10 +- include/darknet.h | 36 +++---- src/demo.c | 37 +++---- src/image.c | 181 +++------------------------------- src/image.h | 19 ++-- src/image_opencv.cpp | 135 +++++++++++++++++++++++++ 14 files changed, 206 insertions(+), 295 deletions(-) create mode 100644 src/image_opencv.cpp diff --git a/Makefile b/Makefile index a1e4604f605..63e15e657fa 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ EXEC=darknet OBJDIR=./obj/ CC=gcc +CPP=g++ NVCC=nvcc AR=ar ARFLAGS=rcs @@ -41,7 +42,7 @@ CFLAGS+=$(OPTS) ifeq ($(OPENCV), 1) COMMON+= -DOPENCV CFLAGS+= -DOPENCV -LDFLAGS+= `pkg-config --libs opencv` +LDFLAGS+= `pkg-config --libs opencv` -lstdc++ COMMON+= `pkg-config --cflags opencv` endif @@ -57,7 +58,7 @@ CFLAGS+= -DCUDNN LDFLAGS+= -lcudnn endif -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o yolo_layer.o iseg_layer.o +OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o yolo_layer.o iseg_layer.o image_opencv.o EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o instance-segmenter.o darknet.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ @@ -81,6 +82,9 @@ $(ALIB): $(OBJS) $(SLIB): $(OBJS) $(CC) $(CFLAGS) -shared $^ -o $@ $(LDFLAGS) +$(OBJDIR)%.o: %.cpp $(DEPS) + $(CPP) $(COMMON) $(CFLAGS) -c $< -o $@ + $(OBJDIR)%.o: %.c $(DEPS) $(CC) $(COMMON) $(CFLAGS) -c $< -o $@ diff --git a/examples/art.c b/examples/art.c index ce8855408b4..932688e7b9e 100644 --- a/examples/art.c +++ b/examples/art.c @@ -9,14 +9,11 @@ void demo_art(char *cfgfile, char *weightfile, int cam_index) set_batch_network(net, 1); srand(2222222); - CvCapture * cap; - cap = cvCaptureFromCAM(cam_index); + void * cap = open_video_stream(0, cam_index, 0,0,0); char *window = "ArtJudgementBot9000!!!"; if(!cap) error("Couldn't connect to webcam.\n"); - cvNamedWindow(window, CV_WINDOW_NORMAL); - cvResizeWindow(window, 512, 512); int i; int idx[] = {37, 401, 434}; int n = sizeof(idx)/sizeof(idx[0]); diff --git a/examples/cifar.c b/examples/cifar.c index d57d7fdc09e..a5f5f240b9f 100644 --- a/examples/cifar.c +++ b/examples/cifar.c @@ -157,14 +157,14 @@ char *labels[] = {"airplane","automobile","bird","cat","deer","dog","frog","hors int class = max_index(train.y.vals[i], 10); char buff[256]; sprintf(buff, "data/cifar/train/%d_%s",i,labels[class]); - save_image_png(im, buff); + save_image_options(im, buff, PNG, 0); } for(i = 0; i < test.X.rows; ++i){ image im = float_to_image(32, 32, 3, test.X.vals[i]); int class = max_index(test.y.vals[i], 10); char buff[256]; sprintf(buff, "data/cifar/test/%d_%s",i,labels[class]); - save_image_png(im, buff); + save_image_options(im, buff, PNG, 0); } } diff --git a/examples/classifier.c b/examples/classifier.c index 90cd3abc5d1..df91a084804 100644 --- a/examples/classifier.c +++ b/examples/classifier.c @@ -806,13 +806,7 @@ void threat_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_i list *options = read_data_cfg(datacfg); srand(2222222); - CvCapture * cap; - - if(filename){ - cap = cvCaptureFromFile(filename); - }else{ - cap = cvCaptureFromCAM(cam_index); - } + void * cap = open_video_stream(filename, cam_index, 0,0,0); int top = option_find_int(options, "top", 1); @@ -934,13 +928,7 @@ void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_inde list *options = read_data_cfg(datacfg); srand(2222222); - CvCapture * cap; - - if(filename){ - cap = cvCaptureFromFile(filename); - }else{ - cap = cvCaptureFromCAM(cam_index); - } + void * cap = open_video_stream(filename, cam_index, 0,0,0); int top = option_find_int(options, "top", 1); @@ -950,8 +938,6 @@ void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_inde int *indexes = calloc(top, sizeof(int)); if(!cap) error("Couldn't connect to webcam.\n"); - cvNamedWindow("Threat Detection", CV_WINDOW_NORMAL); - cvResizeWindow("Threat Detection", 512, 512); float fps = 0; int i; @@ -1008,23 +994,10 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind list *options = read_data_cfg(datacfg); srand(2222222); - CvCapture * cap; int w = 1280; int h = 720; - - if(filename){ - cap = cvCaptureFromFile(filename); - }else{ - cap = cvCaptureFromCAM(cam_index); - } - - if(w){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); - } - if(h){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); - } + void * cap = open_video_stream(filename, cam_index, w, h, 0); int top = option_find_int(options, "top", 1); @@ -1035,8 +1008,6 @@ void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_ind int *indexes = calloc(top, sizeof(int)); if(!cap) error("Couldn't connect to webcam.\n"); - cvNamedWindow(base, CV_WINDOW_NORMAL); - cvResizeWindow(base, 512, 512); float fps = 0; int i; diff --git a/examples/darknet.c b/examples/darknet.c index 99b0d64f868..d538359203b 100644 --- a/examples/darknet.c +++ b/examples/darknet.c @@ -9,7 +9,6 @@ extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char * extern void run_yolo(int argc, char **argv); extern void run_detector(int argc, char **argv); extern void run_coco(int argc, char **argv); -extern void run_captcha(int argc, char **argv); extern void run_nightmare(int argc, char **argv); extern void run_classifier(int argc, char **argv); extern void run_regressor(int argc, char **argv); @@ -396,9 +395,6 @@ void visualize(char *cfgfile, char *weightfile) { network *net = load_network(cfgfile, weightfile, 0); visualize_network(net); -#ifdef OPENCV - cvWaitKey(0); -#endif } int main(int argc, char **argv) @@ -465,8 +461,6 @@ int main(int argc, char **argv) composite_3d(argv[2], argv[3], argv[4], (argc > 5) ? atof(argv[5]) : 0); } else if (0 == strcmp(argv[1], "test")){ test_resize(argv[2]); - } else if (0 == strcmp(argv[1], "captcha")){ - run_captcha(argc, argv); } else if (0 == strcmp(argv[1], "nightmare")){ run_nightmare(argc, argv); } else if (0 == strcmp(argv[1], "rgbgr")){ diff --git a/examples/detector.c b/examples/detector.c index b503fc608ed..318f7fbbe81 100644 --- a/examples/detector.c +++ b/examples/detector.c @@ -609,10 +609,7 @@ void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filenam else{ save_image(im, "predictions"); #ifdef OPENCV - cvNamedWindow("predictions", CV_WINDOW_NORMAL); - if(fullscreen){ - cvSetWindowProperty("predictions", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); - } + make_window("predictions", 512, 512, 0); show_image(im, "predictions", 0); #endif } diff --git a/examples/instance-segmenter.c b/examples/instance-segmenter.c index 17fd4e1aa09..664e71426d5 100644 --- a/examples/instance-segmenter.c +++ b/examples/instance-segmenter.c @@ -187,17 +187,9 @@ void demo_isegmenter(char *datacfg, char *cfg, char *weights, int cam_index, con set_batch_network(net, 1); srand(2222222); - CvCapture * cap; - - if(filename){ - cap = cvCaptureFromFile(filename); - }else{ - cap = cvCaptureFromCAM(cam_index); - } + void * cap = open_video_stream(filename, cam_index, 0,0,0); if(!cap) error("Couldn't connect to webcam.\n"); - cvNamedWindow("Segmenter", CV_WINDOW_NORMAL); - cvResizeWindow("Segmenter", 512, 512); float fps = 0; while(1){ diff --git a/examples/regressor.c b/examples/regressor.c index 0bd7aba0ba4..20cec0fad9f 100644 --- a/examples/regressor.c +++ b/examples/regressor.c @@ -155,21 +155,13 @@ void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_inde set_batch_network(net, 1); srand(2222222); - CvCapture * cap; - - if(filename){ - cap = cvCaptureFromFile(filename); - }else{ - cap = cvCaptureFromCAM(cam_index); - } list *options = read_data_cfg(datacfg); int classes = option_find_int(options, "classes", 1); char *name_list = option_find_str(options, "names", 0); char **names = get_labels(name_list); + void * cap = open_video_stream(filename, cam_index, 0,0,0); if(!cap) error("Couldn't connect to webcam.\n"); - cvNamedWindow("Regressor", CV_WINDOW_NORMAL); - cvResizeWindow("Regressor", 512, 512); float fps = 0; while(1){ diff --git a/examples/segmenter.c b/examples/segmenter.c index eadfd69aa44..2e7cea0b730 100644 --- a/examples/segmenter.c +++ b/examples/segmenter.c @@ -175,17 +175,9 @@ void demo_segmenter(char *datacfg, char *cfg, char *weights, int cam_index, cons set_batch_network(net, 1); srand(2222222); - CvCapture * cap; - - if(filename){ - cap = cvCaptureFromFile(filename); - }else{ - cap = cvCaptureFromCAM(cam_index); - } + void * cap = open_video_stream(filename, cam_index, 0,0,0); if(!cap) error("Couldn't connect to webcam.\n"); - cvNamedWindow("Segmenter", CV_WINDOW_NORMAL); - cvResizeWindow("Segmenter", 512, 512); float fps = 0; while(1){ diff --git a/include/darknet.h b/include/darknet.h index b0a65e99bff..4390c619409 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -5,9 +5,6 @@ #include #include -#define SECRET_NUM -1234 -extern int gpu_index; - #ifdef GPU #define BLOCK 512 @@ -20,18 +17,13 @@ extern int gpu_index; #endif #endif -#ifndef __cplusplus - #ifdef OPENCV - #include "opencv2/highgui/highgui_c.h" - #include "opencv2/imgproc/imgproc_c.h" - #include "opencv2/core/version.hpp" - #if CV_MAJOR_VERSION == 3 - #include "opencv2/videoio/videoio_c.h" - #include "opencv2/imgcodecs/imgcodecs_c.h" - #endif - #endif +#ifdef __cplusplus +extern "C" { #endif +#define SECRET_NUM -1234 +extern int gpu_index; + typedef struct{ int classes; char **names; @@ -57,6 +49,10 @@ typedef enum{ LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN, SELU } ACTIVATION; +typedef enum{ + PNG, BMP, TGA, JPG +} IMTYPE; + typedef enum{ MULT, ADD, SUB, DIV } BINARY_ACTIVATION; @@ -650,7 +646,8 @@ void harmless_update_network_gpu(network *net); #endif image get_label(image **characters, char *string, int size); void draw_label(image a, int r, int c, image label, const float *rgb); -void save_image_png(image im, const char *name); +void save_image(image im, const char *name); +void save_image_options(image im, const char *name, IMTYPE f, int quality); void get_next_batch(data d, int n, int offset, float *X, float *y); void grayscale_image_3c(image im); void normalize_image(image p); @@ -709,7 +706,6 @@ image mask_to_rgb(image mask); int resize_network(network *net, int w, int h); void free_matrix(matrix m); void test_resize(char *filename); -void save_image(image p, const char *name); int show_image(image p, const char *name, int ms); image copy_image(image p); void draw_box_width(image a, int x1, int y1, int x2, int y2, int w, float r, float g, float b); @@ -758,11 +754,12 @@ void do_nms_sort(detection *dets, int total, int classes, float thresh); matrix make_matrix(int rows, int cols); -#ifndef __cplusplus #ifdef OPENCV -image get_image_from_stream(CvCapture *cap); -#endif +void *open_video_stream(const char *f, int c, int w, int h, int fps); +image get_image_from_stream(void *p); +void make_window(char *name, int w, int h, int fullscreen); #endif + void free_image(image m); float train_network(network *net, data d); pthread_t load_data_in_thread(load_args args); @@ -802,4 +799,7 @@ size_t rand_size_t(); float rand_normal(); float rand_uniform(float min, float max); +#ifdef __cplusplus +} +#endif #endif diff --git a/src/demo.c b/src/demo.c index 492c360d4ba..b89efb8dc4c 100644 --- a/src/demo.c +++ b/src/demo.c @@ -21,8 +21,7 @@ static network *net; static image buff [3]; static image buff_letter[3]; static int buff_index = 0; -static CvCapture * cap; -static IplImage * ipl; +static void * cap; static float fps = 0; static float demo_thresh = 0; static float demo_hier = .5; @@ -140,16 +139,19 @@ void *detect_in_thread(void *ptr) void *fetch_in_thread(void *ptr) { - int status = fill_image_from_stream(cap, buff[buff_index]); + free_image(buff[buff_index]); + buff[buff_index] = get_image_from_stream(cap); + if(buff[buff_index].data == 0) { + demo_done = 1; + return 0; + } letterbox_image_into(buff[buff_index], net->w, net->h, buff_letter[buff_index]); - if(status == 0) demo_done = 1; return 0; } void *display_in_thread(void *ptr) { - show_image_cv(buff[(buff_index + 1)%3], "Demo", ipl); - int c = cvWaitKey(1); + int c = show_image(buff[(buff_index + 1)%3], "Demo", 1); if (c != -1) c = c%256; if (c == 27) { demo_done = 1; @@ -209,19 +211,9 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch if(filename){ printf("video file: %s\n", filename); - cap = cvCaptureFromFile(filename); + cap = open_video_stream(filename, 0, 0, 0, 0); }else{ - cap = cvCaptureFromCAM(cam_index); - - if(w){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w); - } - if(h){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h); - } - if(frames){ - cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, frames); - } + cap = open_video_stream(0, cam_index, w, h, frames); } if(!cap) error("Couldn't connect to webcam.\n"); @@ -232,17 +224,10 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch buff_letter[0] = letterbox_image(buff[0], net->w, net->h); buff_letter[1] = letterbox_image(buff[0], net->w, net->h); buff_letter[2] = letterbox_image(buff[0], net->w, net->h); - ipl = cvCreateImage(cvSize(buff[0].w,buff[0].h), IPL_DEPTH_8U, buff[0].c); int count = 0; if(!prefix){ - cvNamedWindow("Demo", CV_WINDOW_NORMAL); - if(fullscreen){ - cvSetWindowProperty("Demo", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); - } else { - cvMoveWindow("Demo", 0, 0); - cvResizeWindow("Demo", 1352, 1013); - } + make_window("Demo", 1352, 1013, fullscreen); } demo_time = what_time_is_it_now(); diff --git a/src/image.c b/src/image.c index c112dd81eae..4a2c6baf0ad 100644 --- a/src/image.c +++ b/src/image.c @@ -534,174 +534,27 @@ void rgbgr_image(image im) } } -#ifdef OPENCV -void show_image_cv(image p, const char *name, IplImage *disp) -{ - int x,y,k; - if(p.c == 3) rgbgr_image(p); - //normalize_image(copy); - - char buff[256]; - //sprintf(buff, "%s (%d)", name, windows); - sprintf(buff, "%s", name); - - int step = disp->widthStep; - cvNamedWindow(buff, CV_WINDOW_NORMAL); - //cvMoveWindow(buff, 100*(windows%10) + 200*(windows/10), 100*(windows%10)); - ++windows; - for(y = 0; y < p.h; ++y){ - for(x = 0; x < p.w; ++x){ - for(k= 0; k < p.c; ++k){ - disp->imageData[y*step + x*p.c + k] = (unsigned char)(get_pixel(p,x,y,k)*255); - } - } - } - if(0){ - int w = 448; - int h = w*p.h/p.w; - if(h > 1000){ - h = 1000; - w = h*p.w/p.h; - } - IplImage *buffer = disp; - disp = cvCreateImage(cvSize(w, h), buffer->depth, buffer->nChannels); - cvResize(buffer, disp, CV_INTER_LINEAR); - cvReleaseImage(&buffer); - } - cvShowImage(buff, disp); -} -#endif - int show_image(image p, const char *name, int ms) { #ifdef OPENCV - IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c); - image copy = copy_image(p); - constrain_image(copy); - show_image_cv(copy, name, disp); - free_image(copy); - cvReleaseImage(&disp); - int c = cvWaitKey(ms); - if (c != -1) c = c%256; + int c = show_image_cv(p, name, ms); return c; #else fprintf(stderr, "Not compiled with OpenCV, saving to %s.png instead\n", name); save_image(p, name); - return 0; + return -1; #endif } -#ifdef OPENCV - -void ipl_into_image(IplImage* src, image im) -{ - unsigned char *data = (unsigned char *)src->imageData; - int h = src->height; - int w = src->width; - int c = src->nChannels; - int step = src->widthStep; - int i, j, k; - - for(i = 0; i < h; ++i){ - for(k= 0; k < c; ++k){ - for(j = 0; j < w; ++j){ - im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.; - } - } - } -} - -image ipl_to_image(IplImage* src) -{ - int h = src->height; - int w = src->width; - int c = src->nChannels; - image out = make_image(w, h, c); - ipl_into_image(src, out); - return out; -} - -image load_image_cv(char *filename, int channels) -{ - IplImage* src = 0; - int flag = -1; - if (channels == 0) flag = -1; - else if (channels == 1) flag = 0; - else if (channels == 3) flag = 1; - else { - fprintf(stderr, "OpenCV can't force load with %d channels\n", channels); - } - - if( (src = cvLoadImage(filename, flag)) == 0 ) - { - fprintf(stderr, "Cannot load image \"%s\"\n", filename); - char buff[256]; - sprintf(buff, "echo %s >> bad.list", filename); - system(buff); - return make_image(10,10,3); - //exit(0); - } - image out = ipl_to_image(src); - cvReleaseImage(&src); - rgbgr_image(out); - return out; -} - -void flush_stream_buffer(CvCapture *cap, int n) -{ - int i; - for(i = 0; i < n; ++i) { - cvQueryFrame(cap); - } -} - -image get_image_from_stream(CvCapture *cap) -{ - IplImage* src = cvQueryFrame(cap); - if (!src) return make_empty_image(0,0,0); - image im = ipl_to_image(src); - rgbgr_image(im); - return im; -} - -int fill_image_from_stream(CvCapture *cap, image im) -{ - IplImage* src = cvQueryFrame(cap); - if (!src) return 0; - ipl_into_image(src, im); - rgbgr_image(im); - return 1; -} - -void save_image_jpg(image p, const char *name) -{ - image copy = copy_image(p); - if(p.c == 3) rgbgr_image(copy); - int x,y,k; - - char buff[256]; - sprintf(buff, "%s.jpg", name); - - IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c); - int step = disp->widthStep; - for(y = 0; y < p.h; ++y){ - for(x = 0; x < p.w; ++x){ - for(k= 0; k < p.c; ++k){ - disp->imageData[y*step + x*p.c + k] = (unsigned char)(get_pixel(copy,x,y,k)*255); - } - } - } - cvSaveImage(buff, disp,0); - cvReleaseImage(&disp); - free_image(copy); -} -#endif - -void save_image_png(image im, const char *name) +void save_image_options(image im, const char *name, IMTYPE f, int quality) { char buff[256]; //sprintf(buff, "%s (%d)", name, windows); - sprintf(buff, "%s.png", name); + if(f == PNG) sprintf(buff, "%s.png", name); + else if (f == BMP) sprintf(buff, "%s.bmp", name); + else if (f == TGA) sprintf(buff, "%s.tga", name); + else if (f == JPG) sprintf(buff, "%s.jpg", name); + else sprintf(buff, "%s.png", name); unsigned char *data = calloc(im.w*im.h*im.c, sizeof(char)); int i,k; for(k = 0; k < im.c; ++k){ @@ -709,21 +562,20 @@ void save_image_png(image im, const char *name) data[i*im.c+k] = (unsigned char) (255*im.data[i + k*im.w*im.h]); } } - int success = stbi_write_png(buff, im.w, im.h, im.c, data, im.w*im.c); + int success = 0; + if(f == PNG) success = stbi_write_png(buff, im.w, im.h, im.c, data, im.w*im.c); + else if (f == BMP) success = stbi_write_bmp(buff, im.w, im.h, im.c, data); + else if (f == TGA) success = stbi_write_tga(buff, im.w, im.h, im.c, data); + else if (f == JPG) success = stbi_write_jpg(buff, im.w, im.h, im.c, data, quality); free(data); if(!success) fprintf(stderr, "Failed to write image %s\n", buff); } void save_image(image im, const char *name) { -#ifdef OPENCV - save_image_jpg(im, name); -#else - save_image_png(im, name); -#endif + save_image_options(im, name, JPG, 80); } - void show_image_layers(image p, char *name) { int i; @@ -938,11 +790,7 @@ void composite_3d(char *f1, char *f2, char *out, int delta) for(i = 0; i < c.w*c.h; ++i){ c.data[i] = a.data[i]; } -#ifdef OPENCV - save_image_jpg(c, out); -#else save_image(c, out); -#endif } void letterbox_image_into(image im, int w, int h, image boxed) @@ -1437,7 +1285,6 @@ void test_resize(char *filename) show_image(c, "rand", 1); printf("%f %f %f\n", dhue, dsat, dexp); free_image(c); - cvWaitKey(0); } #endif } diff --git a/src/image.h b/src/image.h index 789cf18da01..3392bb9787f 100644 --- a/src/image.h +++ b/src/image.h @@ -9,14 +9,15 @@ #include "box.h" #include "darknet.h" -#ifndef __cplusplus -#ifdef OPENCV -int fill_image_from_stream(CvCapture *cap, image im); -image ipl_to_image(IplImage* src); -void ipl_into_image(IplImage* src, image im); -void flush_stream_buffer(CvCapture *cap, int n); -void show_image_cv(image p, const char *name, IplImage *disp); +#ifdef __cplusplus +extern "C" { #endif + +#ifdef OPENCV +void *open_video_stream(const char *f, int c, int w, int h, int fps); +image get_image_from_stream(void *p); +image load_image_cv(char *filename, int channels); +int show_image_cv(image im, const char* name, int ms); #endif float get_color(int c, int x, int max); @@ -60,5 +61,9 @@ void copy_image_into(image src, image dest); image get_image_layer(image m, int l); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/image_opencv.cpp b/src/image_opencv.cpp new file mode 100644 index 00000000000..7511280be07 --- /dev/null +++ b/src/image_opencv.cpp @@ -0,0 +1,135 @@ +#ifdef OPENCV + +#include "stdio.h" +#include "stdlib.h" +#include "opencv2/opencv.hpp" +#include "image.h" + +using namespace cv; + +extern "C" { + +IplImage *image_to_ipl(image im) +{ + int x,y,c; + IplImage *disp = cvCreateImage(cvSize(im.w,im.h), IPL_DEPTH_8U, im.c); + int step = disp->widthStep; + for(y = 0; y < im.h; ++y){ + for(x = 0; x < im.w; ++x){ + for(c= 0; c < im.c; ++c){ + float val = im.data[c*im.h*im.w + y*im.w + x]; + disp->imageData[y*step + x*im.c + c] = (unsigned char)(val*255); + } + } + } + return disp; +} + +image ipl_to_image(IplImage* src) +{ + int h = src->height; + int w = src->width; + int c = src->nChannels; + image im = make_image(w, h, c); + unsigned char *data = (unsigned char *)src->imageData; + int step = src->widthStep; + int i, j, k; + + for(i = 0; i < h; ++i){ + for(k= 0; k < c; ++k){ + for(j = 0; j < w; ++j){ + im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.; + } + } + } + return im; +} + +Mat image_to_mat(image im) +{ + image copy = copy_image(im); + constrain_image(copy); + if(im.c == 3) rgbgr_image(copy); + + IplImage *ipl = image_to_ipl(copy); + Mat m = cvarrToMat(ipl, true); + cvReleaseImage(&ipl); + free_image(copy); + return m; +} + +image mat_to_image(Mat m) +{ + IplImage ipl = m; + image im = ipl_to_image(&ipl); + rgbgr_image(im); + return im; +} + +void *open_video_stream(const char *f, int c, int w, int h, int fps) +{ + VideoCapture *cap; + if(f) cap = new VideoCapture(f); + else cap = new VideoCapture(c); + if(!cap->isOpened()) return 0; + if(w) cap->set(CV_CAP_PROP_FRAME_WIDTH, w); + if(h) cap->set(CV_CAP_PROP_FRAME_HEIGHT, w); + if(fps) cap->set(CV_CAP_PROP_FPS, w); + return (void *) cap; +} + +image get_image_from_stream(void *p) +{ + VideoCapture *cap = (VideoCapture *)p; + Mat m; + *cap >> m; + if(m.empty()) return make_empty_image(0,0,0); + return mat_to_image(m); +} + +image load_image_cv(char *filename, int channels) +{ + int flag = -1; + if (channels == 0) flag = -1; + else if (channels == 1) flag = 0; + else if (channels == 3) flag = 1; + else { + fprintf(stderr, "OpenCV can't force load with %d channels\n", channels); + } + Mat m; + m = imread(filename, flag); + if(!m.data){ + fprintf(stderr, "Cannot load image \"%s\"\n", filename); + char buff[256]; + sprintf(buff, "echo %s >> bad.list", filename); + system(buff); + return make_image(10,10,3); + //exit(0); + } + image im = mat_to_image(m); + return im; +} + +int show_image_cv(image im, const char* name, int ms) +{ + Mat m = image_to_mat(im); + imshow(name, m); + int c = waitKey(ms); + if (c != -1) c = c%256; + return c; +} + +void make_window(char *name, int w, int h, int fullscreen) +{ + namedWindow(name, WINDOW_NORMAL); + if (fullscreen) { + setWindowProperty(name, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); + } else { + resizeWindow(name, w, h); + if(strcmp(name, "Demo") == 0) moveWindow(name, 0, 0); + } +} + +} + +#endif From 61c9d02ec461e30d55762ec7669d6a1d3c356fb2 Mon Sep 17 00:00:00 2001 From: Joseph Redmon Date: Fri, 14 Sep 2018 08:03:20 -0700 Subject: [PATCH 094/118] guys one of my beehives died :-( :bee: :skull: --- cfg/extraction.cfg | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cfg/extraction.cfg b/cfg/extraction.cfg index e18d5c0db1e..66cb15f80e9 100644 --- a/cfg/extraction.cfg +++ b/cfg/extraction.cfg @@ -1,6 +1,12 @@ [net] -batch=128 +# Training +# batch=128 +# subdivisions=4 + +# Testing +batch=1 subdivisions=1 + height=224 width=224 max_crop=320 From 0ff23438c66629deff8df2551baffbbb29987dee Mon Sep 17 00:00:00 2001 From: Alexey Date: Fri, 24 Apr 2020 04:15:09 +0300 Subject: [PATCH 095/118] Update Readme.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 09fdeeeb5e7..30e752e66a5 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,10 @@ # Darknet # Darknet is an open source neural network framework written in C and CUDA. It is fast, easy to install, and supports CPU and GPU computation. +Yolo v4 paper: https://arxiv.org/abs/2004.10934 + +Yolo v4 source code: https://github.com/AlexeyAB/darknet + For more information see the [Darknet project website](http://pjreddie.com/darknet). For questions or issues please use the [Google Group](https://groups.google.com/forum/#!forum/darknet). From 59b4ade9e74f2be8242d2ee9306b59fddb7698cd Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 2 Jun 2020 14:44:57 +0300 Subject: [PATCH 096/118] Update Readme.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 30e752e66a5..b0e028e4ef8 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ Yolo v4 paper: https://arxiv.org/abs/2004.10934 Yolo v4 source code: https://github.com/AlexeyAB/darknet +Useful links: https://medium.com/@alexeyab84/yolov4-the-most-accurate-real-time-neural-network-on-ms-coco-dataset-73adfd3602fe?source=friends_link&sk=6039748846bbcf1d960c3061542591d7 + For more information see the [Darknet project website](http://pjreddie.com/darknet). For questions or issues please use the [Google Group](https://groups.google.com/forum/#!forum/darknet). From bc5ea7cca8c770ebdacd2c792ddd96f6904ee23a Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 19 Jul 2020 23:56:14 +0300 Subject: [PATCH 097/118] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b0e028e4ef8..7a9c9a0dc8d 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ Yolo v4 paper: https://arxiv.org/abs/2004.10934 Yolo v4 source code: https://github.com/AlexeyAB/darknet +Yolov v4 tiny discussion: https://www.reddit.com/r/MachineLearning/comments/hu7lyt/p_yolov4tiny_speed_1770_fps_tensorrtbatch4/ + Useful links: https://medium.com/@alexeyab84/yolov4-the-most-accurate-real-time-neural-network-on-ms-coco-dataset-73adfd3602fe?source=friends_link&sk=6039748846bbcf1d960c3061542591d7 For more information see the [Darknet project website](http://pjreddie.com/darknet). From 4a03d405982aa1e1e911eac42b0ffce29cc8c8ef Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 16 Aug 2020 19:17:19 +0300 Subject: [PATCH 098/118] Update README.md --- README.md | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7a9c9a0dc8d..9ae36dda42d 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,28 @@ # Darknet # Darknet is an open source neural network framework written in C and CUDA. It is fast, easy to install, and supports CPU and GPU computation. -Yolo v4 paper: https://arxiv.org/abs/2004.10934 +## YOLOv4: -Yolo v4 source code: https://github.com/AlexeyAB/darknet +* **paper:** https://arxiv.org/abs/2004.10934 -Yolov v4 tiny discussion: https://www.reddit.com/r/MachineLearning/comments/hu7lyt/p_yolov4tiny_speed_1770_fps_tensorrtbatch4/ +* **source code:** https://github.com/AlexeyAB/darknet -Useful links: https://medium.com/@alexeyab84/yolov4-the-most-accurate-real-time-neural-network-on-ms-coco-dataset-73adfd3602fe?source=friends_link&sk=6039748846bbcf1d960c3061542591d7 +* **Wiki:** https://github.com/AlexeyAB/darknet/wiki + +* **useful links:** https://medium.com/@alexeyab84/yolov4-the-most-accurate-real-time-neural-network-on-ms-coco-dataset-73adfd3602fe?source=friends_link&sk=6039748846bbcf1d960c3061542591d7 For more information see the [Darknet project website](http://pjreddie.com/darknet). For questions or issues please use the [Google Group](https://groups.google.com/forum/#!forum/darknet). + + +![YOLOv4Tiny](https://user-images.githubusercontent.com/4096485/85734112-6e366700-b705-11ea-95d1-fcba0de76d72.png) + +---- + +![YOLOv4](https://user-images.githubusercontent.com/4096485/90338826-06114c80-dff5-11ea-9ba2-8eb63a7409b3.png) + + +---- + +![OpenCV_TRT](https://user-images.githubusercontent.com/4096485/90338805-e5e18d80-dff4-11ea-8a68-5710956256ff.png) From e652fb4db8d94c8d5dedd30001e95f5397881f33 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 24 Nov 2020 20:18:20 +0300 Subject: [PATCH 099/118] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9ae36dda42d..1b926f83ba9 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ # Darknet # Darknet is an open source neural network framework written in C and CUDA. It is fast, easy to install, and supports CPU and GPU computation. +**Discord** invite link for for communication and questions: https://discord.gg/zSq8rtW + ## YOLOv4: * **paper:** https://arxiv.org/abs/2004.10934 From d05b1f9383c4fda7f60b793a4c0c987402a60e72 Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 7 Dec 2020 17:37:07 +0300 Subject: [PATCH 100/118] Update README.md --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b926f83ba9..56c939144e4 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,14 @@ Darknet is an open source neural network framework written in C and CUDA. It is **Discord** invite link for for communication and questions: https://discord.gg/zSq8rtW +## Scaled-YOLOv4: + +* **paper:** https://arxiv.org/abs/2011.08036 + +* **source code:** https://github.com/WongKinYiu/ScaledYOLOv4 + +* **Darknet:** https://github.com/AlexeyAB/darknet + ## YOLOv4: * **paper:** https://arxiv.org/abs/2004.10934 @@ -19,8 +27,11 @@ For more information see the [Darknet project website](http://pjreddie.com/darkn For questions or issues please use the [Google Group](https://groups.google.com/forum/#!forum/darknet). +![scaled_yolov4](https://user-images.githubusercontent.com/4096485/101356322-f1f5a180-38a8-11eb-9907-4fe4f188d887.png) AP50:95 - FPS (Tesla V100) Paper: https://arxiv.org/abs/2011.08036 + +---- -![YOLOv4Tiny](https://user-images.githubusercontent.com/4096485/85734112-6e366700-b705-11ea-95d1-fcba0de76d72.png) +![YOLOv4Tiny](https://user-images.githubusercontent.com/4096485/101363015-e5c21200-38b1-11eb-986f-b3e516e05977.png) ---- From 8ba90d030e7bd166e991d91318f9ac99d02e6588 Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 7 Dec 2020 19:11:16 +0300 Subject: [PATCH 101/118] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 56c939144e4..fa9c330bddc 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ Darknet is an open source neural network framework written in C and CUDA. It is * **Darknet:** https://github.com/AlexeyAB/darknet +* **Medium:** https://alexeyab84.medium.com/yolov4-the-most-accurate-real-time-neural-network-on-ms-coco-dataset-73adfd3602fe?sk=6039748846bbcf1d960c3061542591d7 + ## YOLOv4: * **paper:** https://arxiv.org/abs/2004.10934 From 70fdf4552c0201062f99dd7ea31479e2185fe42e Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 7 Dec 2020 19:11:53 +0300 Subject: [PATCH 102/118] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa9c330bddc..2be4897e2a9 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Darknet is an open source neural network framework written in C and CUDA. It is * **Darknet:** https://github.com/AlexeyAB/darknet -* **Medium:** https://alexeyab84.medium.com/yolov4-the-most-accurate-real-time-neural-network-on-ms-coco-dataset-73adfd3602fe?sk=6039748846bbcf1d960c3061542591d7 +* **Medium:** https://alexeyab84.medium.com/scaled-yolo-v4-is-the-best-neural-network-for-object-detection-on-ms-coco-dataset-39dfa22fa982 ## YOLOv4: From 6667971c28aa6a9943b1f405d6f968e3a9fff26c Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 8 Dec 2020 13:16:39 +0300 Subject: [PATCH 103/118] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2be4897e2a9..ec2934acc02 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ Darknet is an open source neural network framework written in C and CUDA. It is * **paper:** https://arxiv.org/abs/2011.08036 -* **source code:** https://github.com/WongKinYiu/ScaledYOLOv4 +* **source code - Pytorch:** https://github.com/WongKinYiu/ScaledYOLOv4 -* **Darknet:** https://github.com/AlexeyAB/darknet +* **source code - Darknet:** https://github.com/AlexeyAB/darknet -* **Medium:** https://alexeyab84.medium.com/scaled-yolo-v4-is-the-best-neural-network-for-object-detection-on-ms-coco-dataset-39dfa22fa982 +* **Medium:** https://alexeyab84.medium.com/scaled-yolo-v4-is-the-best-neural-network-for-object-detection-on-ms-coco-dataset-39dfa22fa982?source=friends_link&sk=c8553bfed861b1a7932f739d26f487c8 ## YOLOv4: From a3714d0a2bf92c3dea84c4bea65b2b0c64dbc6b1 Mon Sep 17 00:00:00 2001 From: Alexey Date: Thu, 10 Dec 2020 22:54:19 +0300 Subject: [PATCH 104/118] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec2934acc02..b93850fc522 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Darknet is an open source neural network framework written in C and CUDA. It is * **paper:** https://arxiv.org/abs/2011.08036 -* **source code - Pytorch:** https://github.com/WongKinYiu/ScaledYOLOv4 +* **source code - Pytorch (use to reproduce results):** https://github.com/WongKinYiu/ScaledYOLOv4 * **source code - Darknet:** https://github.com/AlexeyAB/darknet From 17d47744a290a6d95f9f4d592e8955b5baa8615f Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 7 Apr 2021 03:17:02 +0300 Subject: [PATCH 105/118] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b93850fc522..92b5c8be273 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ For more information see the [Darknet project website](http://pjreddie.com/darkn For questions or issues please use the [Google Group](https://groups.google.com/forum/#!forum/darknet). -![scaled_yolov4](https://user-images.githubusercontent.com/4096485/101356322-f1f5a180-38a8-11eb-9907-4fe4f188d887.png) AP50:95 - FPS (Tesla V100) Paper: https://arxiv.org/abs/2011.08036 +![scaled_yolov4](https://user-images.githubusercontent.com/4096485/112776361-281d8380-9048-11eb-8083-8728b12dcd55.png) AP50:95 - FPS (Tesla V100) Paper: https://arxiv.org/abs/2011.08036 ---- From da31f925d90e84cf985d57e03e287029f822180a Mon Sep 17 00:00:00 2001 From: Stefano Sinigardi Date: Sun, 25 Apr 2021 20:39:56 +0200 Subject: [PATCH 106/118] remove build folder --- .gitignore | 1 + build/darknet/darknet.sln | 28 - build/darknet/darknet.vcxproj | 307 - build/darknet/darknet_no_gpu.sln | 28 - build/darknet/darknet_no_gpu.vcxproj | 309 - build/darknet/x64/backup/tmp.txt | 0 build/darknet/x64/cfg/Gaussian_yolov3_BDD.cfg | 807 - build/darknet/x64/cfg/alexnet.cfg | 95 - build/darknet/x64/cfg/cd53paspp-gamma.cfg | 1153 - build/darknet/x64/cfg/cifar.cfg | 126 - build/darknet/x64/cfg/cifar.test.cfg | 119 - build/darknet/x64/cfg/coco.data | 8 - build/darknet/x64/cfg/combine9k.data | 10 - build/darknet/x64/cfg/crnn.train.cfg | 52 - build/darknet/x64/cfg/csdarknet53-omega.cfg | 762 - build/darknet/x64/cfg/cspx-p7-mish-omega.cfg | 1459 -- build/darknet/x64/cfg/cspx-p7-mish.cfg | 2604 -- build/darknet/x64/cfg/cspx-p7-mish_hp.cfg | 2638 -- ...csresnext50-panet-spp-original-optimal.cfg | 1042 - .../darknet/x64/cfg/csresnext50-panet-spp.cfg | 1018 - build/darknet/x64/cfg/darknet.cfg | 111 - build/darknet/x64/cfg/darknet19.cfg | 194 - build/darknet/x64/cfg/darknet19_448.cfg | 202 - build/darknet/x64/cfg/darknet53.cfg | 566 - build/darknet/x64/cfg/darknet53_448_xnor.cfg | 619 - build/darknet/x64/cfg/densenet201.cfg | 1954 -- build/darknet/x64/cfg/efficientnet-lite3.cfg | 1009 - build/darknet/x64/cfg/efficientnet_b0.cfg | 1009 - build/darknet/x64/cfg/enet-coco.cfg | 1072 - build/darknet/x64/cfg/extraction.cfg | 206 - build/darknet/x64/cfg/extraction.conv.cfg | 179 - build/darknet/x64/cfg/extraction22k.cfg | 209 - build/darknet/x64/cfg/go.test.cfg | 131 - build/darknet/x64/cfg/gru.cfg | 34 - build/darknet/x64/cfg/imagenet1k.data | 9 - build/darknet/x64/cfg/imagenet22k.dataset | 8 - .../x64/cfg/imagenet9k.hierarchy.dataset | 9 - build/darknet/x64/cfg/jnet-conv.cfg | 118 - build/darknet/x64/cfg/lstm.train.cfg | 35 - build/darknet/x64/cfg/openimages.data | 8 - build/darknet/x64/cfg/resnet101.cfg | 990 - build/darknet/x64/cfg/resnet152.cfg | 1463 -- build/darknet/x64/cfg/resnet152_trident.cfg | 2177 -- build/darknet/x64/cfg/resnet50.cfg | 511 - build/darknet/x64/cfg/resnext152-32x4d.cfg | 1562 -- build/darknet/x64/cfg/rnn.cfg | 40 - build/darknet/x64/cfg/rnn.train.cfg | 40 - build/darknet/x64/cfg/strided.cfg | 185 - build/darknet/x64/cfg/t1.test.cfg | 117 - build/darknet/x64/cfg/tiny-yolo-voc.cfg | 134 - build/darknet/x64/cfg/tiny-yolo.cfg | 134 - build/darknet/x64/cfg/tiny-yolo_xnor.cfg | 148 - build/darknet/x64/cfg/tiny.cfg | 172 - build/darknet/x64/cfg/vgg-16.cfg | 153 - build/darknet/x64/cfg/vgg-conv.cfg | 123 - build/darknet/x64/cfg/voc.data | 7 - build/darknet/x64/cfg/writing.cfg | 41 - build/darknet/x64/cfg/yolo-voc.2.0.cfg | 244 - build/darknet/x64/cfg/yolo-voc.cfg | 258 - build/darknet/x64/cfg/yolo.2.0.cfg | 244 - build/darknet/x64/cfg/yolo.cfg | 258 - build/darknet/x64/cfg/yolo9000.cfg | 218 - build/darknet/x64/cfg/yolov2-tiny-voc.cfg | 138 - build/darknet/x64/cfg/yolov2-tiny.cfg | 139 - build/darknet/x64/cfg/yolov2-voc.cfg | 258 - build/darknet/x64/cfg/yolov2.cfg | 258 - build/darknet/x64/cfg/yolov3-openimages.cfg | 789 - build/darknet/x64/cfg/yolov3-spp.cfg | 822 - build/darknet/x64/cfg/yolov3-tiny-prn.cfg | 199 - build/darknet/x64/cfg/yolov3-tiny.cfg | 182 - build/darknet/x64/cfg/yolov3-tiny_3l.cfg | 227 - build/darknet/x64/cfg/yolov3-tiny_obj.cfg | 182 - .../x64/cfg/yolov3-tiny_occlusion_track.cfg | 218 - build/darknet/x64/cfg/yolov3-tiny_xnor.cfg | 197 - build/darknet/x64/cfg/yolov3-voc.cfg | 785 - .../x64/cfg/yolov3-voc.yolov3-giou-40.cfg | 808 - build/darknet/x64/cfg/yolov3.cfg | 789 - build/darknet/x64/cfg/yolov3.coco-giou-12.cfg | 806 - build/darknet/x64/cfg/yolov3_5l.cfg | 968 - build/darknet/x64/cfg/yolov4-csp.cfg | 1279 - build/darknet/x64/cfg/yolov4-custom.cfg | 1160 - build/darknet/x64/cfg/yolov4-tiny-3l.cfg | 332 - build/darknet/x64/cfg/yolov4-tiny-custom.cfg | 281 - build/darknet/x64/cfg/yolov4-tiny.cfg | 294 - .../x64/cfg/yolov4-tiny_contrastive.cfg | 452 - build/darknet/x64/cfg/yolov4.cfg | 1158 - build/darknet/x64/cfg/yolov4x-mish.cfg | 1436 - build/darknet/x64/darknet.py | 311 - build/darknet/x64/darknet_video.py | 134 - build/darknet/x64/data/9k.labels | 9418 ------- build/darknet/x64/data/9k.names | 9418 ------- build/darknet/x64/data/9k.tree | 9418 ------- build/darknet/x64/data/coco.data | 8 - build/darknet/x64/data/coco.names | 80 - build/darknet/x64/data/coco9k.map | 80 - build/darknet/x64/data/combine9k.data | 10 - build/darknet/x64/data/dog.jpg | Bin 163759 -> 0 bytes build/darknet/x64/data/eagle.jpg | Bin 141886 -> 0 bytes build/darknet/x64/data/giraffe.jpg | Bin 382965 -> 0 bytes build/darknet/x64/data/goal.txt | 3 - build/darknet/x64/data/horses.jpg | Bin 133495 -> 0 bytes build/darknet/x64/data/imagenet.labels.list | 21842 ---------------- .../darknet/x64/data/imagenet.shortnames.list | 21842 ---------------- build/darknet/x64/data/inet9k.map | 200 - build/darknet/x64/data/labels/100_0.png | Bin 320 -> 0 bytes build/darknet/x64/data/labels/100_1.png | Bin 377 -> 0 bytes build/darknet/x64/data/labels/100_2.png | Bin 451 -> 0 bytes build/darknet/x64/data/labels/100_3.png | Bin 508 -> 0 bytes build/darknet/x64/data/labels/100_4.png | Bin 577 -> 0 bytes build/darknet/x64/data/labels/100_5.png | Bin 631 -> 0 bytes build/darknet/x64/data/labels/100_6.png | Bin 697 -> 0 bytes build/darknet/x64/data/labels/100_7.png | Bin 753 -> 0 bytes build/darknet/x64/data/labels/101_0.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/101_1.png | Bin 388 -> 0 bytes build/darknet/x64/data/labels/101_2.png | Bin 458 -> 0 bytes build/darknet/x64/data/labels/101_3.png | Bin 514 -> 0 bytes build/darknet/x64/data/labels/101_4.png | Bin 581 -> 0 bytes build/darknet/x64/data/labels/101_5.png | Bin 654 -> 0 bytes build/darknet/x64/data/labels/101_6.png | Bin 726 -> 0 bytes build/darknet/x64/data/labels/101_7.png | Bin 804 -> 0 bytes build/darknet/x64/data/labels/102_0.png | Bin 305 -> 0 bytes build/darknet/x64/data/labels/102_1.png | Bin 340 -> 0 bytes build/darknet/x64/data/labels/102_2.png | Bin 354 -> 0 bytes build/darknet/x64/data/labels/102_3.png | Bin 371 -> 0 bytes build/darknet/x64/data/labels/102_4.png | Bin 398 -> 0 bytes build/darknet/x64/data/labels/102_5.png | Bin 411 -> 0 bytes build/darknet/x64/data/labels/102_6.png | Bin 422 -> 0 bytes build/darknet/x64/data/labels/102_7.png | Bin 442 -> 0 bytes build/darknet/x64/data/labels/103_0.png | Bin 333 -> 0 bytes build/darknet/x64/data/labels/103_1.png | Bin 415 -> 0 bytes build/darknet/x64/data/labels/103_2.png | Bin 521 -> 0 bytes build/darknet/x64/data/labels/103_3.png | Bin 586 -> 0 bytes build/darknet/x64/data/labels/103_4.png | Bin 687 -> 0 bytes build/darknet/x64/data/labels/103_5.png | Bin 781 -> 0 bytes build/darknet/x64/data/labels/103_6.png | Bin 858 -> 0 bytes build/darknet/x64/data/labels/103_7.png | Bin 971 -> 0 bytes build/darknet/x64/data/labels/104_0.png | Bin 315 -> 0 bytes build/darknet/x64/data/labels/104_1.png | Bin 345 -> 0 bytes build/darknet/x64/data/labels/104_2.png | Bin 382 -> 0 bytes build/darknet/x64/data/labels/104_3.png | Bin 412 -> 0 bytes build/darknet/x64/data/labels/104_4.png | Bin 439 -> 0 bytes build/darknet/x64/data/labels/104_5.png | Bin 476 -> 0 bytes build/darknet/x64/data/labels/104_6.png | Bin 511 -> 0 bytes build/darknet/x64/data/labels/104_7.png | Bin 542 -> 0 bytes build/darknet/x64/data/labels/105_0.png | Bin 296 -> 0 bytes build/darknet/x64/data/labels/105_1.png | Bin 306 -> 0 bytes build/darknet/x64/data/labels/105_2.png | Bin 318 -> 0 bytes build/darknet/x64/data/labels/105_3.png | Bin 336 -> 0 bytes build/darknet/x64/data/labels/105_4.png | Bin 352 -> 0 bytes build/darknet/x64/data/labels/105_5.png | Bin 360 -> 0 bytes build/darknet/x64/data/labels/105_6.png | Bin 379 -> 0 bytes build/darknet/x64/data/labels/105_7.png | Bin 391 -> 0 bytes build/darknet/x64/data/labels/106_0.png | Bin 293 -> 0 bytes build/darknet/x64/data/labels/106_1.png | Bin 307 -> 0 bytes build/darknet/x64/data/labels/106_2.png | Bin 319 -> 0 bytes build/darknet/x64/data/labels/106_3.png | Bin 335 -> 0 bytes build/darknet/x64/data/labels/106_4.png | Bin 348 -> 0 bytes build/darknet/x64/data/labels/106_5.png | Bin 363 -> 0 bytes build/darknet/x64/data/labels/106_6.png | Bin 374 -> 0 bytes build/darknet/x64/data/labels/106_7.png | Bin 390 -> 0 bytes build/darknet/x64/data/labels/107_0.png | Bin 314 -> 0 bytes build/darknet/x64/data/labels/107_1.png | Bin 358 -> 0 bytes build/darknet/x64/data/labels/107_2.png | Bin 410 -> 0 bytes build/darknet/x64/data/labels/107_3.png | Bin 446 -> 0 bytes build/darknet/x64/data/labels/107_4.png | Bin 490 -> 0 bytes build/darknet/x64/data/labels/107_5.png | Bin 526 -> 0 bytes build/darknet/x64/data/labels/107_6.png | Bin 581 -> 0 bytes build/darknet/x64/data/labels/107_7.png | Bin 609 -> 0 bytes build/darknet/x64/data/labels/108_0.png | Bin 285 -> 0 bytes build/darknet/x64/data/labels/108_1.png | Bin 288 -> 0 bytes build/darknet/x64/data/labels/108_2.png | Bin 296 -> 0 bytes build/darknet/x64/data/labels/108_3.png | Bin 298 -> 0 bytes build/darknet/x64/data/labels/108_4.png | Bin 298 -> 0 bytes build/darknet/x64/data/labels/108_5.png | Bin 300 -> 0 bytes build/darknet/x64/data/labels/108_6.png | Bin 302 -> 0 bytes build/darknet/x64/data/labels/108_7.png | Bin 305 -> 0 bytes build/darknet/x64/data/labels/109_0.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/109_1.png | Bin 371 -> 0 bytes build/darknet/x64/data/labels/109_2.png | Bin 426 -> 0 bytes build/darknet/x64/data/labels/109_3.png | Bin 475 -> 0 bytes build/darknet/x64/data/labels/109_4.png | Bin 528 -> 0 bytes build/darknet/x64/data/labels/109_5.png | Bin 587 -> 0 bytes build/darknet/x64/data/labels/109_6.png | Bin 628 -> 0 bytes build/darknet/x64/data/labels/109_7.png | Bin 694 -> 0 bytes build/darknet/x64/data/labels/110_0.png | Bin 312 -> 0 bytes build/darknet/x64/data/labels/110_1.png | Bin 341 -> 0 bytes build/darknet/x64/data/labels/110_2.png | Bin 378 -> 0 bytes build/darknet/x64/data/labels/110_3.png | Bin 414 -> 0 bytes build/darknet/x64/data/labels/110_4.png | Bin 444 -> 0 bytes build/darknet/x64/data/labels/110_5.png | Bin 479 -> 0 bytes build/darknet/x64/data/labels/110_6.png | Bin 509 -> 0 bytes build/darknet/x64/data/labels/110_7.png | Bin 544 -> 0 bytes build/darknet/x64/data/labels/111_0.png | Bin 320 -> 0 bytes build/darknet/x64/data/labels/111_1.png | Bin 396 -> 0 bytes build/darknet/x64/data/labels/111_2.png | Bin 471 -> 0 bytes build/darknet/x64/data/labels/111_3.png | Bin 534 -> 0 bytes build/darknet/x64/data/labels/111_4.png | Bin 615 -> 0 bytes build/darknet/x64/data/labels/111_5.png | Bin 686 -> 0 bytes build/darknet/x64/data/labels/111_6.png | Bin 781 -> 0 bytes build/darknet/x64/data/labels/111_7.png | Bin 855 -> 0 bytes build/darknet/x64/data/labels/112_0.png | Bin 322 -> 0 bytes build/darknet/x64/data/labels/112_1.png | Bin 382 -> 0 bytes build/darknet/x64/data/labels/112_2.png | Bin 450 -> 0 bytes build/darknet/x64/data/labels/112_3.png | Bin 507 -> 0 bytes build/darknet/x64/data/labels/112_4.png | Bin 568 -> 0 bytes build/darknet/x64/data/labels/112_5.png | Bin 641 -> 0 bytes build/darknet/x64/data/labels/112_6.png | Bin 710 -> 0 bytes build/darknet/x64/data/labels/112_7.png | Bin 766 -> 0 bytes build/darknet/x64/data/labels/113_0.png | Bin 322 -> 0 bytes build/darknet/x64/data/labels/113_1.png | Bin 386 -> 0 bytes build/darknet/x64/data/labels/113_2.png | Bin 450 -> 0 bytes build/darknet/x64/data/labels/113_3.png | Bin 506 -> 0 bytes build/darknet/x64/data/labels/113_4.png | Bin 572 -> 0 bytes build/darknet/x64/data/labels/113_5.png | Bin 631 -> 0 bytes build/darknet/x64/data/labels/113_6.png | Bin 702 -> 0 bytes build/darknet/x64/data/labels/113_7.png | Bin 760 -> 0 bytes build/darknet/x64/data/labels/114_0.png | Bin 299 -> 0 bytes build/darknet/x64/data/labels/114_1.png | Bin 317 -> 0 bytes build/darknet/x64/data/labels/114_2.png | Bin 340 -> 0 bytes build/darknet/x64/data/labels/114_3.png | Bin 363 -> 0 bytes build/darknet/x64/data/labels/114_4.png | Bin 391 -> 0 bytes build/darknet/x64/data/labels/114_5.png | Bin 413 -> 0 bytes build/darknet/x64/data/labels/114_6.png | Bin 441 -> 0 bytes build/darknet/x64/data/labels/114_7.png | Bin 460 -> 0 bytes build/darknet/x64/data/labels/115_0.png | Bin 315 -> 0 bytes build/darknet/x64/data/labels/115_1.png | Bin 373 -> 0 bytes build/darknet/x64/data/labels/115_2.png | Bin 436 -> 0 bytes build/darknet/x64/data/labels/115_3.png | Bin 497 -> 0 bytes build/darknet/x64/data/labels/115_4.png | Bin 552 -> 0 bytes build/darknet/x64/data/labels/115_5.png | Bin 618 -> 0 bytes build/darknet/x64/data/labels/115_6.png | Bin 687 -> 0 bytes build/darknet/x64/data/labels/115_7.png | Bin 766 -> 0 bytes build/darknet/x64/data/labels/116_0.png | Bin 299 -> 0 bytes build/darknet/x64/data/labels/116_1.png | Bin 314 -> 0 bytes build/darknet/x64/data/labels/116_2.png | Bin 320 -> 0 bytes build/darknet/x64/data/labels/116_3.png | Bin 324 -> 0 bytes build/darknet/x64/data/labels/116_4.png | Bin 324 -> 0 bytes build/darknet/x64/data/labels/116_5.png | Bin 328 -> 0 bytes build/darknet/x64/data/labels/116_6.png | Bin 332 -> 0 bytes build/darknet/x64/data/labels/116_7.png | Bin 337 -> 0 bytes build/darknet/x64/data/labels/117_0.png | Bin 314 -> 0 bytes build/darknet/x64/data/labels/117_1.png | Bin 350 -> 0 bytes build/darknet/x64/data/labels/117_2.png | Bin 386 -> 0 bytes build/darknet/x64/data/labels/117_3.png | Bin 421 -> 0 bytes build/darknet/x64/data/labels/117_4.png | Bin 470 -> 0 bytes build/darknet/x64/data/labels/117_5.png | Bin 515 -> 0 bytes build/darknet/x64/data/labels/117_6.png | Bin 549 -> 0 bytes build/darknet/x64/data/labels/117_7.png | Bin 584 -> 0 bytes build/darknet/x64/data/labels/118_0.png | Bin 315 -> 0 bytes build/darknet/x64/data/labels/118_1.png | Bin 369 -> 0 bytes build/darknet/x64/data/labels/118_2.png | Bin 442 -> 0 bytes build/darknet/x64/data/labels/118_3.png | Bin 502 -> 0 bytes build/darknet/x64/data/labels/118_4.png | Bin 576 -> 0 bytes build/darknet/x64/data/labels/118_5.png | Bin 653 -> 0 bytes build/darknet/x64/data/labels/118_6.png | Bin 682 -> 0 bytes build/darknet/x64/data/labels/118_7.png | Bin 750 -> 0 bytes build/darknet/x64/data/labels/119_0.png | Bin 334 -> 0 bytes build/darknet/x64/data/labels/119_1.png | Bin 432 -> 0 bytes build/darknet/x64/data/labels/119_2.png | Bin 550 -> 0 bytes build/darknet/x64/data/labels/119_3.png | Bin 657 -> 0 bytes build/darknet/x64/data/labels/119_4.png | Bin 759 -> 0 bytes build/darknet/x64/data/labels/119_5.png | Bin 886 -> 0 bytes build/darknet/x64/data/labels/119_6.png | Bin 977 -> 0 bytes build/darknet/x64/data/labels/119_7.png | Bin 1086 -> 0 bytes build/darknet/x64/data/labels/120_0.png | Bin 316 -> 0 bytes build/darknet/x64/data/labels/120_1.png | Bin 380 -> 0 bytes build/darknet/x64/data/labels/120_2.png | Bin 452 -> 0 bytes build/darknet/x64/data/labels/120_3.png | Bin 509 -> 0 bytes build/darknet/x64/data/labels/120_4.png | Bin 580 -> 0 bytes build/darknet/x64/data/labels/120_5.png | Bin 634 -> 0 bytes build/darknet/x64/data/labels/120_6.png | Bin 706 -> 0 bytes build/darknet/x64/data/labels/120_7.png | Bin 773 -> 0 bytes build/darknet/x64/data/labels/121_0.png | Bin 322 -> 0 bytes build/darknet/x64/data/labels/121_1.png | Bin 395 -> 0 bytes build/darknet/x64/data/labels/121_2.png | Bin 477 -> 0 bytes build/darknet/x64/data/labels/121_3.png | Bin 563 -> 0 bytes build/darknet/x64/data/labels/121_4.png | Bin 645 -> 0 bytes build/darknet/x64/data/labels/121_5.png | Bin 726 -> 0 bytes build/darknet/x64/data/labels/121_6.png | Bin 798 -> 0 bytes build/darknet/x64/data/labels/121_7.png | Bin 866 -> 0 bytes build/darknet/x64/data/labels/122_0.png | Bin 311 -> 0 bytes build/darknet/x64/data/labels/122_1.png | Bin 352 -> 0 bytes build/darknet/x64/data/labels/122_2.png | Bin 388 -> 0 bytes build/darknet/x64/data/labels/122_3.png | Bin 421 -> 0 bytes build/darknet/x64/data/labels/122_4.png | Bin 458 -> 0 bytes build/darknet/x64/data/labels/122_5.png | Bin 500 -> 0 bytes build/darknet/x64/data/labels/122_6.png | Bin 541 -> 0 bytes build/darknet/x64/data/labels/122_7.png | Bin 556 -> 0 bytes build/darknet/x64/data/labels/123_0.png | Bin 320 -> 0 bytes build/darknet/x64/data/labels/123_1.png | Bin 384 -> 0 bytes build/darknet/x64/data/labels/123_2.png | Bin 446 -> 0 bytes build/darknet/x64/data/labels/123_3.png | Bin 503 -> 0 bytes build/darknet/x64/data/labels/123_4.png | Bin 551 -> 0 bytes build/darknet/x64/data/labels/123_5.png | Bin 601 -> 0 bytes build/darknet/x64/data/labels/123_6.png | Bin 661 -> 0 bytes build/darknet/x64/data/labels/123_7.png | Bin 712 -> 0 bytes build/darknet/x64/data/labels/124_0.png | Bin 286 -> 0 bytes build/darknet/x64/data/labels/124_1.png | Bin 288 -> 0 bytes build/darknet/x64/data/labels/124_2.png | Bin 287 -> 0 bytes build/darknet/x64/data/labels/124_3.png | Bin 294 -> 0 bytes build/darknet/x64/data/labels/124_4.png | Bin 293 -> 0 bytes build/darknet/x64/data/labels/124_5.png | Bin 299 -> 0 bytes build/darknet/x64/data/labels/124_6.png | Bin 296 -> 0 bytes build/darknet/x64/data/labels/124_7.png | Bin 301 -> 0 bytes build/darknet/x64/data/labels/125_0.png | Bin 318 -> 0 bytes build/darknet/x64/data/labels/125_1.png | Bin 385 -> 0 bytes build/darknet/x64/data/labels/125_2.png | Bin 437 -> 0 bytes build/darknet/x64/data/labels/125_3.png | Bin 496 -> 0 bytes build/darknet/x64/data/labels/125_4.png | Bin 547 -> 0 bytes build/darknet/x64/data/labels/125_5.png | Bin 602 -> 0 bytes build/darknet/x64/data/labels/125_6.png | Bin 655 -> 0 bytes build/darknet/x64/data/labels/125_7.png | Bin 689 -> 0 bytes build/darknet/x64/data/labels/126_0.png | Bin 305 -> 0 bytes build/darknet/x64/data/labels/126_1.png | Bin 343 -> 0 bytes build/darknet/x64/data/labels/126_2.png | Bin 368 -> 0 bytes build/darknet/x64/data/labels/126_3.png | Bin 406 -> 0 bytes build/darknet/x64/data/labels/126_4.png | Bin 437 -> 0 bytes build/darknet/x64/data/labels/126_5.png | Bin 483 -> 0 bytes build/darknet/x64/data/labels/126_6.png | Bin 524 -> 0 bytes build/darknet/x64/data/labels/126_7.png | Bin 561 -> 0 bytes build/darknet/x64/data/labels/32_0.png | Bin 280 -> 0 bytes build/darknet/x64/data/labels/32_1.png | Bin 281 -> 0 bytes build/darknet/x64/data/labels/32_2.png | Bin 281 -> 0 bytes build/darknet/x64/data/labels/32_3.png | Bin 282 -> 0 bytes build/darknet/x64/data/labels/32_4.png | Bin 282 -> 0 bytes build/darknet/x64/data/labels/32_5.png | Bin 285 -> 0 bytes build/darknet/x64/data/labels/32_6.png | Bin 285 -> 0 bytes build/darknet/x64/data/labels/32_7.png | Bin 285 -> 0 bytes build/darknet/x64/data/labels/33_0.png | Bin 300 -> 0 bytes build/darknet/x64/data/labels/33_1.png | Bin 313 -> 0 bytes build/darknet/x64/data/labels/33_2.png | Bin 324 -> 0 bytes build/darknet/x64/data/labels/33_3.png | Bin 339 -> 0 bytes build/darknet/x64/data/labels/33_4.png | Bin 348 -> 0 bytes build/darknet/x64/data/labels/33_5.png | Bin 365 -> 0 bytes build/darknet/x64/data/labels/33_6.png | Bin 382 -> 0 bytes build/darknet/x64/data/labels/33_7.png | Bin 393 -> 0 bytes build/darknet/x64/data/labels/34_0.png | Bin 295 -> 0 bytes build/darknet/x64/data/labels/34_1.png | Bin 300 -> 0 bytes build/darknet/x64/data/labels/34_2.png | Bin 305 -> 0 bytes build/darknet/x64/data/labels/34_3.png | Bin 316 -> 0 bytes build/darknet/x64/data/labels/34_4.png | Bin 318 -> 0 bytes build/darknet/x64/data/labels/34_5.png | Bin 320 -> 0 bytes build/darknet/x64/data/labels/34_6.png | Bin 320 -> 0 bytes build/darknet/x64/data/labels/34_7.png | Bin 330 -> 0 bytes build/darknet/x64/data/labels/35_0.png | Bin 338 -> 0 bytes build/darknet/x64/data/labels/35_1.png | Bin 445 -> 0 bytes build/darknet/x64/data/labels/35_2.png | Bin 535 -> 0 bytes build/darknet/x64/data/labels/35_3.png | Bin 636 -> 0 bytes build/darknet/x64/data/labels/35_4.png | Bin 739 -> 0 bytes build/darknet/x64/data/labels/35_5.png | Bin 830 -> 0 bytes build/darknet/x64/data/labels/35_6.png | Bin 905 -> 0 bytes build/darknet/x64/data/labels/35_7.png | Bin 999 -> 0 bytes build/darknet/x64/data/labels/36_0.png | Bin 344 -> 0 bytes build/darknet/x64/data/labels/36_1.png | Bin 441 -> 0 bytes build/darknet/x64/data/labels/36_2.png | Bin 517 -> 0 bytes build/darknet/x64/data/labels/36_3.png | Bin 599 -> 0 bytes build/darknet/x64/data/labels/36_4.png | Bin 687 -> 0 bytes build/darknet/x64/data/labels/36_5.png | Bin 762 -> 0 bytes build/darknet/x64/data/labels/36_6.png | Bin 871 -> 0 bytes build/darknet/x64/data/labels/36_7.png | Bin 949 -> 0 bytes build/darknet/x64/data/labels/37_0.png | Bin 351 -> 0 bytes build/darknet/x64/data/labels/37_1.png | Bin 491 -> 0 bytes build/darknet/x64/data/labels/37_2.png | Bin 658 -> 0 bytes build/darknet/x64/data/labels/37_3.png | Bin 858 -> 0 bytes build/darknet/x64/data/labels/37_4.png | Bin 998 -> 0 bytes build/darknet/x64/data/labels/37_5.png | Bin 1157 -> 0 bytes build/darknet/x64/data/labels/37_6.png | Bin 1259 -> 0 bytes build/darknet/x64/data/labels/37_7.png | Bin 1478 -> 0 bytes build/darknet/x64/data/labels/38_0.png | Bin 342 -> 0 bytes build/darknet/x64/data/labels/38_1.png | Bin 466 -> 0 bytes build/darknet/x64/data/labels/38_2.png | Bin 585 -> 0 bytes build/darknet/x64/data/labels/38_3.png | Bin 698 -> 0 bytes build/darknet/x64/data/labels/38_4.png | Bin 823 -> 0 bytes build/darknet/x64/data/labels/38_5.png | Bin 942 -> 0 bytes build/darknet/x64/data/labels/38_6.png | Bin 1053 -> 0 bytes build/darknet/x64/data/labels/38_7.png | Bin 1159 -> 0 bytes build/darknet/x64/data/labels/39_0.png | Bin 300 -> 0 bytes build/darknet/x64/data/labels/39_1.png | Bin 319 -> 0 bytes build/darknet/x64/data/labels/39_2.png | Bin 340 -> 0 bytes build/darknet/x64/data/labels/39_3.png | Bin 368 -> 0 bytes build/darknet/x64/data/labels/39_4.png | Bin 388 -> 0 bytes build/darknet/x64/data/labels/39_5.png | Bin 418 -> 0 bytes build/darknet/x64/data/labels/39_6.png | Bin 444 -> 0 bytes build/darknet/x64/data/labels/39_7.png | Bin 470 -> 0 bytes build/darknet/x64/data/labels/40_0.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/40_1.png | Bin 390 -> 0 bytes build/darknet/x64/data/labels/40_2.png | Bin 449 -> 0 bytes build/darknet/x64/data/labels/40_3.png | Bin 520 -> 0 bytes build/darknet/x64/data/labels/40_4.png | Bin 584 -> 0 bytes build/darknet/x64/data/labels/40_5.png | Bin 641 -> 0 bytes build/darknet/x64/data/labels/40_6.png | Bin 681 -> 0 bytes build/darknet/x64/data/labels/40_7.png | Bin 758 -> 0 bytes build/darknet/x64/data/labels/41_0.png | Bin 322 -> 0 bytes build/darknet/x64/data/labels/41_1.png | Bin 385 -> 0 bytes build/darknet/x64/data/labels/41_2.png | Bin 441 -> 0 bytes build/darknet/x64/data/labels/41_3.png | Bin 522 -> 0 bytes build/darknet/x64/data/labels/41_4.png | Bin 577 -> 0 bytes build/darknet/x64/data/labels/41_5.png | Bin 637 -> 0 bytes build/darknet/x64/data/labels/41_6.png | Bin 690 -> 0 bytes build/darknet/x64/data/labels/41_7.png | Bin 753 -> 0 bytes build/darknet/x64/data/labels/42_0.png | Bin 311 -> 0 bytes build/darknet/x64/data/labels/42_1.png | Bin 352 -> 0 bytes build/darknet/x64/data/labels/42_2.png | Bin 400 -> 0 bytes build/darknet/x64/data/labels/42_3.png | Bin 456 -> 0 bytes build/darknet/x64/data/labels/42_4.png | Bin 520 -> 0 bytes build/darknet/x64/data/labels/42_5.png | Bin 564 -> 0 bytes build/darknet/x64/data/labels/42_6.png | Bin 606 -> 0 bytes build/darknet/x64/data/labels/42_7.png | Bin 677 -> 0 bytes build/darknet/x64/data/labels/43_0.png | Bin 301 -> 0 bytes build/darknet/x64/data/labels/43_1.png | Bin 312 -> 0 bytes build/darknet/x64/data/labels/43_2.png | Bin 320 -> 0 bytes build/darknet/x64/data/labels/43_3.png | Bin 326 -> 0 bytes build/darknet/x64/data/labels/43_4.png | Bin 333 -> 0 bytes build/darknet/x64/data/labels/43_5.png | Bin 339 -> 0 bytes build/darknet/x64/data/labels/43_6.png | Bin 347 -> 0 bytes build/darknet/x64/data/labels/43_7.png | Bin 354 -> 0 bytes build/darknet/x64/data/labels/44_0.png | Bin 296 -> 0 bytes build/darknet/x64/data/labels/44_1.png | Bin 317 -> 0 bytes build/darknet/x64/data/labels/44_2.png | Bin 340 -> 0 bytes build/darknet/x64/data/labels/44_3.png | Bin 368 -> 0 bytes build/darknet/x64/data/labels/44_4.png | Bin 400 -> 0 bytes build/darknet/x64/data/labels/44_5.png | Bin 416 -> 0 bytes build/darknet/x64/data/labels/44_6.png | Bin 451 -> 0 bytes build/darknet/x64/data/labels/44_7.png | Bin 480 -> 0 bytes build/darknet/x64/data/labels/45_0.png | Bin 289 -> 0 bytes build/darknet/x64/data/labels/45_1.png | Bin 298 -> 0 bytes build/darknet/x64/data/labels/45_2.png | Bin 300 -> 0 bytes build/darknet/x64/data/labels/45_3.png | Bin 302 -> 0 bytes build/darknet/x64/data/labels/45_4.png | Bin 305 -> 0 bytes build/darknet/x64/data/labels/45_5.png | Bin 307 -> 0 bytes build/darknet/x64/data/labels/45_6.png | Bin 311 -> 0 bytes build/darknet/x64/data/labels/45_7.png | Bin 316 -> 0 bytes build/darknet/x64/data/labels/46_0.png | Bin 289 -> 0 bytes build/darknet/x64/data/labels/46_1.png | Bin 296 -> 0 bytes build/darknet/x64/data/labels/46_2.png | Bin 308 -> 0 bytes build/darknet/x64/data/labels/46_3.png | Bin 322 -> 0 bytes build/darknet/x64/data/labels/46_4.png | Bin 336 -> 0 bytes build/darknet/x64/data/labels/46_5.png | Bin 348 -> 0 bytes build/darknet/x64/data/labels/46_6.png | Bin 362 -> 0 bytes build/darknet/x64/data/labels/46_7.png | Bin 377 -> 0 bytes build/darknet/x64/data/labels/47_0.png | Bin 326 -> 0 bytes build/darknet/x64/data/labels/47_1.png | Bin 372 -> 0 bytes build/darknet/x64/data/labels/47_2.png | Bin 448 -> 0 bytes build/darknet/x64/data/labels/47_3.png | Bin 518 -> 0 bytes build/darknet/x64/data/labels/47_4.png | Bin 561 -> 0 bytes build/darknet/x64/data/labels/47_5.png | Bin 629 -> 0 bytes build/darknet/x64/data/labels/47_6.png | Bin 672 -> 0 bytes build/darknet/x64/data/labels/47_7.png | Bin 724 -> 0 bytes build/darknet/x64/data/labels/48_0.png | Bin 337 -> 0 bytes build/darknet/x64/data/labels/48_1.png | Bin 440 -> 0 bytes build/darknet/x64/data/labels/48_2.png | Bin 550 -> 0 bytes build/darknet/x64/data/labels/48_3.png | Bin 640 -> 0 bytes build/darknet/x64/data/labels/48_4.png | Bin 753 -> 0 bytes build/darknet/x64/data/labels/48_5.png | Bin 838 -> 0 bytes build/darknet/x64/data/labels/48_6.png | Bin 938 -> 0 bytes build/darknet/x64/data/labels/48_7.png | Bin 1023 -> 0 bytes build/darknet/x64/data/labels/49_0.png | Bin 297 -> 0 bytes build/darknet/x64/data/labels/49_1.png | Bin 306 -> 0 bytes build/darknet/x64/data/labels/49_2.png | Bin 313 -> 0 bytes build/darknet/x64/data/labels/49_3.png | Bin 319 -> 0 bytes build/darknet/x64/data/labels/49_4.png | Bin 331 -> 0 bytes build/darknet/x64/data/labels/49_5.png | Bin 335 -> 0 bytes build/darknet/x64/data/labels/49_6.png | Bin 349 -> 0 bytes build/darknet/x64/data/labels/49_7.png | Bin 352 -> 0 bytes build/darknet/x64/data/labels/50_0.png | Bin 334 -> 0 bytes build/darknet/x64/data/labels/50_1.png | Bin 414 -> 0 bytes build/darknet/x64/data/labels/50_2.png | Bin 477 -> 0 bytes build/darknet/x64/data/labels/50_3.png | Bin 550 -> 0 bytes build/darknet/x64/data/labels/50_4.png | Bin 615 -> 0 bytes build/darknet/x64/data/labels/50_5.png | Bin 689 -> 0 bytes build/darknet/x64/data/labels/50_6.png | Bin 744 -> 0 bytes build/darknet/x64/data/labels/50_7.png | Bin 840 -> 0 bytes build/darknet/x64/data/labels/51_0.png | Bin 336 -> 0 bytes build/darknet/x64/data/labels/51_1.png | Bin 428 -> 0 bytes build/darknet/x64/data/labels/51_2.png | Bin 510 -> 0 bytes build/darknet/x64/data/labels/51_3.png | Bin 608 -> 0 bytes build/darknet/x64/data/labels/51_4.png | Bin 693 -> 0 bytes build/darknet/x64/data/labels/51_5.png | Bin 787 -> 0 bytes build/darknet/x64/data/labels/51_6.png | Bin 872 -> 0 bytes build/darknet/x64/data/labels/51_7.png | Bin 958 -> 0 bytes build/darknet/x64/data/labels/52_0.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/52_1.png | Bin 368 -> 0 bytes build/darknet/x64/data/labels/52_2.png | Bin 412 -> 0 bytes build/darknet/x64/data/labels/52_3.png | Bin 455 -> 0 bytes build/darknet/x64/data/labels/52_4.png | Bin 502 -> 0 bytes build/darknet/x64/data/labels/52_5.png | Bin 547 -> 0 bytes build/darknet/x64/data/labels/52_6.png | Bin 589 -> 0 bytes build/darknet/x64/data/labels/52_7.png | Bin 633 -> 0 bytes build/darknet/x64/data/labels/53_0.png | Bin 330 -> 0 bytes build/darknet/x64/data/labels/53_1.png | Bin 415 -> 0 bytes build/darknet/x64/data/labels/53_2.png | Bin 495 -> 0 bytes build/darknet/x64/data/labels/53_3.png | Bin 577 -> 0 bytes build/darknet/x64/data/labels/53_4.png | Bin 658 -> 0 bytes build/darknet/x64/data/labels/53_5.png | Bin 742 -> 0 bytes build/darknet/x64/data/labels/53_6.png | Bin 820 -> 0 bytes build/darknet/x64/data/labels/53_7.png | Bin 891 -> 0 bytes build/darknet/x64/data/labels/54_0.png | Bin 339 -> 0 bytes build/darknet/x64/data/labels/54_1.png | Bin 434 -> 0 bytes build/darknet/x64/data/labels/54_2.png | Bin 543 -> 0 bytes build/darknet/x64/data/labels/54_3.png | Bin 633 -> 0 bytes build/darknet/x64/data/labels/54_4.png | Bin 723 -> 0 bytes build/darknet/x64/data/labels/54_5.png | Bin 818 -> 0 bytes build/darknet/x64/data/labels/54_6.png | Bin 907 -> 0 bytes build/darknet/x64/data/labels/54_7.png | Bin 1006 -> 0 bytes build/darknet/x64/data/labels/55_0.png | Bin 327 -> 0 bytes build/darknet/x64/data/labels/55_1.png | Bin 385 -> 0 bytes build/darknet/x64/data/labels/55_2.png | Bin 449 -> 0 bytes build/darknet/x64/data/labels/55_3.png | Bin 503 -> 0 bytes build/darknet/x64/data/labels/55_4.png | Bin 548 -> 0 bytes build/darknet/x64/data/labels/55_5.png | Bin 598 -> 0 bytes build/darknet/x64/data/labels/55_6.png | Bin 640 -> 0 bytes build/darknet/x64/data/labels/55_7.png | Bin 710 -> 0 bytes build/darknet/x64/data/labels/56_0.png | Bin 337 -> 0 bytes build/darknet/x64/data/labels/56_1.png | Bin 449 -> 0 bytes build/darknet/x64/data/labels/56_2.png | Bin 553 -> 0 bytes build/darknet/x64/data/labels/56_3.png | Bin 671 -> 0 bytes build/darknet/x64/data/labels/56_4.png | Bin 774 -> 0 bytes build/darknet/x64/data/labels/56_5.png | Bin 888 -> 0 bytes build/darknet/x64/data/labels/56_6.png | Bin 996 -> 0 bytes build/darknet/x64/data/labels/56_7.png | Bin 1088 -> 0 bytes build/darknet/x64/data/labels/57_0.png | Bin 340 -> 0 bytes build/darknet/x64/data/labels/57_1.png | Bin 435 -> 0 bytes build/darknet/x64/data/labels/57_2.png | Bin 532 -> 0 bytes build/darknet/x64/data/labels/57_3.png | Bin 629 -> 0 bytes build/darknet/x64/data/labels/57_4.png | Bin 725 -> 0 bytes build/darknet/x64/data/labels/57_5.png | Bin 823 -> 0 bytes build/darknet/x64/data/labels/57_6.png | Bin 924 -> 0 bytes build/darknet/x64/data/labels/57_7.png | Bin 1012 -> 0 bytes build/darknet/x64/data/labels/58_0.png | Bin 301 -> 0 bytes build/darknet/x64/data/labels/58_1.png | Bin 318 -> 0 bytes build/darknet/x64/data/labels/58_2.png | Bin 332 -> 0 bytes build/darknet/x64/data/labels/58_3.png | Bin 360 -> 0 bytes build/darknet/x64/data/labels/58_4.png | Bin 387 -> 0 bytes build/darknet/x64/data/labels/58_5.png | Bin 402 -> 0 bytes build/darknet/x64/data/labels/58_6.png | Bin 426 -> 0 bytes build/darknet/x64/data/labels/58_7.png | Bin 453 -> 0 bytes build/darknet/x64/data/labels/59_0.png | Bin 306 -> 0 bytes build/darknet/x64/data/labels/59_1.png | Bin 335 -> 0 bytes build/darknet/x64/data/labels/59_2.png | Bin 367 -> 0 bytes build/darknet/x64/data/labels/59_3.png | Bin 408 -> 0 bytes build/darknet/x64/data/labels/59_4.png | Bin 452 -> 0 bytes build/darknet/x64/data/labels/59_5.png | Bin 491 -> 0 bytes build/darknet/x64/data/labels/59_6.png | Bin 530 -> 0 bytes build/darknet/x64/data/labels/59_7.png | Bin 560 -> 0 bytes build/darknet/x64/data/labels/60_0.png | Bin 323 -> 0 bytes build/darknet/x64/data/labels/60_1.png | Bin 387 -> 0 bytes build/darknet/x64/data/labels/60_2.png | Bin 447 -> 0 bytes build/darknet/x64/data/labels/60_3.png | Bin 499 -> 0 bytes build/darknet/x64/data/labels/60_4.png | Bin 578 -> 0 bytes build/darknet/x64/data/labels/60_5.png | Bin 648 -> 0 bytes build/darknet/x64/data/labels/60_6.png | Bin 717 -> 0 bytes build/darknet/x64/data/labels/60_7.png | Bin 770 -> 0 bytes build/darknet/x64/data/labels/61_0.png | Bin 297 -> 0 bytes build/darknet/x64/data/labels/61_1.png | Bin 307 -> 0 bytes build/darknet/x64/data/labels/61_2.png | Bin 310 -> 0 bytes build/darknet/x64/data/labels/61_3.png | Bin 315 -> 0 bytes build/darknet/x64/data/labels/61_4.png | Bin 322 -> 0 bytes build/darknet/x64/data/labels/61_5.png | Bin 330 -> 0 bytes build/darknet/x64/data/labels/61_6.png | Bin 330 -> 0 bytes build/darknet/x64/data/labels/61_7.png | Bin 345 -> 0 bytes build/darknet/x64/data/labels/62_0.png | Bin 322 -> 0 bytes build/darknet/x64/data/labels/62_1.png | Bin 384 -> 0 bytes build/darknet/x64/data/labels/62_2.png | Bin 444 -> 0 bytes build/darknet/x64/data/labels/62_3.png | Bin 496 -> 0 bytes build/darknet/x64/data/labels/62_4.png | Bin 580 -> 0 bytes build/darknet/x64/data/labels/62_5.png | Bin 641 -> 0 bytes build/darknet/x64/data/labels/62_6.png | Bin 702 -> 0 bytes build/darknet/x64/data/labels/62_7.png | Bin 761 -> 0 bytes build/darknet/x64/data/labels/63_0.png | Bin 329 -> 0 bytes build/darknet/x64/data/labels/63_1.png | Bin 410 -> 0 bytes build/darknet/x64/data/labels/63_2.png | Bin 488 -> 0 bytes build/darknet/x64/data/labels/63_3.png | Bin 573 -> 0 bytes build/darknet/x64/data/labels/63_4.png | Bin 641 -> 0 bytes build/darknet/x64/data/labels/63_5.png | Bin 729 -> 0 bytes build/darknet/x64/data/labels/63_6.png | Bin 826 -> 0 bytes build/darknet/x64/data/labels/63_7.png | Bin 893 -> 0 bytes build/darknet/x64/data/labels/64_0.png | Bin 384 -> 0 bytes build/darknet/x64/data/labels/64_1.png | Bin 588 -> 0 bytes build/darknet/x64/data/labels/64_2.png | Bin 805 -> 0 bytes build/darknet/x64/data/labels/64_3.png | Bin 1038 -> 0 bytes build/darknet/x64/data/labels/64_4.png | Bin 1211 -> 0 bytes build/darknet/x64/data/labels/64_5.png | Bin 1438 -> 0 bytes build/darknet/x64/data/labels/64_6.png | Bin 1647 -> 0 bytes build/darknet/x64/data/labels/64_7.png | Bin 1829 -> 0 bytes build/darknet/x64/data/labels/65_0.png | Bin 338 -> 0 bytes build/darknet/x64/data/labels/65_1.png | Bin 424 -> 0 bytes build/darknet/x64/data/labels/65_2.png | Bin 525 -> 0 bytes build/darknet/x64/data/labels/65_3.png | Bin 613 -> 0 bytes build/darknet/x64/data/labels/65_4.png | Bin 699 -> 0 bytes build/darknet/x64/data/labels/65_5.png | Bin 788 -> 0 bytes build/darknet/x64/data/labels/65_6.png | Bin 851 -> 0 bytes build/darknet/x64/data/labels/65_7.png | Bin 961 -> 0 bytes build/darknet/x64/data/labels/66_0.png | Bin 325 -> 0 bytes build/darknet/x64/data/labels/66_1.png | Bin 386 -> 0 bytes build/darknet/x64/data/labels/66_2.png | Bin 450 -> 0 bytes build/darknet/x64/data/labels/66_3.png | Bin 498 -> 0 bytes build/darknet/x64/data/labels/66_4.png | Bin 570 -> 0 bytes build/darknet/x64/data/labels/66_5.png | Bin 624 -> 0 bytes build/darknet/x64/data/labels/66_6.png | Bin 691 -> 0 bytes build/darknet/x64/data/labels/66_7.png | Bin 740 -> 0 bytes build/darknet/x64/data/labels/67_0.png | Bin 331 -> 0 bytes build/darknet/x64/data/labels/67_1.png | Bin 415 -> 0 bytes build/darknet/x64/data/labels/67_2.png | Bin 513 -> 0 bytes build/darknet/x64/data/labels/67_3.png | Bin 608 -> 0 bytes build/darknet/x64/data/labels/67_4.png | Bin 699 -> 0 bytes build/darknet/x64/data/labels/67_5.png | Bin 789 -> 0 bytes build/darknet/x64/data/labels/67_6.png | Bin 876 -> 0 bytes build/darknet/x64/data/labels/67_7.png | Bin 958 -> 0 bytes build/darknet/x64/data/labels/68_0.png | Bin 329 -> 0 bytes build/darknet/x64/data/labels/68_1.png | Bin 398 -> 0 bytes build/darknet/x64/data/labels/68_2.png | Bin 457 -> 0 bytes build/darknet/x64/data/labels/68_3.png | Bin 521 -> 0 bytes build/darknet/x64/data/labels/68_4.png | Bin 594 -> 0 bytes build/darknet/x64/data/labels/68_5.png | Bin 649 -> 0 bytes build/darknet/x64/data/labels/68_6.png | Bin 702 -> 0 bytes build/darknet/x64/data/labels/68_7.png | Bin 773 -> 0 bytes build/darknet/x64/data/labels/69_0.png | Bin 310 -> 0 bytes build/darknet/x64/data/labels/69_1.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/69_2.png | Bin 325 -> 0 bytes build/darknet/x64/data/labels/69_3.png | Bin 327 -> 0 bytes build/darknet/x64/data/labels/69_4.png | Bin 331 -> 0 bytes build/darknet/x64/data/labels/69_5.png | Bin 341 -> 0 bytes build/darknet/x64/data/labels/69_6.png | Bin 346 -> 0 bytes build/darknet/x64/data/labels/69_7.png | Bin 357 -> 0 bytes build/darknet/x64/data/labels/70_0.png | Bin 300 -> 0 bytes build/darknet/x64/data/labels/70_1.png | Bin 311 -> 0 bytes build/darknet/x64/data/labels/70_2.png | Bin 310 -> 0 bytes build/darknet/x64/data/labels/70_3.png | Bin 317 -> 0 bytes build/darknet/x64/data/labels/70_4.png | Bin 329 -> 0 bytes build/darknet/x64/data/labels/70_5.png | Bin 328 -> 0 bytes build/darknet/x64/data/labels/70_6.png | Bin 337 -> 0 bytes build/darknet/x64/data/labels/70_7.png | Bin 335 -> 0 bytes build/darknet/x64/data/labels/71_0.png | Bin 345 -> 0 bytes build/darknet/x64/data/labels/71_1.png | Bin 448 -> 0 bytes build/darknet/x64/data/labels/71_2.png | Bin 556 -> 0 bytes build/darknet/x64/data/labels/71_3.png | Bin 678 -> 0 bytes build/darknet/x64/data/labels/71_4.png | Bin 767 -> 0 bytes build/darknet/x64/data/labels/71_5.png | Bin 872 -> 0 bytes build/darknet/x64/data/labels/71_6.png | Bin 954 -> 0 bytes build/darknet/x64/data/labels/71_7.png | Bin 1067 -> 0 bytes build/darknet/x64/data/labels/72_0.png | Bin 306 -> 0 bytes build/darknet/x64/data/labels/72_1.png | Bin 310 -> 0 bytes build/darknet/x64/data/labels/72_2.png | Bin 314 -> 0 bytes build/darknet/x64/data/labels/72_3.png | Bin 320 -> 0 bytes build/darknet/x64/data/labels/72_4.png | Bin 338 -> 0 bytes build/darknet/x64/data/labels/72_5.png | Bin 348 -> 0 bytes build/darknet/x64/data/labels/72_6.png | Bin 355 -> 0 bytes build/darknet/x64/data/labels/72_7.png | Bin 360 -> 0 bytes build/darknet/x64/data/labels/73_0.png | Bin 288 -> 0 bytes build/darknet/x64/data/labels/73_1.png | Bin 290 -> 0 bytes build/darknet/x64/data/labels/73_2.png | Bin 293 -> 0 bytes build/darknet/x64/data/labels/73_3.png | Bin 295 -> 0 bytes build/darknet/x64/data/labels/73_4.png | Bin 302 -> 0 bytes build/darknet/x64/data/labels/73_5.png | Bin 304 -> 0 bytes build/darknet/x64/data/labels/73_6.png | Bin 306 -> 0 bytes build/darknet/x64/data/labels/73_7.png | Bin 310 -> 0 bytes build/darknet/x64/data/labels/74_0.png | Bin 301 -> 0 bytes build/darknet/x64/data/labels/74_1.png | Bin 324 -> 0 bytes build/darknet/x64/data/labels/74_2.png | Bin 344 -> 0 bytes build/darknet/x64/data/labels/74_3.png | Bin 370 -> 0 bytes build/darknet/x64/data/labels/74_4.png | Bin 392 -> 0 bytes build/darknet/x64/data/labels/74_5.png | Bin 418 -> 0 bytes build/darknet/x64/data/labels/74_6.png | Bin 445 -> 0 bytes build/darknet/x64/data/labels/74_7.png | Bin 481 -> 0 bytes build/darknet/x64/data/labels/75_0.png | Bin 324 -> 0 bytes build/darknet/x64/data/labels/75_1.png | Bin 393 -> 0 bytes build/darknet/x64/data/labels/75_2.png | Bin 454 -> 0 bytes build/darknet/x64/data/labels/75_3.png | Bin 524 -> 0 bytes build/darknet/x64/data/labels/75_4.png | Bin 596 -> 0 bytes build/darknet/x64/data/labels/75_5.png | Bin 647 -> 0 bytes build/darknet/x64/data/labels/75_6.png | Bin 698 -> 0 bytes build/darknet/x64/data/labels/75_7.png | Bin 760 -> 0 bytes build/darknet/x64/data/labels/76_0.png | Bin 298 -> 0 bytes build/darknet/x64/data/labels/76_1.png | Bin 302 -> 0 bytes build/darknet/x64/data/labels/76_2.png | Bin 307 -> 0 bytes build/darknet/x64/data/labels/76_3.png | Bin 309 -> 0 bytes build/darknet/x64/data/labels/76_4.png | Bin 318 -> 0 bytes build/darknet/x64/data/labels/76_5.png | Bin 316 -> 0 bytes build/darknet/x64/data/labels/76_6.png | Bin 322 -> 0 bytes build/darknet/x64/data/labels/76_7.png | Bin 336 -> 0 bytes build/darknet/x64/data/labels/77_0.png | Bin 373 -> 0 bytes build/darknet/x64/data/labels/77_1.png | Bin 518 -> 0 bytes build/darknet/x64/data/labels/77_2.png | Bin 674 -> 0 bytes build/darknet/x64/data/labels/77_3.png | Bin 820 -> 0 bytes build/darknet/x64/data/labels/77_4.png | Bin 961 -> 0 bytes build/darknet/x64/data/labels/77_5.png | Bin 1098 -> 0 bytes build/darknet/x64/data/labels/77_6.png | Bin 1272 -> 0 bytes build/darknet/x64/data/labels/77_7.png | Bin 1416 -> 0 bytes build/darknet/x64/data/labels/78_0.png | Bin 329 -> 0 bytes build/darknet/x64/data/labels/78_1.png | Bin 397 -> 0 bytes build/darknet/x64/data/labels/78_2.png | Bin 449 -> 0 bytes build/darknet/x64/data/labels/78_3.png | Bin 512 -> 0 bytes build/darknet/x64/data/labels/78_4.png | Bin 559 -> 0 bytes build/darknet/x64/data/labels/78_5.png | Bin 600 -> 0 bytes build/darknet/x64/data/labels/78_6.png | Bin 646 -> 0 bytes build/darknet/x64/data/labels/78_7.png | Bin 691 -> 0 bytes build/darknet/x64/data/labels/79_0.png | Bin 353 -> 0 bytes build/darknet/x64/data/labels/79_1.png | Bin 457 -> 0 bytes build/darknet/x64/data/labels/79_2.png | Bin 586 -> 0 bytes build/darknet/x64/data/labels/79_3.png | Bin 717 -> 0 bytes build/darknet/x64/data/labels/79_4.png | Bin 836 -> 0 bytes build/darknet/x64/data/labels/79_5.png | Bin 950 -> 0 bytes build/darknet/x64/data/labels/79_6.png | Bin 1057 -> 0 bytes build/darknet/x64/data/labels/79_7.png | Bin 1167 -> 0 bytes build/darknet/x64/data/labels/80_0.png | Bin 314 -> 0 bytes build/darknet/x64/data/labels/80_1.png | Bin 349 -> 0 bytes build/darknet/x64/data/labels/80_2.png | Bin 382 -> 0 bytes build/darknet/x64/data/labels/80_3.png | Bin 421 -> 0 bytes build/darknet/x64/data/labels/80_4.png | Bin 458 -> 0 bytes build/darknet/x64/data/labels/80_5.png | Bin 484 -> 0 bytes build/darknet/x64/data/labels/80_6.png | Bin 528 -> 0 bytes build/darknet/x64/data/labels/80_7.png | Bin 556 -> 0 bytes build/darknet/x64/data/labels/81_0.png | Bin 360 -> 0 bytes build/darknet/x64/data/labels/81_1.png | Bin 484 -> 0 bytes build/darknet/x64/data/labels/81_2.png | Bin 614 -> 0 bytes build/darknet/x64/data/labels/81_3.png | Bin 756 -> 0 bytes build/darknet/x64/data/labels/81_4.png | Bin 899 -> 0 bytes build/darknet/x64/data/labels/81_5.png | Bin 1011 -> 0 bytes build/darknet/x64/data/labels/81_6.png | Bin 1123 -> 0 bytes build/darknet/x64/data/labels/81_7.png | Bin 1271 -> 0 bytes build/darknet/x64/data/labels/82_0.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/82_1.png | Bin 391 -> 0 bytes build/darknet/x64/data/labels/82_2.png | Bin 450 -> 0 bytes build/darknet/x64/data/labels/82_3.png | Bin 508 -> 0 bytes build/darknet/x64/data/labels/82_4.png | Bin 560 -> 0 bytes build/darknet/x64/data/labels/82_5.png | Bin 657 -> 0 bytes build/darknet/x64/data/labels/82_6.png | Bin 698 -> 0 bytes build/darknet/x64/data/labels/82_7.png | Bin 739 -> 0 bytes build/darknet/x64/data/labels/83_0.png | Bin 336 -> 0 bytes build/darknet/x64/data/labels/83_1.png | Bin 426 -> 0 bytes build/darknet/x64/data/labels/83_2.png | Bin 505 -> 0 bytes build/darknet/x64/data/labels/83_3.png | Bin 607 -> 0 bytes build/darknet/x64/data/labels/83_4.png | Bin 688 -> 0 bytes build/darknet/x64/data/labels/83_5.png | Bin 795 -> 0 bytes build/darknet/x64/data/labels/83_6.png | Bin 872 -> 0 bytes build/darknet/x64/data/labels/83_7.png | Bin 963 -> 0 bytes build/darknet/x64/data/labels/84_0.png | Bin 307 -> 0 bytes build/darknet/x64/data/labels/84_1.png | Bin 312 -> 0 bytes build/darknet/x64/data/labels/84_2.png | Bin 317 -> 0 bytes build/darknet/x64/data/labels/84_3.png | Bin 319 -> 0 bytes build/darknet/x64/data/labels/84_4.png | Bin 319 -> 0 bytes build/darknet/x64/data/labels/84_5.png | Bin 331 -> 0 bytes build/darknet/x64/data/labels/84_6.png | Bin 330 -> 0 bytes build/darknet/x64/data/labels/84_7.png | Bin 345 -> 0 bytes build/darknet/x64/data/labels/85_0.png | Bin 324 -> 0 bytes build/darknet/x64/data/labels/85_1.png | Bin 369 -> 0 bytes build/darknet/x64/data/labels/85_2.png | Bin 420 -> 0 bytes build/darknet/x64/data/labels/85_3.png | Bin 475 -> 0 bytes build/darknet/x64/data/labels/85_4.png | Bin 519 -> 0 bytes build/darknet/x64/data/labels/85_5.png | Bin 571 -> 0 bytes build/darknet/x64/data/labels/85_6.png | Bin 629 -> 0 bytes build/darknet/x64/data/labels/85_7.png | Bin 676 -> 0 bytes build/darknet/x64/data/labels/86_0.png | Bin 344 -> 0 bytes build/darknet/x64/data/labels/86_1.png | Bin 434 -> 0 bytes build/darknet/x64/data/labels/86_2.png | Bin 529 -> 0 bytes build/darknet/x64/data/labels/86_3.png | Bin 613 -> 0 bytes build/darknet/x64/data/labels/86_4.png | Bin 708 -> 0 bytes build/darknet/x64/data/labels/86_5.png | Bin 784 -> 0 bytes build/darknet/x64/data/labels/86_6.png | Bin 880 -> 0 bytes build/darknet/x64/data/labels/86_7.png | Bin 958 -> 0 bytes build/darknet/x64/data/labels/87_0.png | Bin 376 -> 0 bytes build/darknet/x64/data/labels/87_1.png | Bin 521 -> 0 bytes build/darknet/x64/data/labels/87_2.png | Bin 693 -> 0 bytes build/darknet/x64/data/labels/87_3.png | Bin 833 -> 0 bytes build/darknet/x64/data/labels/87_4.png | Bin 989 -> 0 bytes build/darknet/x64/data/labels/87_5.png | Bin 1122 -> 0 bytes build/darknet/x64/data/labels/87_6.png | Bin 1289 -> 0 bytes build/darknet/x64/data/labels/87_7.png | Bin 1451 -> 0 bytes build/darknet/x64/data/labels/88_0.png | Bin 338 -> 0 bytes build/darknet/x64/data/labels/88_1.png | Bin 443 -> 0 bytes build/darknet/x64/data/labels/88_2.png | Bin 540 -> 0 bytes build/darknet/x64/data/labels/88_3.png | Bin 638 -> 0 bytes build/darknet/x64/data/labels/88_4.png | Bin 742 -> 0 bytes build/darknet/x64/data/labels/88_5.png | Bin 844 -> 0 bytes build/darknet/x64/data/labels/88_6.png | Bin 933 -> 0 bytes build/darknet/x64/data/labels/88_7.png | Bin 1013 -> 0 bytes build/darknet/x64/data/labels/89_0.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/89_1.png | Bin 387 -> 0 bytes build/darknet/x64/data/labels/89_2.png | Bin 447 -> 0 bytes build/darknet/x64/data/labels/89_3.png | Bin 502 -> 0 bytes build/darknet/x64/data/labels/89_4.png | Bin 569 -> 0 bytes build/darknet/x64/data/labels/89_5.png | Bin 620 -> 0 bytes build/darknet/x64/data/labels/89_6.png | Bin 679 -> 0 bytes build/darknet/x64/data/labels/89_7.png | Bin 743 -> 0 bytes build/darknet/x64/data/labels/90_0.png | Bin 334 -> 0 bytes build/darknet/x64/data/labels/90_1.png | Bin 387 -> 0 bytes build/darknet/x64/data/labels/90_2.png | Bin 436 -> 0 bytes build/darknet/x64/data/labels/90_3.png | Bin 500 -> 0 bytes build/darknet/x64/data/labels/90_4.png | Bin 549 -> 0 bytes build/darknet/x64/data/labels/90_5.png | Bin 595 -> 0 bytes build/darknet/x64/data/labels/90_6.png | Bin 644 -> 0 bytes build/darknet/x64/data/labels/90_7.png | Bin 697 -> 0 bytes build/darknet/x64/data/labels/91_0.png | Bin 292 -> 0 bytes build/darknet/x64/data/labels/91_1.png | Bin 301 -> 0 bytes build/darknet/x64/data/labels/91_2.png | Bin 305 -> 0 bytes build/darknet/x64/data/labels/91_3.png | Bin 312 -> 0 bytes build/darknet/x64/data/labels/91_4.png | Bin 316 -> 0 bytes build/darknet/x64/data/labels/91_5.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/91_6.png | Bin 327 -> 0 bytes build/darknet/x64/data/labels/91_7.png | Bin 331 -> 0 bytes build/darknet/x64/data/labels/92_0.png | Bin 319 -> 0 bytes build/darknet/x64/data/labels/92_1.png | Bin 375 -> 0 bytes build/darknet/x64/data/labels/92_2.png | Bin 438 -> 0 bytes build/darknet/x64/data/labels/92_3.png | Bin 509 -> 0 bytes build/darknet/x64/data/labels/92_4.png | Bin 567 -> 0 bytes build/darknet/x64/data/labels/92_5.png | Bin 612 -> 0 bytes build/darknet/x64/data/labels/92_6.png | Bin 653 -> 0 bytes build/darknet/x64/data/labels/92_7.png | Bin 741 -> 0 bytes build/darknet/x64/data/labels/93_0.png | Bin 292 -> 0 bytes build/darknet/x64/data/labels/93_1.png | Bin 308 -> 0 bytes build/darknet/x64/data/labels/93_2.png | Bin 308 -> 0 bytes build/darknet/x64/data/labels/93_3.png | Bin 315 -> 0 bytes build/darknet/x64/data/labels/93_4.png | Bin 317 -> 0 bytes build/darknet/x64/data/labels/93_5.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/93_6.png | Bin 324 -> 0 bytes build/darknet/x64/data/labels/93_7.png | Bin 330 -> 0 bytes build/darknet/x64/data/labels/94_0.png | Bin 307 -> 0 bytes build/darknet/x64/data/labels/94_1.png | Bin 345 -> 0 bytes build/darknet/x64/data/labels/94_2.png | Bin 390 -> 0 bytes build/darknet/x64/data/labels/94_3.png | Bin 429 -> 0 bytes build/darknet/x64/data/labels/94_4.png | Bin 493 -> 0 bytes build/darknet/x64/data/labels/94_5.png | Bin 510 -> 0 bytes build/darknet/x64/data/labels/94_6.png | Bin 574 -> 0 bytes build/darknet/x64/data/labels/94_7.png | Bin 594 -> 0 bytes build/darknet/x64/data/labels/95_0.png | Bin 288 -> 0 bytes build/darknet/x64/data/labels/95_1.png | Bin 295 -> 0 bytes build/darknet/x64/data/labels/95_2.png | Bin 300 -> 0 bytes build/darknet/x64/data/labels/95_3.png | Bin 305 -> 0 bytes build/darknet/x64/data/labels/95_4.png | Bin 309 -> 0 bytes build/darknet/x64/data/labels/95_5.png | Bin 314 -> 0 bytes build/darknet/x64/data/labels/95_6.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/95_7.png | Bin 321 -> 0 bytes build/darknet/x64/data/labels/96_0.png | Bin 300 -> 0 bytes build/darknet/x64/data/labels/96_1.png | Bin 319 -> 0 bytes build/darknet/x64/data/labels/96_2.png | Bin 340 -> 0 bytes build/darknet/x64/data/labels/96_3.png | Bin 368 -> 0 bytes build/darknet/x64/data/labels/96_4.png | Bin 388 -> 0 bytes build/darknet/x64/data/labels/96_5.png | Bin 418 -> 0 bytes build/darknet/x64/data/labels/96_6.png | Bin 444 -> 0 bytes build/darknet/x64/data/labels/96_7.png | Bin 470 -> 0 bytes build/darknet/x64/data/labels/97_0.png | Bin 317 -> 0 bytes build/darknet/x64/data/labels/97_1.png | Bin 374 -> 0 bytes build/darknet/x64/data/labels/97_2.png | Bin 448 -> 0 bytes build/darknet/x64/data/labels/97_3.png | Bin 490 -> 0 bytes build/darknet/x64/data/labels/97_4.png | Bin 562 -> 0 bytes build/darknet/x64/data/labels/97_5.png | Bin 637 -> 0 bytes build/darknet/x64/data/labels/97_6.png | Bin 697 -> 0 bytes build/darknet/x64/data/labels/97_7.png | Bin 752 -> 0 bytes build/darknet/x64/data/labels/98_0.png | Bin 319 -> 0 bytes build/darknet/x64/data/labels/98_1.png | Bin 377 -> 0 bytes build/darknet/x64/data/labels/98_2.png | Bin 454 -> 0 bytes build/darknet/x64/data/labels/98_3.png | Bin 509 -> 0 bytes build/darknet/x64/data/labels/98_4.png | Bin 568 -> 0 bytes build/darknet/x64/data/labels/98_5.png | Bin 635 -> 0 bytes build/darknet/x64/data/labels/98_6.png | Bin 700 -> 0 bytes build/darknet/x64/data/labels/98_7.png | Bin 754 -> 0 bytes build/darknet/x64/data/labels/99_0.png | Bin 313 -> 0 bytes build/darknet/x64/data/labels/99_1.png | Bin 367 -> 0 bytes build/darknet/x64/data/labels/99_2.png | Bin 423 -> 0 bytes build/darknet/x64/data/labels/99_3.png | Bin 464 -> 0 bytes build/darknet/x64/data/labels/99_4.png | Bin 521 -> 0 bytes build/darknet/x64/data/labels/99_5.png | Bin 576 -> 0 bytes build/darknet/x64/data/labels/99_6.png | Bin 629 -> 0 bytes build/darknet/x64/data/labels/99_7.png | Bin 692 -> 0 bytes build/darknet/x64/data/labels/make_labels.py | 23 - build/darknet/x64/data/openimages.data | 8 - build/darknet/x64/data/openimages.names | 601 - build/darknet/x64/data/person.jpg | Bin 113880 -> 0 bytes build/darknet/x64/data/scream.jpg | Bin 174515 -> 0 bytes build/darknet/x64/data/voc.data | 7 - build/darknet/x64/data/voc.names | 20 - build/darknet/x64/data/voc/voc_label.py | 56 - build/darknet/x64/densenet201_yolo.cfg | 1978 -- build/darknet/x64/dog.jpg | Bin 163759 -> 0 bytes build/darknet/x64/dogr.jpg | Bin 86810 -> 0 bytes build/darknet/x64/gen_anchors.py | 165 - build/darknet/x64/pthreadGC2.dll | Bin 185976 -> 0 bytes build/darknet/x64/pthreadVC2.dll | Bin 82944 -> 0 bytes build/darknet/x64/resnet152_yolo.cfg | 1473 -- build/darknet/x64/resnet50_yolo.cfg | 520 - build/darknet/x64/results/tmp.txt | 0 build/darknet/x64/reval_voc_py3.py | 104 - build/darknet/x64/tiny-yolo-voc.cfg | 134 - build/darknet/x64/tiny-yolo.cfg | 134 - build/darknet/x64/voc_eval_py3.py | 201 - build/darknet/x64/yolo-voc.2.0.cfg | 244 - build/darknet/x64/yolo-voc.cfg | 259 - build/darknet/x64/yolo.2.0.cfg | 244 - build/darknet/x64/yolo.cfg | 259 - build/darknet/x64/yolo9000.cfg | 218 - build/darknet/x64/yolov3-voc.cfg | 785 - build/darknet/x64/yolov3.cfg | 791 - build/darknet/yolo_console_dll.sln | 28 - build/darknet/yolo_console_dll.vcxproj | 142 - build/darknet/yolo_cpp_dll.sln | 28 - build/darknet/yolo_cpp_dll.vcxproj | 311 - build/darknet/yolo_cpp_dll_no_gpu.sln | 28 - build/darknet/yolo_cpp_dll_no_gpu.vcxproj | 295 - .../x64 => scripts/windows}/calc_anchors.cmd | 0 .../x64 => scripts/windows}/calc_mAP.cmd | 0 .../x64 => scripts/windows}/calc_mAP_coco.cmd | 0 .../windows}/calc_mAP_voc_py.cmd | 0 .../windows}/classifier_densenet201.cmd | 0 .../windows}/classifier_resnet50.cmd | 0 .../x64 => scripts/windows}/darknet_coco.cmd | 0 .../windows}/darknet_coco_9000.cmd | 0 .../windows}/darknet_coco_9000_demo.cmd | 0 .../windows}/darknet_demo_coco.cmd | 0 .../windows}/darknet_demo_json_stream.cmd | 0 .../windows}/darknet_demo_mjpeg_stream.cmd | 0 .../windows}/darknet_demo_store.cmd | 0 .../windows}/darknet_demo_voc.cmd | 0 .../windows}/darknet_demo_voc_param.cmd | 0 .../windows}/darknet_demo_voc_tiny.cmd | 0 .../windows}/darknet_json_reslut.cmd | 0 .../windows}/darknet_many_images.cmd | 0 .../windows}/darknet_net_cam_coco.cmd | 0 .../windows}/darknet_net_cam_voc.cmd | 0 .../windows}/darknet_python.cmd | 0 .../windows}/darknet_tiny_v2.cmd | 0 .../x64 => scripts/windows}/darknet_video.cmd | 0 .../x64 => scripts/windows}/darknet_voc.cmd | 0 .../windows}/darknet_voc_tiny_v2.cmd | 0 .../windows}/darknet_web_cam_voc.cmd | 0 .../windows}/darknet_yolo_v3.cmd | 0 .../windows}/darknet_yolo_v3_openimages.cmd | 0 .../windows}/darknet_yolo_v3_video.cmd | 0 .../darknet_yolov3_pseudo_labeling.cmd | 0 .../x64 => scripts/windows}/partial.cmd | 0 .../x64 => scripts/windows}/rnn_lstm.cmd | 0 .../x64 => scripts/windows}/rnn_tolstoy.cmd | 0 .../x64 => scripts/windows}/train_voc.cmd | 0 src/.editorconfig | 8 - {build/darknet => src}/YoloWrapper.cs | 0 934 files changed, 1 insertion(+), 125451 deletions(-) delete mode 100644 build/darknet/darknet.sln delete mode 100644 build/darknet/darknet.vcxproj delete mode 100644 build/darknet/darknet_no_gpu.sln delete mode 100644 build/darknet/darknet_no_gpu.vcxproj delete mode 100644 build/darknet/x64/backup/tmp.txt delete mode 100644 build/darknet/x64/cfg/Gaussian_yolov3_BDD.cfg delete mode 100644 build/darknet/x64/cfg/alexnet.cfg delete mode 100644 build/darknet/x64/cfg/cd53paspp-gamma.cfg delete mode 100644 build/darknet/x64/cfg/cifar.cfg delete mode 100644 build/darknet/x64/cfg/cifar.test.cfg delete mode 100644 build/darknet/x64/cfg/coco.data delete mode 100644 build/darknet/x64/cfg/combine9k.data delete mode 100644 build/darknet/x64/cfg/crnn.train.cfg delete mode 100644 build/darknet/x64/cfg/csdarknet53-omega.cfg delete mode 100644 build/darknet/x64/cfg/cspx-p7-mish-omega.cfg delete mode 100644 build/darknet/x64/cfg/cspx-p7-mish.cfg delete mode 100644 build/darknet/x64/cfg/cspx-p7-mish_hp.cfg delete mode 100644 build/darknet/x64/cfg/csresnext50-panet-spp-original-optimal.cfg delete mode 100644 build/darknet/x64/cfg/csresnext50-panet-spp.cfg delete mode 100644 build/darknet/x64/cfg/darknet.cfg delete mode 100644 build/darknet/x64/cfg/darknet19.cfg delete mode 100644 build/darknet/x64/cfg/darknet19_448.cfg delete mode 100644 build/darknet/x64/cfg/darknet53.cfg delete mode 100644 build/darknet/x64/cfg/darknet53_448_xnor.cfg delete mode 100644 build/darknet/x64/cfg/densenet201.cfg delete mode 100644 build/darknet/x64/cfg/efficientnet-lite3.cfg delete mode 100644 build/darknet/x64/cfg/efficientnet_b0.cfg delete mode 100644 build/darknet/x64/cfg/enet-coco.cfg delete mode 100644 build/darknet/x64/cfg/extraction.cfg delete mode 100644 build/darknet/x64/cfg/extraction.conv.cfg delete mode 100644 build/darknet/x64/cfg/extraction22k.cfg delete mode 100644 build/darknet/x64/cfg/go.test.cfg delete mode 100644 build/darknet/x64/cfg/gru.cfg delete mode 100644 build/darknet/x64/cfg/imagenet1k.data delete mode 100644 build/darknet/x64/cfg/imagenet22k.dataset delete mode 100644 build/darknet/x64/cfg/imagenet9k.hierarchy.dataset delete mode 100644 build/darknet/x64/cfg/jnet-conv.cfg delete mode 100644 build/darknet/x64/cfg/lstm.train.cfg delete mode 100644 build/darknet/x64/cfg/openimages.data delete mode 100644 build/darknet/x64/cfg/resnet101.cfg delete mode 100644 build/darknet/x64/cfg/resnet152.cfg delete mode 100644 build/darknet/x64/cfg/resnet152_trident.cfg delete mode 100644 build/darknet/x64/cfg/resnet50.cfg delete mode 100644 build/darknet/x64/cfg/resnext152-32x4d.cfg delete mode 100644 build/darknet/x64/cfg/rnn.cfg delete mode 100644 build/darknet/x64/cfg/rnn.train.cfg delete mode 100644 build/darknet/x64/cfg/strided.cfg delete mode 100644 build/darknet/x64/cfg/t1.test.cfg delete mode 100644 build/darknet/x64/cfg/tiny-yolo-voc.cfg delete mode 100644 build/darknet/x64/cfg/tiny-yolo.cfg delete mode 100644 build/darknet/x64/cfg/tiny-yolo_xnor.cfg delete mode 100644 build/darknet/x64/cfg/tiny.cfg delete mode 100644 build/darknet/x64/cfg/vgg-16.cfg delete mode 100644 build/darknet/x64/cfg/vgg-conv.cfg delete mode 100644 build/darknet/x64/cfg/voc.data delete mode 100644 build/darknet/x64/cfg/writing.cfg delete mode 100644 build/darknet/x64/cfg/yolo-voc.2.0.cfg delete mode 100644 build/darknet/x64/cfg/yolo-voc.cfg delete mode 100644 build/darknet/x64/cfg/yolo.2.0.cfg delete mode 100644 build/darknet/x64/cfg/yolo.cfg delete mode 100644 build/darknet/x64/cfg/yolo9000.cfg delete mode 100644 build/darknet/x64/cfg/yolov2-tiny-voc.cfg delete mode 100644 build/darknet/x64/cfg/yolov2-tiny.cfg delete mode 100644 build/darknet/x64/cfg/yolov2-voc.cfg delete mode 100644 build/darknet/x64/cfg/yolov2.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-openimages.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-spp.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-tiny-prn.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-tiny.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-tiny_3l.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-tiny_obj.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-tiny_occlusion_track.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-tiny_xnor.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-voc.cfg delete mode 100644 build/darknet/x64/cfg/yolov3-voc.yolov3-giou-40.cfg delete mode 100644 build/darknet/x64/cfg/yolov3.cfg delete mode 100644 build/darknet/x64/cfg/yolov3.coco-giou-12.cfg delete mode 100644 build/darknet/x64/cfg/yolov3_5l.cfg delete mode 100644 build/darknet/x64/cfg/yolov4-csp.cfg delete mode 100644 build/darknet/x64/cfg/yolov4-custom.cfg delete mode 100644 build/darknet/x64/cfg/yolov4-tiny-3l.cfg delete mode 100644 build/darknet/x64/cfg/yolov4-tiny-custom.cfg delete mode 100644 build/darknet/x64/cfg/yolov4-tiny.cfg delete mode 100644 build/darknet/x64/cfg/yolov4-tiny_contrastive.cfg delete mode 100644 build/darknet/x64/cfg/yolov4.cfg delete mode 100644 build/darknet/x64/cfg/yolov4x-mish.cfg delete mode 100644 build/darknet/x64/darknet.py delete mode 100644 build/darknet/x64/darknet_video.py delete mode 100644 build/darknet/x64/data/9k.labels delete mode 100644 build/darknet/x64/data/9k.names delete mode 100644 build/darknet/x64/data/9k.tree delete mode 100644 build/darknet/x64/data/coco.data delete mode 100644 build/darknet/x64/data/coco.names delete mode 100644 build/darknet/x64/data/coco9k.map delete mode 100644 build/darknet/x64/data/combine9k.data delete mode 100644 build/darknet/x64/data/dog.jpg delete mode 100644 build/darknet/x64/data/eagle.jpg delete mode 100644 build/darknet/x64/data/giraffe.jpg delete mode 100644 build/darknet/x64/data/goal.txt delete mode 100644 build/darknet/x64/data/horses.jpg delete mode 100644 build/darknet/x64/data/imagenet.labels.list delete mode 100644 build/darknet/x64/data/imagenet.shortnames.list delete mode 100644 build/darknet/x64/data/inet9k.map delete mode 100644 build/darknet/x64/data/labels/100_0.png delete mode 100644 build/darknet/x64/data/labels/100_1.png delete mode 100644 build/darknet/x64/data/labels/100_2.png delete mode 100644 build/darknet/x64/data/labels/100_3.png delete mode 100644 build/darknet/x64/data/labels/100_4.png delete mode 100644 build/darknet/x64/data/labels/100_5.png delete mode 100644 build/darknet/x64/data/labels/100_6.png delete mode 100644 build/darknet/x64/data/labels/100_7.png delete mode 100644 build/darknet/x64/data/labels/101_0.png delete mode 100644 build/darknet/x64/data/labels/101_1.png delete mode 100644 build/darknet/x64/data/labels/101_2.png delete mode 100644 build/darknet/x64/data/labels/101_3.png delete mode 100644 build/darknet/x64/data/labels/101_4.png delete mode 100644 build/darknet/x64/data/labels/101_5.png delete mode 100644 build/darknet/x64/data/labels/101_6.png delete mode 100644 build/darknet/x64/data/labels/101_7.png delete mode 100644 build/darknet/x64/data/labels/102_0.png delete mode 100644 build/darknet/x64/data/labels/102_1.png delete mode 100644 build/darknet/x64/data/labels/102_2.png delete mode 100644 build/darknet/x64/data/labels/102_3.png delete mode 100644 build/darknet/x64/data/labels/102_4.png delete mode 100644 build/darknet/x64/data/labels/102_5.png delete mode 100644 build/darknet/x64/data/labels/102_6.png delete mode 100644 build/darknet/x64/data/labels/102_7.png delete mode 100644 build/darknet/x64/data/labels/103_0.png delete mode 100644 build/darknet/x64/data/labels/103_1.png delete mode 100644 build/darknet/x64/data/labels/103_2.png delete mode 100644 build/darknet/x64/data/labels/103_3.png delete mode 100644 build/darknet/x64/data/labels/103_4.png delete mode 100644 build/darknet/x64/data/labels/103_5.png delete mode 100644 build/darknet/x64/data/labels/103_6.png delete mode 100644 build/darknet/x64/data/labels/103_7.png delete mode 100644 build/darknet/x64/data/labels/104_0.png delete mode 100644 build/darknet/x64/data/labels/104_1.png delete mode 100644 build/darknet/x64/data/labels/104_2.png delete mode 100644 build/darknet/x64/data/labels/104_3.png delete mode 100644 build/darknet/x64/data/labels/104_4.png delete mode 100644 build/darknet/x64/data/labels/104_5.png delete mode 100644 build/darknet/x64/data/labels/104_6.png delete mode 100644 build/darknet/x64/data/labels/104_7.png delete mode 100644 build/darknet/x64/data/labels/105_0.png delete mode 100644 build/darknet/x64/data/labels/105_1.png delete mode 100644 build/darknet/x64/data/labels/105_2.png delete mode 100644 build/darknet/x64/data/labels/105_3.png delete mode 100644 build/darknet/x64/data/labels/105_4.png delete mode 100644 build/darknet/x64/data/labels/105_5.png delete mode 100644 build/darknet/x64/data/labels/105_6.png delete mode 100644 build/darknet/x64/data/labels/105_7.png delete mode 100644 build/darknet/x64/data/labels/106_0.png delete mode 100644 build/darknet/x64/data/labels/106_1.png delete mode 100644 build/darknet/x64/data/labels/106_2.png delete mode 100644 build/darknet/x64/data/labels/106_3.png delete mode 100644 build/darknet/x64/data/labels/106_4.png delete mode 100644 build/darknet/x64/data/labels/106_5.png delete mode 100644 build/darknet/x64/data/labels/106_6.png delete mode 100644 build/darknet/x64/data/labels/106_7.png delete mode 100644 build/darknet/x64/data/labels/107_0.png delete mode 100644 build/darknet/x64/data/labels/107_1.png delete mode 100644 build/darknet/x64/data/labels/107_2.png delete mode 100644 build/darknet/x64/data/labels/107_3.png delete mode 100644 build/darknet/x64/data/labels/107_4.png delete mode 100644 build/darknet/x64/data/labels/107_5.png delete mode 100644 build/darknet/x64/data/labels/107_6.png delete mode 100644 build/darknet/x64/data/labels/107_7.png delete mode 100644 build/darknet/x64/data/labels/108_0.png delete mode 100644 build/darknet/x64/data/labels/108_1.png delete mode 100644 build/darknet/x64/data/labels/108_2.png delete mode 100644 build/darknet/x64/data/labels/108_3.png delete mode 100644 build/darknet/x64/data/labels/108_4.png delete mode 100644 build/darknet/x64/data/labels/108_5.png delete mode 100644 build/darknet/x64/data/labels/108_6.png delete mode 100644 build/darknet/x64/data/labels/108_7.png delete mode 100644 build/darknet/x64/data/labels/109_0.png delete mode 100644 build/darknet/x64/data/labels/109_1.png delete mode 100644 build/darknet/x64/data/labels/109_2.png delete mode 100644 build/darknet/x64/data/labels/109_3.png delete mode 100644 build/darknet/x64/data/labels/109_4.png delete mode 100644 build/darknet/x64/data/labels/109_5.png delete mode 100644 build/darknet/x64/data/labels/109_6.png delete mode 100644 build/darknet/x64/data/labels/109_7.png delete mode 100644 build/darknet/x64/data/labels/110_0.png delete mode 100644 build/darknet/x64/data/labels/110_1.png delete mode 100644 build/darknet/x64/data/labels/110_2.png delete mode 100644 build/darknet/x64/data/labels/110_3.png delete mode 100644 build/darknet/x64/data/labels/110_4.png delete mode 100644 build/darknet/x64/data/labels/110_5.png delete mode 100644 build/darknet/x64/data/labels/110_6.png delete mode 100644 build/darknet/x64/data/labels/110_7.png delete mode 100644 build/darknet/x64/data/labels/111_0.png delete mode 100644 build/darknet/x64/data/labels/111_1.png delete mode 100644 build/darknet/x64/data/labels/111_2.png delete mode 100644 build/darknet/x64/data/labels/111_3.png delete mode 100644 build/darknet/x64/data/labels/111_4.png delete mode 100644 build/darknet/x64/data/labels/111_5.png delete mode 100644 build/darknet/x64/data/labels/111_6.png delete mode 100644 build/darknet/x64/data/labels/111_7.png delete mode 100644 build/darknet/x64/data/labels/112_0.png delete mode 100644 build/darknet/x64/data/labels/112_1.png delete mode 100644 build/darknet/x64/data/labels/112_2.png delete mode 100644 build/darknet/x64/data/labels/112_3.png delete mode 100644 build/darknet/x64/data/labels/112_4.png delete mode 100644 build/darknet/x64/data/labels/112_5.png delete mode 100644 build/darknet/x64/data/labels/112_6.png delete mode 100644 build/darknet/x64/data/labels/112_7.png delete mode 100644 build/darknet/x64/data/labels/113_0.png delete mode 100644 build/darknet/x64/data/labels/113_1.png delete mode 100644 build/darknet/x64/data/labels/113_2.png delete mode 100644 build/darknet/x64/data/labels/113_3.png delete mode 100644 build/darknet/x64/data/labels/113_4.png delete mode 100644 build/darknet/x64/data/labels/113_5.png delete mode 100644 build/darknet/x64/data/labels/113_6.png delete mode 100644 build/darknet/x64/data/labels/113_7.png delete mode 100644 build/darknet/x64/data/labels/114_0.png delete mode 100644 build/darknet/x64/data/labels/114_1.png delete mode 100644 build/darknet/x64/data/labels/114_2.png delete mode 100644 build/darknet/x64/data/labels/114_3.png delete mode 100644 build/darknet/x64/data/labels/114_4.png delete mode 100644 build/darknet/x64/data/labels/114_5.png delete mode 100644 build/darknet/x64/data/labels/114_6.png delete mode 100644 build/darknet/x64/data/labels/114_7.png delete mode 100644 build/darknet/x64/data/labels/115_0.png delete mode 100644 build/darknet/x64/data/labels/115_1.png delete mode 100644 build/darknet/x64/data/labels/115_2.png delete mode 100644 build/darknet/x64/data/labels/115_3.png delete mode 100644 build/darknet/x64/data/labels/115_4.png delete mode 100644 build/darknet/x64/data/labels/115_5.png delete mode 100644 build/darknet/x64/data/labels/115_6.png delete mode 100644 build/darknet/x64/data/labels/115_7.png delete mode 100644 build/darknet/x64/data/labels/116_0.png delete mode 100644 build/darknet/x64/data/labels/116_1.png delete mode 100644 build/darknet/x64/data/labels/116_2.png delete mode 100644 build/darknet/x64/data/labels/116_3.png delete mode 100644 build/darknet/x64/data/labels/116_4.png delete mode 100644 build/darknet/x64/data/labels/116_5.png delete mode 100644 build/darknet/x64/data/labels/116_6.png delete mode 100644 build/darknet/x64/data/labels/116_7.png delete mode 100644 build/darknet/x64/data/labels/117_0.png delete mode 100644 build/darknet/x64/data/labels/117_1.png delete mode 100644 build/darknet/x64/data/labels/117_2.png delete mode 100644 build/darknet/x64/data/labels/117_3.png delete mode 100644 build/darknet/x64/data/labels/117_4.png delete mode 100644 build/darknet/x64/data/labels/117_5.png delete mode 100644 build/darknet/x64/data/labels/117_6.png delete mode 100644 build/darknet/x64/data/labels/117_7.png delete mode 100644 build/darknet/x64/data/labels/118_0.png delete mode 100644 build/darknet/x64/data/labels/118_1.png delete mode 100644 build/darknet/x64/data/labels/118_2.png delete mode 100644 build/darknet/x64/data/labels/118_3.png delete mode 100644 build/darknet/x64/data/labels/118_4.png delete mode 100644 build/darknet/x64/data/labels/118_5.png delete mode 100644 build/darknet/x64/data/labels/118_6.png delete mode 100644 build/darknet/x64/data/labels/118_7.png delete mode 100644 build/darknet/x64/data/labels/119_0.png delete mode 100644 build/darknet/x64/data/labels/119_1.png delete mode 100644 build/darknet/x64/data/labels/119_2.png delete mode 100644 build/darknet/x64/data/labels/119_3.png delete mode 100644 build/darknet/x64/data/labels/119_4.png delete mode 100644 build/darknet/x64/data/labels/119_5.png delete mode 100644 build/darknet/x64/data/labels/119_6.png delete mode 100644 build/darknet/x64/data/labels/119_7.png delete mode 100644 build/darknet/x64/data/labels/120_0.png delete mode 100644 build/darknet/x64/data/labels/120_1.png delete mode 100644 build/darknet/x64/data/labels/120_2.png delete mode 100644 build/darknet/x64/data/labels/120_3.png delete mode 100644 build/darknet/x64/data/labels/120_4.png delete mode 100644 build/darknet/x64/data/labels/120_5.png delete mode 100644 build/darknet/x64/data/labels/120_6.png delete mode 100644 build/darknet/x64/data/labels/120_7.png delete mode 100644 build/darknet/x64/data/labels/121_0.png delete mode 100644 build/darknet/x64/data/labels/121_1.png delete mode 100644 build/darknet/x64/data/labels/121_2.png delete mode 100644 build/darknet/x64/data/labels/121_3.png delete mode 100644 build/darknet/x64/data/labels/121_4.png delete mode 100644 build/darknet/x64/data/labels/121_5.png delete mode 100644 build/darknet/x64/data/labels/121_6.png delete mode 100644 build/darknet/x64/data/labels/121_7.png delete mode 100644 build/darknet/x64/data/labels/122_0.png delete mode 100644 build/darknet/x64/data/labels/122_1.png delete mode 100644 build/darknet/x64/data/labels/122_2.png delete mode 100644 build/darknet/x64/data/labels/122_3.png delete mode 100644 build/darknet/x64/data/labels/122_4.png delete mode 100644 build/darknet/x64/data/labels/122_5.png delete mode 100644 build/darknet/x64/data/labels/122_6.png delete mode 100644 build/darknet/x64/data/labels/122_7.png delete mode 100644 build/darknet/x64/data/labels/123_0.png delete mode 100644 build/darknet/x64/data/labels/123_1.png delete mode 100644 build/darknet/x64/data/labels/123_2.png delete mode 100644 build/darknet/x64/data/labels/123_3.png delete mode 100644 build/darknet/x64/data/labels/123_4.png delete mode 100644 build/darknet/x64/data/labels/123_5.png delete mode 100644 build/darknet/x64/data/labels/123_6.png delete mode 100644 build/darknet/x64/data/labels/123_7.png delete mode 100644 build/darknet/x64/data/labels/124_0.png delete mode 100644 build/darknet/x64/data/labels/124_1.png delete mode 100644 build/darknet/x64/data/labels/124_2.png delete mode 100644 build/darknet/x64/data/labels/124_3.png delete mode 100644 build/darknet/x64/data/labels/124_4.png delete mode 100644 build/darknet/x64/data/labels/124_5.png delete mode 100644 build/darknet/x64/data/labels/124_6.png delete mode 100644 build/darknet/x64/data/labels/124_7.png delete mode 100644 build/darknet/x64/data/labels/125_0.png delete mode 100644 build/darknet/x64/data/labels/125_1.png delete mode 100644 build/darknet/x64/data/labels/125_2.png delete mode 100644 build/darknet/x64/data/labels/125_3.png delete mode 100644 build/darknet/x64/data/labels/125_4.png delete mode 100644 build/darknet/x64/data/labels/125_5.png delete mode 100644 build/darknet/x64/data/labels/125_6.png delete mode 100644 build/darknet/x64/data/labels/125_7.png delete mode 100644 build/darknet/x64/data/labels/126_0.png delete mode 100644 build/darknet/x64/data/labels/126_1.png delete mode 100644 build/darknet/x64/data/labels/126_2.png delete mode 100644 build/darknet/x64/data/labels/126_3.png delete mode 100644 build/darknet/x64/data/labels/126_4.png delete mode 100644 build/darknet/x64/data/labels/126_5.png delete mode 100644 build/darknet/x64/data/labels/126_6.png delete mode 100644 build/darknet/x64/data/labels/126_7.png delete mode 100644 build/darknet/x64/data/labels/32_0.png delete mode 100644 build/darknet/x64/data/labels/32_1.png delete mode 100644 build/darknet/x64/data/labels/32_2.png delete mode 100644 build/darknet/x64/data/labels/32_3.png delete mode 100644 build/darknet/x64/data/labels/32_4.png delete mode 100644 build/darknet/x64/data/labels/32_5.png delete mode 100644 build/darknet/x64/data/labels/32_6.png delete mode 100644 build/darknet/x64/data/labels/32_7.png delete mode 100644 build/darknet/x64/data/labels/33_0.png delete mode 100644 build/darknet/x64/data/labels/33_1.png delete mode 100644 build/darknet/x64/data/labels/33_2.png delete mode 100644 build/darknet/x64/data/labels/33_3.png delete mode 100644 build/darknet/x64/data/labels/33_4.png delete mode 100644 build/darknet/x64/data/labels/33_5.png delete mode 100644 build/darknet/x64/data/labels/33_6.png delete mode 100644 build/darknet/x64/data/labels/33_7.png delete mode 100644 build/darknet/x64/data/labels/34_0.png delete mode 100644 build/darknet/x64/data/labels/34_1.png delete mode 100644 build/darknet/x64/data/labels/34_2.png delete mode 100644 build/darknet/x64/data/labels/34_3.png delete mode 100644 build/darknet/x64/data/labels/34_4.png delete mode 100644 build/darknet/x64/data/labels/34_5.png delete mode 100644 build/darknet/x64/data/labels/34_6.png delete mode 100644 build/darknet/x64/data/labels/34_7.png delete mode 100644 build/darknet/x64/data/labels/35_0.png delete mode 100644 build/darknet/x64/data/labels/35_1.png delete mode 100644 build/darknet/x64/data/labels/35_2.png delete mode 100644 build/darknet/x64/data/labels/35_3.png delete mode 100644 build/darknet/x64/data/labels/35_4.png delete mode 100644 build/darknet/x64/data/labels/35_5.png delete mode 100644 build/darknet/x64/data/labels/35_6.png delete mode 100644 build/darknet/x64/data/labels/35_7.png delete mode 100644 build/darknet/x64/data/labels/36_0.png delete mode 100644 build/darknet/x64/data/labels/36_1.png delete mode 100644 build/darknet/x64/data/labels/36_2.png delete mode 100644 build/darknet/x64/data/labels/36_3.png delete mode 100644 build/darknet/x64/data/labels/36_4.png delete mode 100644 build/darknet/x64/data/labels/36_5.png delete mode 100644 build/darknet/x64/data/labels/36_6.png delete mode 100644 build/darknet/x64/data/labels/36_7.png delete mode 100644 build/darknet/x64/data/labels/37_0.png delete mode 100644 build/darknet/x64/data/labels/37_1.png delete mode 100644 build/darknet/x64/data/labels/37_2.png delete mode 100644 build/darknet/x64/data/labels/37_3.png delete mode 100644 build/darknet/x64/data/labels/37_4.png delete mode 100644 build/darknet/x64/data/labels/37_5.png delete mode 100644 build/darknet/x64/data/labels/37_6.png delete mode 100644 build/darknet/x64/data/labels/37_7.png delete mode 100644 build/darknet/x64/data/labels/38_0.png delete mode 100644 build/darknet/x64/data/labels/38_1.png delete mode 100644 build/darknet/x64/data/labels/38_2.png delete mode 100644 build/darknet/x64/data/labels/38_3.png delete mode 100644 build/darknet/x64/data/labels/38_4.png delete mode 100644 build/darknet/x64/data/labels/38_5.png delete mode 100644 build/darknet/x64/data/labels/38_6.png delete mode 100644 build/darknet/x64/data/labels/38_7.png delete mode 100644 build/darknet/x64/data/labels/39_0.png delete mode 100644 build/darknet/x64/data/labels/39_1.png delete mode 100644 build/darknet/x64/data/labels/39_2.png delete mode 100644 build/darknet/x64/data/labels/39_3.png delete mode 100644 build/darknet/x64/data/labels/39_4.png delete mode 100644 build/darknet/x64/data/labels/39_5.png delete mode 100644 build/darknet/x64/data/labels/39_6.png delete mode 100644 build/darknet/x64/data/labels/39_7.png delete mode 100644 build/darknet/x64/data/labels/40_0.png delete mode 100644 build/darknet/x64/data/labels/40_1.png delete mode 100644 build/darknet/x64/data/labels/40_2.png delete mode 100644 build/darknet/x64/data/labels/40_3.png delete mode 100644 build/darknet/x64/data/labels/40_4.png delete mode 100644 build/darknet/x64/data/labels/40_5.png delete mode 100644 build/darknet/x64/data/labels/40_6.png delete mode 100644 build/darknet/x64/data/labels/40_7.png delete mode 100644 build/darknet/x64/data/labels/41_0.png delete mode 100644 build/darknet/x64/data/labels/41_1.png delete mode 100644 build/darknet/x64/data/labels/41_2.png delete mode 100644 build/darknet/x64/data/labels/41_3.png delete mode 100644 build/darknet/x64/data/labels/41_4.png delete mode 100644 build/darknet/x64/data/labels/41_5.png delete mode 100644 build/darknet/x64/data/labels/41_6.png delete mode 100644 build/darknet/x64/data/labels/41_7.png delete mode 100644 build/darknet/x64/data/labels/42_0.png delete mode 100644 build/darknet/x64/data/labels/42_1.png delete mode 100644 build/darknet/x64/data/labels/42_2.png delete mode 100644 build/darknet/x64/data/labels/42_3.png delete mode 100644 build/darknet/x64/data/labels/42_4.png delete mode 100644 build/darknet/x64/data/labels/42_5.png delete mode 100644 build/darknet/x64/data/labels/42_6.png delete mode 100644 build/darknet/x64/data/labels/42_7.png delete mode 100644 build/darknet/x64/data/labels/43_0.png delete mode 100644 build/darknet/x64/data/labels/43_1.png delete mode 100644 build/darknet/x64/data/labels/43_2.png delete mode 100644 build/darknet/x64/data/labels/43_3.png delete mode 100644 build/darknet/x64/data/labels/43_4.png delete mode 100644 build/darknet/x64/data/labels/43_5.png delete mode 100644 build/darknet/x64/data/labels/43_6.png delete mode 100644 build/darknet/x64/data/labels/43_7.png delete mode 100644 build/darknet/x64/data/labels/44_0.png delete mode 100644 build/darknet/x64/data/labels/44_1.png delete mode 100644 build/darknet/x64/data/labels/44_2.png delete mode 100644 build/darknet/x64/data/labels/44_3.png delete mode 100644 build/darknet/x64/data/labels/44_4.png delete mode 100644 build/darknet/x64/data/labels/44_5.png delete mode 100644 build/darknet/x64/data/labels/44_6.png delete mode 100644 build/darknet/x64/data/labels/44_7.png delete mode 100644 build/darknet/x64/data/labels/45_0.png delete mode 100644 build/darknet/x64/data/labels/45_1.png delete mode 100644 build/darknet/x64/data/labels/45_2.png delete mode 100644 build/darknet/x64/data/labels/45_3.png delete mode 100644 build/darknet/x64/data/labels/45_4.png delete mode 100644 build/darknet/x64/data/labels/45_5.png delete mode 100644 build/darknet/x64/data/labels/45_6.png delete mode 100644 build/darknet/x64/data/labels/45_7.png delete mode 100644 build/darknet/x64/data/labels/46_0.png delete mode 100644 build/darknet/x64/data/labels/46_1.png delete mode 100644 build/darknet/x64/data/labels/46_2.png delete mode 100644 build/darknet/x64/data/labels/46_3.png delete mode 100644 build/darknet/x64/data/labels/46_4.png delete mode 100644 build/darknet/x64/data/labels/46_5.png delete mode 100644 build/darknet/x64/data/labels/46_6.png delete mode 100644 build/darknet/x64/data/labels/46_7.png delete mode 100644 build/darknet/x64/data/labels/47_0.png delete mode 100644 build/darknet/x64/data/labels/47_1.png delete mode 100644 build/darknet/x64/data/labels/47_2.png delete mode 100644 build/darknet/x64/data/labels/47_3.png delete mode 100644 build/darknet/x64/data/labels/47_4.png delete mode 100644 build/darknet/x64/data/labels/47_5.png delete mode 100644 build/darknet/x64/data/labels/47_6.png delete mode 100644 build/darknet/x64/data/labels/47_7.png delete mode 100644 build/darknet/x64/data/labels/48_0.png delete mode 100644 build/darknet/x64/data/labels/48_1.png delete mode 100644 build/darknet/x64/data/labels/48_2.png delete mode 100644 build/darknet/x64/data/labels/48_3.png delete mode 100644 build/darknet/x64/data/labels/48_4.png delete mode 100644 build/darknet/x64/data/labels/48_5.png delete mode 100644 build/darknet/x64/data/labels/48_6.png delete mode 100644 build/darknet/x64/data/labels/48_7.png delete mode 100644 build/darknet/x64/data/labels/49_0.png delete mode 100644 build/darknet/x64/data/labels/49_1.png delete mode 100644 build/darknet/x64/data/labels/49_2.png delete mode 100644 build/darknet/x64/data/labels/49_3.png delete mode 100644 build/darknet/x64/data/labels/49_4.png delete mode 100644 build/darknet/x64/data/labels/49_5.png delete mode 100644 build/darknet/x64/data/labels/49_6.png delete mode 100644 build/darknet/x64/data/labels/49_7.png delete mode 100644 build/darknet/x64/data/labels/50_0.png delete mode 100644 build/darknet/x64/data/labels/50_1.png delete mode 100644 build/darknet/x64/data/labels/50_2.png delete mode 100644 build/darknet/x64/data/labels/50_3.png delete mode 100644 build/darknet/x64/data/labels/50_4.png delete mode 100644 build/darknet/x64/data/labels/50_5.png delete mode 100644 build/darknet/x64/data/labels/50_6.png delete mode 100644 build/darknet/x64/data/labels/50_7.png delete mode 100644 build/darknet/x64/data/labels/51_0.png delete mode 100644 build/darknet/x64/data/labels/51_1.png delete mode 100644 build/darknet/x64/data/labels/51_2.png delete mode 100644 build/darknet/x64/data/labels/51_3.png delete mode 100644 build/darknet/x64/data/labels/51_4.png delete mode 100644 build/darknet/x64/data/labels/51_5.png delete mode 100644 build/darknet/x64/data/labels/51_6.png delete mode 100644 build/darknet/x64/data/labels/51_7.png delete mode 100644 build/darknet/x64/data/labels/52_0.png delete mode 100644 build/darknet/x64/data/labels/52_1.png delete mode 100644 build/darknet/x64/data/labels/52_2.png delete mode 100644 build/darknet/x64/data/labels/52_3.png delete mode 100644 build/darknet/x64/data/labels/52_4.png delete mode 100644 build/darknet/x64/data/labels/52_5.png delete mode 100644 build/darknet/x64/data/labels/52_6.png delete mode 100644 build/darknet/x64/data/labels/52_7.png delete mode 100644 build/darknet/x64/data/labels/53_0.png delete mode 100644 build/darknet/x64/data/labels/53_1.png delete mode 100644 build/darknet/x64/data/labels/53_2.png delete mode 100644 build/darknet/x64/data/labels/53_3.png delete mode 100644 build/darknet/x64/data/labels/53_4.png delete mode 100644 build/darknet/x64/data/labels/53_5.png delete mode 100644 build/darknet/x64/data/labels/53_6.png delete mode 100644 build/darknet/x64/data/labels/53_7.png delete mode 100644 build/darknet/x64/data/labels/54_0.png delete mode 100644 build/darknet/x64/data/labels/54_1.png delete mode 100644 build/darknet/x64/data/labels/54_2.png delete mode 100644 build/darknet/x64/data/labels/54_3.png delete mode 100644 build/darknet/x64/data/labels/54_4.png delete mode 100644 build/darknet/x64/data/labels/54_5.png delete mode 100644 build/darknet/x64/data/labels/54_6.png delete mode 100644 build/darknet/x64/data/labels/54_7.png delete mode 100644 build/darknet/x64/data/labels/55_0.png delete mode 100644 build/darknet/x64/data/labels/55_1.png delete mode 100644 build/darknet/x64/data/labels/55_2.png delete mode 100644 build/darknet/x64/data/labels/55_3.png delete mode 100644 build/darknet/x64/data/labels/55_4.png delete mode 100644 build/darknet/x64/data/labels/55_5.png delete mode 100644 build/darknet/x64/data/labels/55_6.png delete mode 100644 build/darknet/x64/data/labels/55_7.png delete mode 100644 build/darknet/x64/data/labels/56_0.png delete mode 100644 build/darknet/x64/data/labels/56_1.png delete mode 100644 build/darknet/x64/data/labels/56_2.png delete mode 100644 build/darknet/x64/data/labels/56_3.png delete mode 100644 build/darknet/x64/data/labels/56_4.png delete mode 100644 build/darknet/x64/data/labels/56_5.png delete mode 100644 build/darknet/x64/data/labels/56_6.png delete mode 100644 build/darknet/x64/data/labels/56_7.png delete mode 100644 build/darknet/x64/data/labels/57_0.png delete mode 100644 build/darknet/x64/data/labels/57_1.png delete mode 100644 build/darknet/x64/data/labels/57_2.png delete mode 100644 build/darknet/x64/data/labels/57_3.png delete mode 100644 build/darknet/x64/data/labels/57_4.png delete mode 100644 build/darknet/x64/data/labels/57_5.png delete mode 100644 build/darknet/x64/data/labels/57_6.png delete mode 100644 build/darknet/x64/data/labels/57_7.png delete mode 100644 build/darknet/x64/data/labels/58_0.png delete mode 100644 build/darknet/x64/data/labels/58_1.png delete mode 100644 build/darknet/x64/data/labels/58_2.png delete mode 100644 build/darknet/x64/data/labels/58_3.png delete mode 100644 build/darknet/x64/data/labels/58_4.png delete mode 100644 build/darknet/x64/data/labels/58_5.png delete mode 100644 build/darknet/x64/data/labels/58_6.png delete mode 100644 build/darknet/x64/data/labels/58_7.png delete mode 100644 build/darknet/x64/data/labels/59_0.png delete mode 100644 build/darknet/x64/data/labels/59_1.png delete mode 100644 build/darknet/x64/data/labels/59_2.png delete mode 100644 build/darknet/x64/data/labels/59_3.png delete mode 100644 build/darknet/x64/data/labels/59_4.png delete mode 100644 build/darknet/x64/data/labels/59_5.png delete mode 100644 build/darknet/x64/data/labels/59_6.png delete mode 100644 build/darknet/x64/data/labels/59_7.png delete mode 100644 build/darknet/x64/data/labels/60_0.png delete mode 100644 build/darknet/x64/data/labels/60_1.png delete mode 100644 build/darknet/x64/data/labels/60_2.png delete mode 100644 build/darknet/x64/data/labels/60_3.png delete mode 100644 build/darknet/x64/data/labels/60_4.png delete mode 100644 build/darknet/x64/data/labels/60_5.png delete mode 100644 build/darknet/x64/data/labels/60_6.png delete mode 100644 build/darknet/x64/data/labels/60_7.png delete mode 100644 build/darknet/x64/data/labels/61_0.png delete mode 100644 build/darknet/x64/data/labels/61_1.png delete mode 100644 build/darknet/x64/data/labels/61_2.png delete mode 100644 build/darknet/x64/data/labels/61_3.png delete mode 100644 build/darknet/x64/data/labels/61_4.png delete mode 100644 build/darknet/x64/data/labels/61_5.png delete mode 100644 build/darknet/x64/data/labels/61_6.png delete mode 100644 build/darknet/x64/data/labels/61_7.png delete mode 100644 build/darknet/x64/data/labels/62_0.png delete mode 100644 build/darknet/x64/data/labels/62_1.png delete mode 100644 build/darknet/x64/data/labels/62_2.png delete mode 100644 build/darknet/x64/data/labels/62_3.png delete mode 100644 build/darknet/x64/data/labels/62_4.png delete mode 100644 build/darknet/x64/data/labels/62_5.png delete mode 100644 build/darknet/x64/data/labels/62_6.png delete mode 100644 build/darknet/x64/data/labels/62_7.png delete mode 100644 build/darknet/x64/data/labels/63_0.png delete mode 100644 build/darknet/x64/data/labels/63_1.png delete mode 100644 build/darknet/x64/data/labels/63_2.png delete mode 100644 build/darknet/x64/data/labels/63_3.png delete mode 100644 build/darknet/x64/data/labels/63_4.png delete mode 100644 build/darknet/x64/data/labels/63_5.png delete mode 100644 build/darknet/x64/data/labels/63_6.png delete mode 100644 build/darknet/x64/data/labels/63_7.png delete mode 100644 build/darknet/x64/data/labels/64_0.png delete mode 100644 build/darknet/x64/data/labels/64_1.png delete mode 100644 build/darknet/x64/data/labels/64_2.png delete mode 100644 build/darknet/x64/data/labels/64_3.png delete mode 100644 build/darknet/x64/data/labels/64_4.png delete mode 100644 build/darknet/x64/data/labels/64_5.png delete mode 100644 build/darknet/x64/data/labels/64_6.png delete mode 100644 build/darknet/x64/data/labels/64_7.png delete mode 100644 build/darknet/x64/data/labels/65_0.png delete mode 100644 build/darknet/x64/data/labels/65_1.png delete mode 100644 build/darknet/x64/data/labels/65_2.png delete mode 100644 build/darknet/x64/data/labels/65_3.png delete mode 100644 build/darknet/x64/data/labels/65_4.png delete mode 100644 build/darknet/x64/data/labels/65_5.png delete mode 100644 build/darknet/x64/data/labels/65_6.png delete mode 100644 build/darknet/x64/data/labels/65_7.png delete mode 100644 build/darknet/x64/data/labels/66_0.png delete mode 100644 build/darknet/x64/data/labels/66_1.png delete mode 100644 build/darknet/x64/data/labels/66_2.png delete mode 100644 build/darknet/x64/data/labels/66_3.png delete mode 100644 build/darknet/x64/data/labels/66_4.png delete mode 100644 build/darknet/x64/data/labels/66_5.png delete mode 100644 build/darknet/x64/data/labels/66_6.png delete mode 100644 build/darknet/x64/data/labels/66_7.png delete mode 100644 build/darknet/x64/data/labels/67_0.png delete mode 100644 build/darknet/x64/data/labels/67_1.png delete mode 100644 build/darknet/x64/data/labels/67_2.png delete mode 100644 build/darknet/x64/data/labels/67_3.png delete mode 100644 build/darknet/x64/data/labels/67_4.png delete mode 100644 build/darknet/x64/data/labels/67_5.png delete mode 100644 build/darknet/x64/data/labels/67_6.png delete mode 100644 build/darknet/x64/data/labels/67_7.png delete mode 100644 build/darknet/x64/data/labels/68_0.png delete mode 100644 build/darknet/x64/data/labels/68_1.png delete mode 100644 build/darknet/x64/data/labels/68_2.png delete mode 100644 build/darknet/x64/data/labels/68_3.png delete mode 100644 build/darknet/x64/data/labels/68_4.png delete mode 100644 build/darknet/x64/data/labels/68_5.png delete mode 100644 build/darknet/x64/data/labels/68_6.png delete mode 100644 build/darknet/x64/data/labels/68_7.png delete mode 100644 build/darknet/x64/data/labels/69_0.png delete mode 100644 build/darknet/x64/data/labels/69_1.png delete mode 100644 build/darknet/x64/data/labels/69_2.png delete mode 100644 build/darknet/x64/data/labels/69_3.png delete mode 100644 build/darknet/x64/data/labels/69_4.png delete mode 100644 build/darknet/x64/data/labels/69_5.png delete mode 100644 build/darknet/x64/data/labels/69_6.png delete mode 100644 build/darknet/x64/data/labels/69_7.png delete mode 100644 build/darknet/x64/data/labels/70_0.png delete mode 100644 build/darknet/x64/data/labels/70_1.png delete mode 100644 build/darknet/x64/data/labels/70_2.png delete mode 100644 build/darknet/x64/data/labels/70_3.png delete mode 100644 build/darknet/x64/data/labels/70_4.png delete mode 100644 build/darknet/x64/data/labels/70_5.png delete mode 100644 build/darknet/x64/data/labels/70_6.png delete mode 100644 build/darknet/x64/data/labels/70_7.png delete mode 100644 build/darknet/x64/data/labels/71_0.png delete mode 100644 build/darknet/x64/data/labels/71_1.png delete mode 100644 build/darknet/x64/data/labels/71_2.png delete mode 100644 build/darknet/x64/data/labels/71_3.png delete mode 100644 build/darknet/x64/data/labels/71_4.png delete mode 100644 build/darknet/x64/data/labels/71_5.png delete mode 100644 build/darknet/x64/data/labels/71_6.png delete mode 100644 build/darknet/x64/data/labels/71_7.png delete mode 100644 build/darknet/x64/data/labels/72_0.png delete mode 100644 build/darknet/x64/data/labels/72_1.png delete mode 100644 build/darknet/x64/data/labels/72_2.png delete mode 100644 build/darknet/x64/data/labels/72_3.png delete mode 100644 build/darknet/x64/data/labels/72_4.png delete mode 100644 build/darknet/x64/data/labels/72_5.png delete mode 100644 build/darknet/x64/data/labels/72_6.png delete mode 100644 build/darknet/x64/data/labels/72_7.png delete mode 100644 build/darknet/x64/data/labels/73_0.png delete mode 100644 build/darknet/x64/data/labels/73_1.png delete mode 100644 build/darknet/x64/data/labels/73_2.png delete mode 100644 build/darknet/x64/data/labels/73_3.png delete mode 100644 build/darknet/x64/data/labels/73_4.png delete mode 100644 build/darknet/x64/data/labels/73_5.png delete mode 100644 build/darknet/x64/data/labels/73_6.png delete mode 100644 build/darknet/x64/data/labels/73_7.png delete mode 100644 build/darknet/x64/data/labels/74_0.png delete mode 100644 build/darknet/x64/data/labels/74_1.png delete mode 100644 build/darknet/x64/data/labels/74_2.png delete mode 100644 build/darknet/x64/data/labels/74_3.png delete mode 100644 build/darknet/x64/data/labels/74_4.png delete mode 100644 build/darknet/x64/data/labels/74_5.png delete mode 100644 build/darknet/x64/data/labels/74_6.png delete mode 100644 build/darknet/x64/data/labels/74_7.png delete mode 100644 build/darknet/x64/data/labels/75_0.png delete mode 100644 build/darknet/x64/data/labels/75_1.png delete mode 100644 build/darknet/x64/data/labels/75_2.png delete mode 100644 build/darknet/x64/data/labels/75_3.png delete mode 100644 build/darknet/x64/data/labels/75_4.png delete mode 100644 build/darknet/x64/data/labels/75_5.png delete mode 100644 build/darknet/x64/data/labels/75_6.png delete mode 100644 build/darknet/x64/data/labels/75_7.png delete mode 100644 build/darknet/x64/data/labels/76_0.png delete mode 100644 build/darknet/x64/data/labels/76_1.png delete mode 100644 build/darknet/x64/data/labels/76_2.png delete mode 100644 build/darknet/x64/data/labels/76_3.png delete mode 100644 build/darknet/x64/data/labels/76_4.png delete mode 100644 build/darknet/x64/data/labels/76_5.png delete mode 100644 build/darknet/x64/data/labels/76_6.png delete mode 100644 build/darknet/x64/data/labels/76_7.png delete mode 100644 build/darknet/x64/data/labels/77_0.png delete mode 100644 build/darknet/x64/data/labels/77_1.png delete mode 100644 build/darknet/x64/data/labels/77_2.png delete mode 100644 build/darknet/x64/data/labels/77_3.png delete mode 100644 build/darknet/x64/data/labels/77_4.png delete mode 100644 build/darknet/x64/data/labels/77_5.png delete mode 100644 build/darknet/x64/data/labels/77_6.png delete mode 100644 build/darknet/x64/data/labels/77_7.png delete mode 100644 build/darknet/x64/data/labels/78_0.png delete mode 100644 build/darknet/x64/data/labels/78_1.png delete mode 100644 build/darknet/x64/data/labels/78_2.png delete mode 100644 build/darknet/x64/data/labels/78_3.png delete mode 100644 build/darknet/x64/data/labels/78_4.png delete mode 100644 build/darknet/x64/data/labels/78_5.png delete mode 100644 build/darknet/x64/data/labels/78_6.png delete mode 100644 build/darknet/x64/data/labels/78_7.png delete mode 100644 build/darknet/x64/data/labels/79_0.png delete mode 100644 build/darknet/x64/data/labels/79_1.png delete mode 100644 build/darknet/x64/data/labels/79_2.png delete mode 100644 build/darknet/x64/data/labels/79_3.png delete mode 100644 build/darknet/x64/data/labels/79_4.png delete mode 100644 build/darknet/x64/data/labels/79_5.png delete mode 100644 build/darknet/x64/data/labels/79_6.png delete mode 100644 build/darknet/x64/data/labels/79_7.png delete mode 100644 build/darknet/x64/data/labels/80_0.png delete mode 100644 build/darknet/x64/data/labels/80_1.png delete mode 100644 build/darknet/x64/data/labels/80_2.png delete mode 100644 build/darknet/x64/data/labels/80_3.png delete mode 100644 build/darknet/x64/data/labels/80_4.png delete mode 100644 build/darknet/x64/data/labels/80_5.png delete mode 100644 build/darknet/x64/data/labels/80_6.png delete mode 100644 build/darknet/x64/data/labels/80_7.png delete mode 100644 build/darknet/x64/data/labels/81_0.png delete mode 100644 build/darknet/x64/data/labels/81_1.png delete mode 100644 build/darknet/x64/data/labels/81_2.png delete mode 100644 build/darknet/x64/data/labels/81_3.png delete mode 100644 build/darknet/x64/data/labels/81_4.png delete mode 100644 build/darknet/x64/data/labels/81_5.png delete mode 100644 build/darknet/x64/data/labels/81_6.png delete mode 100644 build/darknet/x64/data/labels/81_7.png delete mode 100644 build/darknet/x64/data/labels/82_0.png delete mode 100644 build/darknet/x64/data/labels/82_1.png delete mode 100644 build/darknet/x64/data/labels/82_2.png delete mode 100644 build/darknet/x64/data/labels/82_3.png delete mode 100644 build/darknet/x64/data/labels/82_4.png delete mode 100644 build/darknet/x64/data/labels/82_5.png delete mode 100644 build/darknet/x64/data/labels/82_6.png delete mode 100644 build/darknet/x64/data/labels/82_7.png delete mode 100644 build/darknet/x64/data/labels/83_0.png delete mode 100644 build/darknet/x64/data/labels/83_1.png delete mode 100644 build/darknet/x64/data/labels/83_2.png delete mode 100644 build/darknet/x64/data/labels/83_3.png delete mode 100644 build/darknet/x64/data/labels/83_4.png delete mode 100644 build/darknet/x64/data/labels/83_5.png delete mode 100644 build/darknet/x64/data/labels/83_6.png delete mode 100644 build/darknet/x64/data/labels/83_7.png delete mode 100644 build/darknet/x64/data/labels/84_0.png delete mode 100644 build/darknet/x64/data/labels/84_1.png delete mode 100644 build/darknet/x64/data/labels/84_2.png delete mode 100644 build/darknet/x64/data/labels/84_3.png delete mode 100644 build/darknet/x64/data/labels/84_4.png delete mode 100644 build/darknet/x64/data/labels/84_5.png delete mode 100644 build/darknet/x64/data/labels/84_6.png delete mode 100644 build/darknet/x64/data/labels/84_7.png delete mode 100644 build/darknet/x64/data/labels/85_0.png delete mode 100644 build/darknet/x64/data/labels/85_1.png delete mode 100644 build/darknet/x64/data/labels/85_2.png delete mode 100644 build/darknet/x64/data/labels/85_3.png delete mode 100644 build/darknet/x64/data/labels/85_4.png delete mode 100644 build/darknet/x64/data/labels/85_5.png delete mode 100644 build/darknet/x64/data/labels/85_6.png delete mode 100644 build/darknet/x64/data/labels/85_7.png delete mode 100644 build/darknet/x64/data/labels/86_0.png delete mode 100644 build/darknet/x64/data/labels/86_1.png delete mode 100644 build/darknet/x64/data/labels/86_2.png delete mode 100644 build/darknet/x64/data/labels/86_3.png delete mode 100644 build/darknet/x64/data/labels/86_4.png delete mode 100644 build/darknet/x64/data/labels/86_5.png delete mode 100644 build/darknet/x64/data/labels/86_6.png delete mode 100644 build/darknet/x64/data/labels/86_7.png delete mode 100644 build/darknet/x64/data/labels/87_0.png delete mode 100644 build/darknet/x64/data/labels/87_1.png delete mode 100644 build/darknet/x64/data/labels/87_2.png delete mode 100644 build/darknet/x64/data/labels/87_3.png delete mode 100644 build/darknet/x64/data/labels/87_4.png delete mode 100644 build/darknet/x64/data/labels/87_5.png delete mode 100644 build/darknet/x64/data/labels/87_6.png delete mode 100644 build/darknet/x64/data/labels/87_7.png delete mode 100644 build/darknet/x64/data/labels/88_0.png delete mode 100644 build/darknet/x64/data/labels/88_1.png delete mode 100644 build/darknet/x64/data/labels/88_2.png delete mode 100644 build/darknet/x64/data/labels/88_3.png delete mode 100644 build/darknet/x64/data/labels/88_4.png delete mode 100644 build/darknet/x64/data/labels/88_5.png delete mode 100644 build/darknet/x64/data/labels/88_6.png delete mode 100644 build/darknet/x64/data/labels/88_7.png delete mode 100644 build/darknet/x64/data/labels/89_0.png delete mode 100644 build/darknet/x64/data/labels/89_1.png delete mode 100644 build/darknet/x64/data/labels/89_2.png delete mode 100644 build/darknet/x64/data/labels/89_3.png delete mode 100644 build/darknet/x64/data/labels/89_4.png delete mode 100644 build/darknet/x64/data/labels/89_5.png delete mode 100644 build/darknet/x64/data/labels/89_6.png delete mode 100644 build/darknet/x64/data/labels/89_7.png delete mode 100644 build/darknet/x64/data/labels/90_0.png delete mode 100644 build/darknet/x64/data/labels/90_1.png delete mode 100644 build/darknet/x64/data/labels/90_2.png delete mode 100644 build/darknet/x64/data/labels/90_3.png delete mode 100644 build/darknet/x64/data/labels/90_4.png delete mode 100644 build/darknet/x64/data/labels/90_5.png delete mode 100644 build/darknet/x64/data/labels/90_6.png delete mode 100644 build/darknet/x64/data/labels/90_7.png delete mode 100644 build/darknet/x64/data/labels/91_0.png delete mode 100644 build/darknet/x64/data/labels/91_1.png delete mode 100644 build/darknet/x64/data/labels/91_2.png delete mode 100644 build/darknet/x64/data/labels/91_3.png delete mode 100644 build/darknet/x64/data/labels/91_4.png delete mode 100644 build/darknet/x64/data/labels/91_5.png delete mode 100644 build/darknet/x64/data/labels/91_6.png delete mode 100644 build/darknet/x64/data/labels/91_7.png delete mode 100644 build/darknet/x64/data/labels/92_0.png delete mode 100644 build/darknet/x64/data/labels/92_1.png delete mode 100644 build/darknet/x64/data/labels/92_2.png delete mode 100644 build/darknet/x64/data/labels/92_3.png delete mode 100644 build/darknet/x64/data/labels/92_4.png delete mode 100644 build/darknet/x64/data/labels/92_5.png delete mode 100644 build/darknet/x64/data/labels/92_6.png delete mode 100644 build/darknet/x64/data/labels/92_7.png delete mode 100644 build/darknet/x64/data/labels/93_0.png delete mode 100644 build/darknet/x64/data/labels/93_1.png delete mode 100644 build/darknet/x64/data/labels/93_2.png delete mode 100644 build/darknet/x64/data/labels/93_3.png delete mode 100644 build/darknet/x64/data/labels/93_4.png delete mode 100644 build/darknet/x64/data/labels/93_5.png delete mode 100644 build/darknet/x64/data/labels/93_6.png delete mode 100644 build/darknet/x64/data/labels/93_7.png delete mode 100644 build/darknet/x64/data/labels/94_0.png delete mode 100644 build/darknet/x64/data/labels/94_1.png delete mode 100644 build/darknet/x64/data/labels/94_2.png delete mode 100644 build/darknet/x64/data/labels/94_3.png delete mode 100644 build/darknet/x64/data/labels/94_4.png delete mode 100644 build/darknet/x64/data/labels/94_5.png delete mode 100644 build/darknet/x64/data/labels/94_6.png delete mode 100644 build/darknet/x64/data/labels/94_7.png delete mode 100644 build/darknet/x64/data/labels/95_0.png delete mode 100644 build/darknet/x64/data/labels/95_1.png delete mode 100644 build/darknet/x64/data/labels/95_2.png delete mode 100644 build/darknet/x64/data/labels/95_3.png delete mode 100644 build/darknet/x64/data/labels/95_4.png delete mode 100644 build/darknet/x64/data/labels/95_5.png delete mode 100644 build/darknet/x64/data/labels/95_6.png delete mode 100644 build/darknet/x64/data/labels/95_7.png delete mode 100644 build/darknet/x64/data/labels/96_0.png delete mode 100644 build/darknet/x64/data/labels/96_1.png delete mode 100644 build/darknet/x64/data/labels/96_2.png delete mode 100644 build/darknet/x64/data/labels/96_3.png delete mode 100644 build/darknet/x64/data/labels/96_4.png delete mode 100644 build/darknet/x64/data/labels/96_5.png delete mode 100644 build/darknet/x64/data/labels/96_6.png delete mode 100644 build/darknet/x64/data/labels/96_7.png delete mode 100644 build/darknet/x64/data/labels/97_0.png delete mode 100644 build/darknet/x64/data/labels/97_1.png delete mode 100644 build/darknet/x64/data/labels/97_2.png delete mode 100644 build/darknet/x64/data/labels/97_3.png delete mode 100644 build/darknet/x64/data/labels/97_4.png delete mode 100644 build/darknet/x64/data/labels/97_5.png delete mode 100644 build/darknet/x64/data/labels/97_6.png delete mode 100644 build/darknet/x64/data/labels/97_7.png delete mode 100644 build/darknet/x64/data/labels/98_0.png delete mode 100644 build/darknet/x64/data/labels/98_1.png delete mode 100644 build/darknet/x64/data/labels/98_2.png delete mode 100644 build/darknet/x64/data/labels/98_3.png delete mode 100644 build/darknet/x64/data/labels/98_4.png delete mode 100644 build/darknet/x64/data/labels/98_5.png delete mode 100644 build/darknet/x64/data/labels/98_6.png delete mode 100644 build/darknet/x64/data/labels/98_7.png delete mode 100644 build/darknet/x64/data/labels/99_0.png delete mode 100644 build/darknet/x64/data/labels/99_1.png delete mode 100644 build/darknet/x64/data/labels/99_2.png delete mode 100644 build/darknet/x64/data/labels/99_3.png delete mode 100644 build/darknet/x64/data/labels/99_4.png delete mode 100644 build/darknet/x64/data/labels/99_5.png delete mode 100644 build/darknet/x64/data/labels/99_6.png delete mode 100644 build/darknet/x64/data/labels/99_7.png delete mode 100644 build/darknet/x64/data/labels/make_labels.py delete mode 100644 build/darknet/x64/data/openimages.data delete mode 100644 build/darknet/x64/data/openimages.names delete mode 100644 build/darknet/x64/data/person.jpg delete mode 100644 build/darknet/x64/data/scream.jpg delete mode 100644 build/darknet/x64/data/voc.data delete mode 100644 build/darknet/x64/data/voc.names delete mode 100644 build/darknet/x64/data/voc/voc_label.py delete mode 100644 build/darknet/x64/densenet201_yolo.cfg delete mode 100644 build/darknet/x64/dog.jpg delete mode 100644 build/darknet/x64/dogr.jpg delete mode 100644 build/darknet/x64/gen_anchors.py delete mode 100644 build/darknet/x64/pthreadGC2.dll delete mode 100644 build/darknet/x64/pthreadVC2.dll delete mode 100644 build/darknet/x64/resnet152_yolo.cfg delete mode 100644 build/darknet/x64/resnet50_yolo.cfg delete mode 100644 build/darknet/x64/results/tmp.txt delete mode 100644 build/darknet/x64/reval_voc_py3.py delete mode 100644 build/darknet/x64/tiny-yolo-voc.cfg delete mode 100644 build/darknet/x64/tiny-yolo.cfg delete mode 100644 build/darknet/x64/voc_eval_py3.py delete mode 100644 build/darknet/x64/yolo-voc.2.0.cfg delete mode 100644 build/darknet/x64/yolo-voc.cfg delete mode 100644 build/darknet/x64/yolo.2.0.cfg delete mode 100644 build/darknet/x64/yolo.cfg delete mode 100644 build/darknet/x64/yolo9000.cfg delete mode 100644 build/darknet/x64/yolov3-voc.cfg delete mode 100644 build/darknet/x64/yolov3.cfg delete mode 100644 build/darknet/yolo_console_dll.sln delete mode 100644 build/darknet/yolo_console_dll.vcxproj delete mode 100644 build/darknet/yolo_cpp_dll.sln delete mode 100644 build/darknet/yolo_cpp_dll.vcxproj delete mode 100644 build/darknet/yolo_cpp_dll_no_gpu.sln delete mode 100644 build/darknet/yolo_cpp_dll_no_gpu.vcxproj rename {build/darknet/x64 => scripts/windows}/calc_anchors.cmd (100%) rename {build/darknet/x64 => scripts/windows}/calc_mAP.cmd (100%) rename {build/darknet/x64 => scripts/windows}/calc_mAP_coco.cmd (100%) rename {build/darknet/x64 => scripts/windows}/calc_mAP_voc_py.cmd (100%) rename {build/darknet/x64 => scripts/windows}/classifier_densenet201.cmd (100%) rename {build/darknet/x64 => scripts/windows}/classifier_resnet50.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_coco.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_coco_9000.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_coco_9000_demo.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_demo_coco.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_demo_json_stream.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_demo_mjpeg_stream.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_demo_store.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_demo_voc.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_demo_voc_param.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_demo_voc_tiny.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_json_reslut.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_many_images.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_net_cam_coco.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_net_cam_voc.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_python.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_tiny_v2.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_video.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_voc.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_voc_tiny_v2.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_web_cam_voc.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_yolo_v3.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_yolo_v3_openimages.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_yolo_v3_video.cmd (100%) rename {build/darknet/x64 => scripts/windows}/darknet_yolov3_pseudo_labeling.cmd (100%) rename {build/darknet/x64 => scripts/windows}/partial.cmd (100%) rename {build/darknet/x64 => scripts/windows}/rnn_lstm.cmd (100%) rename {build/darknet/x64 => scripts/windows}/rnn_tolstoy.cmd (100%) rename {build/darknet/x64 => scripts/windows}/train_voc.cmd (100%) delete mode 100644 src/.editorconfig rename {build/darknet => src}/YoloWrapper.cs (100%) diff --git a/.gitignore b/.gitignore index 174f0b5a378..00e9b770e4c 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ Thumbs.db # IDE generated # .vs/ .vscode/ +.editorconfig # Managed by CMake src/version.h diff --git a/build/darknet/darknet.sln b/build/darknet/darknet.sln deleted file mode 100644 index c49e10efa09..00000000000 --- a/build/darknet/darknet.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "darknet", "darknet.vcxproj", "{4CF5694F-12A5-4012-8D94-9A0915E9FEB5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5}.Debug|Win32.ActiveCfg = Debug|Win32 - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5}.Debug|Win32.Build.0 = Debug|Win32 - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5}.Debug|x64.ActiveCfg = Debug|x64 - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5}.Debug|x64.Build.0 = Debug|x64 - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5}.Release|Win32.ActiveCfg = Release|Win32 - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5}.Release|Win32.Build.0 = Release|Win32 - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5}.Release|x64.ActiveCfg = Release|x64 - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/build/darknet/darknet.vcxproj b/build/darknet/darknet.vcxproj deleted file mode 100644 index 5282de26d91..00000000000 --- a/build/darknet/darknet.vcxproj +++ /dev/null @@ -1,307 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {4CF5694F-12A5-4012-8D94-9A0915E9FEB5} - darknet - 8.1 - - - - Application - true - v140 - MultiByte - - - Application - true - v140 - MultiByte - - - Application - false - v140 - true - MultiByte - - - Application - false - v140 - true - MultiByte - - - - - - - - - - - - - - - - - - - - $(SolutionDir)$(Platform)\ - - - $(SolutionDir)$(Platform)\ - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - $(OPENCV_DIR)\include;C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\stb\include;..\..\3rdparty\pthreads\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(CUDNN)\include;$(cudnn)\include - CUDNN_HALF;CUDNN;_CRTDBG_MAP_ALLOC;_MBCS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;GPU;WIN32;DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - OPENCV; - true - stdlib.h;crtdbg.h;%(ForcedIncludeFiles) - - - true - $(OPENCV_DIR)\x64\vc15\lib;$(OPENCV_DIR)\x64\vc14\lib;C:\opencv_3.0\opencv\build\x64\vc14\lib;$(CUDA_PATH)\lib\$(PlatformName);$(CUDNN)\lib\x64;$(cudnn)\lib\x64;..\..\3rdparty\pthreads\lib;%(AdditionalLibraryDirectories) - $(OutDir)\$(TargetName)$(TargetExt) - pthreadVC2.lib;cublas.lib;curand.lib;cudart.lib;%(AdditionalDependencies) - true - - - compute_30,sm_30;compute_75,sm_75 - 64 - - - - - Level3 - MaxSpeed - true - true - true - C:\opencv_2.4.9\opencv\build\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(cudnn)\include - OPENCV;_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;GPU;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - true - - - true - true - true - C:\opencv_2.4.9\opencv\build\x86\vc14\lib;C:\opencv_2.4.9\opencv\build\x86\vc12\lib;$(CUDA_PATH)lib\$(PlatformName);$(cudnn)\lib\x64;%(AdditionalLibraryDirectories) - ..\..\3rdparty\lib\x86\pthreadVC2.lib;cudart.lib;cublas.lib;curand.lib;%(AdditionalDependencies) - - - - - Level3 - MaxSpeed - true - true - true - $(OPENCV_DIR)\include;C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\stb\include;..\..\3rdparty\pthreads\include;%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);$(CUDNN)\include;$(cudnn)\include - OPENCV;CUDNN_HALF;CUDNN;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;GPU;WIN32;_CONSOLE;_LIB;%(PreprocessorDefinitions) - c11 - c++1y - CompileAsCpp - Default - NDEBUG - true - - - - - true - true - true - $(OPENCV_DIR)\x64\vc15\lib;$(OPENCV_DIR)\x64\vc14\lib;C:\opencv_3.0\opencv\build\x64\vc14\lib;$(CUDA_PATH)\lib\$(PlatformName);$(CUDNN)\lib\x64;$(cudnn)\lib\x64;..\..\3rdparty\pthreads\lib;%(AdditionalLibraryDirectories) - pthreadVC2.lib;cublas.lib;curand.lib;cudart.lib;%(AdditionalDependencies) - $(OutDir)\$(TargetName)$(TargetExt) - - - 64 - compute_35,sm_35;compute_86,sm_86 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build/darknet/darknet_no_gpu.sln b/build/darknet/darknet_no_gpu.sln deleted file mode 100644 index 79d7c0a5daa..00000000000 --- a/build/darknet/darknet_no_gpu.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "darknet_no_gpu", "darknet_no_gpu.vcxproj", "{621B3914-936D-4BD9-843A-AD50F22B178D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {621B3914-936D-4BD9-843A-AD50F22B178D}.Debug|x64.ActiveCfg = Debug|x64 - {621B3914-936D-4BD9-843A-AD50F22B178D}.Debug|x64.Build.0 = Debug|x64 - {621B3914-936D-4BD9-843A-AD50F22B178D}.Debug|x86.ActiveCfg = Debug|Win32 - {621B3914-936D-4BD9-843A-AD50F22B178D}.Debug|x86.Build.0 = Debug|Win32 - {621B3914-936D-4BD9-843A-AD50F22B178D}.Release|x64.ActiveCfg = Release|x64 - {621B3914-936D-4BD9-843A-AD50F22B178D}.Release|x64.Build.0 = Release|x64 - {621B3914-936D-4BD9-843A-AD50F22B178D}.Release|x86.ActiveCfg = Release|Win32 - {621B3914-936D-4BD9-843A-AD50F22B178D}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/build/darknet/darknet_no_gpu.vcxproj b/build/darknet/darknet_no_gpu.vcxproj deleted file mode 100644 index 72d23af3d09..00000000000 --- a/build/darknet/darknet_no_gpu.vcxproj +++ /dev/null @@ -1,309 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {621B3914-936D-4BD9-843A-AD50F22B178D} - darknet - 8.1 - - - - Application - true - v140 - MultiByte - - - Application - true - v140 - MultiByte - - - Application - false - v140 - true - MultiByte - - - Application - false - v140 - true - MultiByte - - - - - - - - - - - - - - - - - - $(SolutionDir)$(Platform)\ - $(Platform)\nogpu_$(Configuration)\ - - - $(SolutionDir)$(Platform)\ - $(Platform)\nogpu_$(Configuration)\ - - - - Level3 - Disabled - true - C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories); - _CRTDBG_MAP_ALLOC;_MBCS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - OPENCV; - stdlib.h;crtdbg.h;%(ForcedIncludeFiles) - - - true - C:\opencv_3.0\opencv\build\x64\vc14\lib;C:\opencv_2.4.13\opencv\build\x64\vc12\lib;%(AdditionalLibraryDirectories) - ..\..\3rdparty\lib\x86\pthreadVC2.lib;%(AdditionalDependencies) - - - - - Level3 - Disabled - true - $(OPENCV_DIR)\include;C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\stb\include;..\..\3rdparty\pthreads\include;%(AdditionalIncludeDirectories) - _MBCS;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - OPENCV;CUDNN - true - stdlib.h;crtdbg.h;%(ForcedIncludeFiles) - - - true - $(OPENCV_DIR)\x64\vc15\lib;$(OPENCV_DIR)\x64\vc14\lib;C:\opencv_3.0\opencv\build\x64\vc14\lib;..\..\3rdparty\pthreads\lib;%(AdditionalLibraryDirectories) - $(OutDir)\$(TargetName)$(TargetExt) - pthreadVC2.lib;%(AdditionalDependencies) - - - compute_30,sm_30;compute_52,sm_52 - 64 - - - - - Level3 - MaxSpeed - true - true - true - C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\include;%(AdditionalIncludeDirectories); - _TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - - - - - true - true - true - C:\opencv_3.0\opencv\build\x64\vc14\lib;C:\opencv_2.4.13\opencv\build\x64\vc12\lib;%(AdditionalLibraryDirectories) - ..\..\3rdparty\lib\x86\pthreadVC2.lib;%(AdditionalDependencies) - - - - - Level3 - MaxSpeed - true - true - true - $(OPENCV_DIR)\include;C:\opencv_3.0\opencv\build\include;..\..\include;..\..\3rdparty\stb\include;..\..\3rdparty\pthreads\include;%(AdditionalIncludeDirectories) - OPENCV;_TIMESPEC_DEFINED;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - c11 - c++1y - CompileAsCpp - Default - CUDNN - true - - - true - true - true - $(OPENCV_DIR)\x64\vc15\lib;$(OPENCV_DIR)\x64\vc14\lib;C:\opencv_3.0\opencv\build\x64\vc14\lib;..\..\3rdparty\pthreads\lib;%(AdditionalLibraryDirectories) - pthreadVC2.lib;%(AdditionalDependencies) - $(OutDir)\$(TargetName)$(TargetExt) - - - 64 - compute_30,sm_30;compute_52,sm_52 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build/darknet/x64/backup/tmp.txt b/build/darknet/x64/backup/tmp.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/build/darknet/x64/cfg/Gaussian_yolov3_BDD.cfg b/build/darknet/x64/cfg/Gaussian_yolov3_BDD.cfg deleted file mode 100644 index 2ca7ec600e3..00000000000 --- a/build/darknet/x64/cfg/Gaussian_yolov3_BDD.cfg +++ /dev/null @@ -1,807 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=16 -width=512 -height=512 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.0001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 -max_epochs = 300 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -###################### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=57 -activation=linear - - -[Gaussian_yolo] -mask = 6,7,8 -anchors = 7,10, 14,24, 27,43, 32,97, 57,64, 92,109, 73,175, 141,178, 144,291 -classes=10 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -iou_thresh=0.213 -uc_normalizer=1.0 -cls_normalizer=1.0 -iou_normalizer=0.5 -iou_loss=giou -scale_x_y=1.0 -random=1 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 61 - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=57 -activation=linear - - -[Gaussian_yolo] -mask = 3,4,5 -anchors = 7,10, 14,24, 27,43, 32,97, 57,64, 92,109, 73,175, 141,178, 144,291 -classes=10 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -iou_thresh=0.213 -uc_normalizer=1.0 -cls_normalizer=1.0 -iou_normalizer=0.5 -iou_loss=giou -scale_x_y=1.0 -random=1 - - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 36 - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=57 -activation=linear - - -[Gaussian_yolo] -mask = 0,1,2 -anchors = 7,10, 14,24, 27,43, 32,97, 57,64, 92,109, 73,175, 141,178, 144,291 -classes=10 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -iou_thresh=0.213 -uc_normalizer=1.0 -cls_normalizer=1.0 -iou_normalizer=0.5 -iou_loss=giou -scale_x_y=1.0 -random=1 diff --git a/build/darknet/x64/cfg/alexnet.cfg b/build/darknet/x64/cfg/alexnet.cfg deleted file mode 100644 index 7e5a9b26a57..00000000000 --- a/build/darknet/x64/cfg/alexnet.cfg +++ /dev/null @@ -1,95 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=227 -width=227 -channels=3 -momentum=0.9 -decay=0.0005 -max_crop=256 - -learning_rate=0.01 -policy=poly -power=4 -max_batches=800000 - -angle=7 -hue = .1 -saturation=.75 -exposure=.75 -aspect=.75 - -[convolutional] -filters=96 -size=11 -stride=4 -pad=0 -activation=relu - -[maxpool] -size=3 -stride=2 -padding=0 - -[convolutional] -filters=256 -size=5 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=3 -stride=2 -padding=0 - -[convolutional] -filters=384 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=384 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=3 -stride=2 -padding=0 - -[connected] -output=4096 -activation=relu - -[dropout] -probability=.5 - -[connected] -output=4096 -activation=relu - -[dropout] -probability=.5 - -[connected] -output=1000 -activation=linear - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/cd53paspp-gamma.cfg b/build/darknet/x64/cfg/cd53paspp-gamma.cfg deleted file mode 100644 index be3dbff6e5a..00000000000 --- a/build/darknet/x64/cfg/cd53paspp-gamma.cfg +++ /dev/null @@ -1,1153 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=8 -width=512 -height=512 -channels=3 -momentum=0.949 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.00261 -burn_in=1000 -max_batches = 500500 -policy=steps -steps=400000,450000 -scales=.1,.1 - -#cutmix=1 -mosaic=1 - -#:104x104 54:52x52 85:26x26 104:13x13 for 416 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-7 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-10 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -########################## - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -### SPP ### -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 -### End SPP ### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 85 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 54 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -########################## - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -scale_x_y = 1.2 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=256 -activation=leaky - -[route] -layers = -1, -16 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -scale_x_y = 1.1 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=512 -activation=leaky - -[route] -layers = -1, -37 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 -scale_x_y = 1.05 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 diff --git a/build/darknet/x64/cfg/cifar.cfg b/build/darknet/x64/cfg/cifar.cfg deleted file mode 100644 index f2c801a5a9e..00000000000 --- a/build/darknet/x64/cfg/cifar.cfg +++ /dev/null @@ -1,126 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=32 -width=32 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.4 -policy=poly -power=4 -max_batches = 50000 - -[crop] -crop_width=28 -crop_height=28 -flip=1 -angle=0 -saturation = 1 -exposure = 1 -noadjust=1 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[dropout] -probability=.5 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[dropout] -probability=.5 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[dropout] -probability=.5 - -[convolutional] -filters=10 -size=1 -stride=1 -pad=1 -activation=leaky - -[avgpool] - -[softmax] -groups=1 - -[cost] - diff --git a/build/darknet/x64/cfg/cifar.test.cfg b/build/darknet/x64/cfg/cifar.test.cfg deleted file mode 100644 index d3afcdd79b7..00000000000 --- a/build/darknet/x64/cfg/cifar.test.cfg +++ /dev/null @@ -1,119 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=32 -width=32 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.4 -policy=poly -power=4 -max_batches = 50000 - - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[dropout] -probability=.5 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[dropout] -probability=.5 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[dropout] -probability=.5 - -[convolutional] -filters=10 -size=1 -stride=1 -pad=1 -activation=leaky - -[avgpool] - -[softmax] -groups=1 -temperature=3 - -[cost] - diff --git a/build/darknet/x64/cfg/coco.data b/build/darknet/x64/cfg/coco.data deleted file mode 100644 index f51d8428839..00000000000 --- a/build/darknet/x64/cfg/coco.data +++ /dev/null @@ -1,8 +0,0 @@ -classes= 80 -train = E:/MSCOCO/trainvalno5k.txt -#train = E:/MSCOCO/5k.txt -valid = E:/MSCOCO/5k.txt -names = data/coco.names -backup = backup -eval=coco - diff --git a/build/darknet/x64/cfg/combine9k.data b/build/darknet/x64/cfg/combine9k.data deleted file mode 100644 index 06a3e76aefa..00000000000 --- a/build/darknet/x64/cfg/combine9k.data +++ /dev/null @@ -1,10 +0,0 @@ -classes= 9418 -#train = /home/pjreddie/data/coco/trainvalno5k.txt -train = data/combine9k.train.list -valid = /home/pjreddie/data/imagenet/det.val.files -labels = data/9k.labels -names = data/9k.names -backup = backup/ -map = data/inet9k.map -eval = imagenet -results = results diff --git a/build/darknet/x64/cfg/crnn.train.cfg b/build/darknet/x64/cfg/crnn.train.cfg deleted file mode 100644 index e0e0b54c4c9..00000000000 --- a/build/darknet/x64/cfg/crnn.train.cfg +++ /dev/null @@ -1,52 +0,0 @@ -[net] -subdivisions=8 -inputs=256 -batch = 128 -momentum=0.9 -decay=0.001 -max_batches = 2000 -time_steps=576 -learning_rate=0.1 -policy=steps -steps=1000,1500 -scales=.1,.1 - -try_fix_nan=1 - -[connected] -output=256 -activation=leaky - -[crnn] -batch_normalize=1 -size=1 -pad=0 -output = 1024 -hidden=1024 -activation=leaky - -[crnn] -batch_normalize=1 -size=1 -pad=0 -output = 1024 -hidden=1024 -activation=leaky - -[crnn] -batch_normalize=1 -size=1 -pad=0 -output = 1024 -hidden=1024 -activation=leaky - -[connected] -output=256 -activation=leaky - -[softmax] - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/csdarknet53-omega.cfg b/build/darknet/x64/cfg/csdarknet53-omega.cfg deleted file mode 100644 index 3a3c0730f66..00000000000 --- a/build/darknet/x64/cfg/csdarknet53-omega.cfg +++ /dev/null @@ -1,762 +0,0 @@ -[net] -# Training -batch=128 -subdivisions=4 - -label_smooth_eps=0.1 - -# Testing -# batch=1 -# subdivisions=1 - -height=256 -width=256 -channels=3 -min_crop=128 -max_crop=448 - -mosaic=1 -cutmix=1 - -burn_in=1000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=1200000 -momentum=0.9 -decay=0.0005 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - - - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-7 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-10 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=mish - -[avgpool] - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[softmax] -groups=1 diff --git a/build/darknet/x64/cfg/cspx-p7-mish-omega.cfg b/build/darknet/x64/cfg/cspx-p7-mish-omega.cfg deleted file mode 100644 index 93c4aefa94c..00000000000 --- a/build/darknet/x64/cfg/cspx-p7-mish-omega.cfg +++ /dev/null @@ -1,1459 +0,0 @@ -[net] -# Training -batch=100 -subdivisions=2 - -label_smooth_eps=0.1 - -# Testing -# batch=1 -# subdivisions=1 - -height=320 -width=320 -channels=3 -min_crop=320 -max_crop=640 - -mosaic=1 -cutmix=1 - -burn_in=2000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=1200000 -#max_batches=400000 -momentum=0.9 -decay=0.0005 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=40 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-13 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-49 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-49 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1600 -size=1 -stride=1 -pad=1 -activation=mish - -[avgpool] - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[softmax] -groups=1 \ No newline at end of file diff --git a/build/darknet/x64/cfg/cspx-p7-mish.cfg b/build/darknet/x64/cfg/cspx-p7-mish.cfg deleted file mode 100644 index 01be7283680..00000000000 --- a/build/darknet/x64/cfg/cspx-p7-mish.cfg +++ /dev/null @@ -1,2604 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=8 -width=1536 -height=1536 -channels=3 -momentum=0.949 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500500 -steps=400000,450000 -#max_batches = 770500 -#steps=700000,750000 -policy=steps -scales=.1,.1 - -mosaic=1 -letter_box=1 - -### Start of Backbone ### - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=40 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-13 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-49 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-49 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -### End of backbone ### - -### Start of CSPSPP ### - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -13 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -### End of CSPSPP ### - -### Start of CSPPAN ### - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 180 ###P6 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 152 ###P5 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 124 ###P4 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 72 ###P3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1, 271 ###S4 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, 255 ###S5 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, 239 ###S6 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, 223 ###S7 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -### End of CSPPAN ### - -### Start of YOLO ### - -[route] -layers = 287 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=320 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=340 -activation=logistic - - -[yolo] -mask = 0,1,2,3 -anchors = 13,17, 22,25, 27,66, 55,41, 57,88, 112,69, 69,177, 136,138, 136,138, 287,114, 134,275, 268,248, 268,248, 232,504, 445,416, 640,640, 812,393, 477,808, 1070,908, 1408,1408 -classes=80 -num=16 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -scale_x_y = 2.0 -jitter=.1 -objectness_smooth=1 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=4.0 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -max_delta=40 -new_coords=1 - -[route] -layers = 300 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=640 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=340 -activation=logistic - -[yolo] -mask = 4,5,6,7 -anchors = 13,17, 22,25, 27,66, 55,41, 57,88, 112,69, 69,177, 136,138, 136,138, 287,114, 134,275, 268,248, 268,248, 232,504, 445,416, 640,640, 812,393, 477,808, 1070,908, 1408,1408 -classes=80 -num=16 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -scale_x_y = 2.0 -jitter=.1 -objectness_smooth=1 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=1.0 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -max_delta=40 -new_coords=1 - -[route] -layers = 313 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=340 -activation=logistic - -[yolo] -mask = 8,9,10,11 -anchors = 13,17, 22,25, 27,66, 55,41, 57,88, 112,69, 69,177, 136,138, 136,138, 287,114, 134,275, 268,248, 268,248, 232,504, 445,416, 640,640, 812,393, 477,808, 1070,908, 1408,1408 -classes=80 -num=16 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -scale_x_y = 2.0 -jitter=.1 -objectness_smooth=1 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=0.5 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -max_delta=40 -new_coords=1 - -[route] -layers = 326 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=340 -activation=logistic - -[yolo] -mask = 12,13,14,15 -anchors = 13,17, 22,25, 27,66, 55,41, 57,88, 112,69, 69,177, 136,138, 136,138, 287,114, 134,275, 268,248, 268,248, 232,504, 445,416, 640,640, 812,393, 477,808, 1070,908, 1408,1408 -classes=80 -num=16 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -scale_x_y = 2.0 -jitter=.1 -objectness_smooth=1 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=0.4 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -max_delta=40 -new_coords=1 - -[route] -layers = 339 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=340 -activation=logistic - -[yolo] -mask = 16,17,18,19 -anchors = 13,17, 22,25, 27,66, 55,41, 57,88, 112,69, 69,177, 136,138, 136,138, 287,114, 134,275, 268,248, 268,248, 232,504, 445,416, 640,640, 812,393, 477,808, 1070,908, 1408,1408 -classes=80 -num=16 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -scale_x_y = 2.0 -jitter=.1 -objectness_smooth=1 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=0.1 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -max_delta=40 -new_coords=1 - -### End of YOLO ### \ No newline at end of file diff --git a/build/darknet/x64/cfg/cspx-p7-mish_hp.cfg b/build/darknet/x64/cfg/cspx-p7-mish_hp.cfg deleted file mode 100644 index 209fa8f81cb..00000000000 --- a/build/darknet/x64/cfg/cspx-p7-mish_hp.cfg +++ /dev/null @@ -1,2638 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=16 -#width=1536 -#height=1536 -width=896 -height=896 -channels=3 -momentum=0.949 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500500 -policy=steps -steps=400000,450000 -scales=.1,.1 - -mosaic=1 -letter_box=1 - -### Start of Backbone ### - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=40 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-13 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-49 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-49 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-25 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -### End of backbone ### - -### Start of CSPSPP ### - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -13 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -### End of CSPSPP ### - -### Start of CSPPAN ### - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 180 ###P6 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 152 ###P5 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 124 ###P4 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 72 ###P3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1, 271 ###S4 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, 255 ###S5 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, 239 ###S6 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, 223 ###S7 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -### End of CSPPAN ### - -### Start of YOLO ### - -[route] -layers = 287 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=320 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -#filters=340 -filters=170 -activation=linear - -#[route] -#layers=-1 - -[yolo] -mask = 0,1 -anchors = 13,17, 31,25, 24,51, 61,45 61,45, 48,102, 119,96, 97,189, 97,189, 217,184, 171,384, 324,451, 324,451, 545,357, 616,618, 800,800 -classes=80 -num=16 -#jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -resize=1.5 -scale_x_y = 1.05 -##iou_thresh=0.213 -#cls_normalizer=1.0 -#iou_normalizer=0.07 - -jitter=.1 -#objectness_smooth=1 -##iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=4.0 - -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - -#counters_per_class = 26575, 7113, 44338, 8730, 5154, 6100, 4550, 10038, 10832, 13016, 1883, 1974, 1287, 9787, 10883, 4776, 5507, 6562, 9724, 8171, 5491, 1312, 5296, 5193, 8707, 11531, 12415, 6470, 6214, 2688, 6605, 2665, 6393, 9159, 3300, 3756, 5508, 6143, 4854, 24516, 7914, 20710, 5466, 7810, 6168, 14398, 9603, 5941, 4403, 6561, 7308, 7885, 2908, 5892, 7401, 6466, 38878, 5804, 8585, 4160, 15789, 4157, 5836, 4964, 2273, 5746, 2891, 6411, 1641, 3335, 223, 5624, 2658, 25244, 6320, 6539, 1464, 4775, 198, 1937 -#max_delta=3 - -[route] -layers = 300 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=640 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -#filters=340 -filters=255 -activation=linear - -[yolo] -mask = 1,2,3 -anchors = 13,17, 31,25, 24,51, 61,45 61,45, 48,102, 119,96, 97,189, 97,189, 217,184, 171,384, 324,451, 324,451, 545,357, 616,618, 800,800 -classes=80 -num=16 -#jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -resize=1.5 -scale_x_y = 1.05 -##iou_thresh=0.213 -#cls_normalizer=1.0 -#iou_normalizer=0.07 - -jitter=.1 -#objectness_smooth=1 -#iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=1.0 - -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - -#counters_per_class = 26575, 7113, 44338, 8730, 5154, 6100, 4550, 10038, 10832, 13016, 1883, 1974, 1287, 9787, 10883, 4776, 5507, 6562, 9724, 8171, 5491, 1312, 5296, 5193, 8707, 11531, 12415, 6470, 6214, 2688, 6605, 2665, 6393, 9159, 3300, 3756, 5508, 6143, 4854, 24516, 7914, 20710, 5466, 7810, 6168, 14398, 9603, 5941, 4403, 6561, 7308, 7885, 2908, 5892, 7401, 6466, 38878, 5804, 8585, 4160, 15789, 4157, 5836, 4964, 2273, 5746, 2891, 6411, 1641, 3335, 223, 5624, 2658, 25244, 6320, 6539, 1464, 4775, 198, 1937 -#max_delta=3 - -[route] -layers = 313 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=340 -activation=linear - -[yolo] -mask = 4,5,6,7 -anchors = 13,17, 31,25, 24,51, 61,45 61,45, 48,102, 119,96, 97,189, 97,189, 217,184, 171,384, 324,451, 324,451, 545,357, 616,618, 800,800 -classes=80 -num=16 -#jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -resize=1.5 -scale_x_y = 1.05 -##iou_thresh=0.213 -#cls_normalizer=1.0 -#iou_normalizer=0.07 - -jitter=.1 -objectness_smooth=1 -#iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=0.5 - -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - -counters_per_class = 26575, 7113, 44338, 8730, 5154, 6100, 4550, 10038, 10832, 13016, 1883, 1974, 1287, 9787, 10883, 4776, 5507, 6562, 9724, 8171, 5491, 1312, 5296, 5193, 8707, 11531, 12415, 6470, 6214, 2688, 6605, 2665, 6393, 9159, 3300, 3756, 5508, 6143, 4854, 24516, 7914, 20710, 5466, 7810, 6168, 14398, 9603, 5941, 4403, 6561, 7308, 7885, 2908, 5892, 7401, 6466, 38878, 5804, 8585, 4160, 15789, 4157, 5836, 4964, 2273, 5746, 2891, 6411, 1641, 3335, 223, 5624, 2658, 25244, 6320, 6539, 1464, 4775, 198, 1937 -max_delta=3 - -[route] -layers = 326 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=340 -activation=linear - -[yolo] -mask = 8,9,10,11 -anchors = 13,17, 31,25, 24,51, 61,45 61,45, 48,102, 119,96, 97,189, 97,189, 217,184, 171,384, 324,451, 324,451, 545,357, 616,618, 800,800 -classes=80 -num=16 -#jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -resize=1.5 -scale_x_y = 1.05 -##iou_thresh=0.213 -#cls_normalizer=1.0 -#iou_normalizer=0.07 - -jitter=.1 -objectness_smooth=1 -#iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=0.4 - -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - -counters_per_class = 26575, 7113, 44338, 8730, 5154, 6100, 4550, 10038, 10832, 13016, 1883, 1974, 1287, 9787, 10883, 4776, 5507, 6562, 9724, 8171, 5491, 1312, 5296, 5193, 8707, 11531, 12415, 6470, 6214, 2688, 6605, 2665, 6393, 9159, 3300, 3756, 5508, 6143, 4854, 24516, 7914, 20710, 5466, 7810, 6168, 14398, 9603, 5941, 4403, 6561, 7308, 7885, 2908, 5892, 7401, 6466, 38878, 5804, 8585, 4160, 15789, 4157, 5836, 4964, 2273, 5746, 2891, 6411, 1641, 3335, 223, 5624, 2658, 25244, 6320, 6539, 1464, 4775, 198, 1937 -max_delta=3 - -[route] -layers = 339 ### - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=logistic - -[sam] -from=-2 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=340 -activation=linear - -[yolo] -mask = 12,13,14,15 -anchors = 13,17, 31,25, 24,51, 61,45 61,45, 48,102, 119,96, 97,189, 97,189, 217,184, 171,384, 324,451, 324,451, 545,357, 616,618, 800,800 -classes=80 -num=16 -#jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -resize=1.5 -scale_x_y = 1.05 -##iou_thresh=0.213 -#cls_normalizer=1.0 -#iou_normalizer=0.07 - -jitter=.1 -objectness_smooth=1 -#iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=0.1 - -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - -#counters_per_class = 26575, 7113, 44338, 8730, 5154, 6100, 4550, 10038, 10832, 13016, 1883, 1974, 1287, 9787, 10883, 4776, 5507, 6562, 9724, 8171, 5491, 1312, 5296, 5193, 8707, 11531, 12415, 6470, 6214, 2688, 6605, 2665, 6393, 9159, 3300, 3756, 5508, 6143, 4854, 24516, 7914, 20710, 5466, 7810, 6168, 14398, 9603, 5941, 4403, 6561, 7308, 7885, 2908, 5892, 7401, 6466, 38878, 5804, 8585, 4160, 15789, 4157, 5836, 4964, 2273, 5746, 2891, 6411, 1641, 3335, 223, 5624, 2658, 25244, 6320, 6539, 1464, 4775, 198, 1937 -max_delta=3 - -### End of YOLO ### \ No newline at end of file diff --git a/build/darknet/x64/cfg/csresnext50-panet-spp-original-optimal.cfg b/build/darknet/x64/cfg/csresnext50-panet-spp-original-optimal.cfg deleted file mode 100644 index f0b78f973ef..00000000000 --- a/build/darknet/x64/cfg/csresnext50-panet-spp-original-optimal.cfg +++ /dev/null @@ -1,1042 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=8 -width=608 -height=608 -channels=3 -momentum=0.949 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.00261 -burn_in=1000 -max_batches = 500500 -policy=steps -steps=400000,450000 -scales=.1,.1 - -#cutmix=1 -mosaic=1 - -#19:104x104 38:52x52 65:26x26 80:13x13 for 416 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -# 1-1 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 1-2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 1-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 1-T - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -groups=32 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -# 2-1 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 2-2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 2-3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 2-T - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -# 3-1 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-3 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-4 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-5 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-T - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-24 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -groups=32 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -# 4-1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 4-2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 4-T - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-12 - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=leaky - -########################## - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -### SPP ### -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 -### End SPP ### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 65 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 38 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -########################## - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -scale_x_y = 1.2 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=256 -activation=leaky - -[route] -layers = -1, -16 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -scale_x_y = 1.1 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=512 -activation=leaky - -[route] -layers = -1, -37 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 -scale_x_y = 1.05 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 - diff --git a/build/darknet/x64/cfg/csresnext50-panet-spp.cfg b/build/darknet/x64/cfg/csresnext50-panet-spp.cfg deleted file mode 100644 index 261d35b96d7..00000000000 --- a/build/darknet/x64/cfg/csresnext50-panet-spp.cfg +++ /dev/null @@ -1,1018 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=16 -width=512 -height=512 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500500 -policy=steps -steps=400000,450000 -scales=.1,.1 - -#19:104x104 38:52x52 65:26x26 80:13x13 for 416 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -# 1-1 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 1-2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 1-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 1-T - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -groups=32 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -# 2-1 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 2-2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 2-3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 2-T - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -# 3-1 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-3 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-4 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-5 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 3-T - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-24 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -groups=32 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -# 4-1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 4-2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -groups=32 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -# 4-T - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-12 - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=leaky - -########################## - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -### SPP ### -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 -### End SPP ### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 65 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 38 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -########################## - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=256 -activation=leaky - -[route] -layers = -1, -16 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=512 -activation=leaky - -[route] -layers = -1, -37 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 diff --git a/build/darknet/x64/cfg/darknet.cfg b/build/darknet/x64/cfg/darknet.cfg deleted file mode 100644 index 60b939a38ff..00000000000 --- a/build/darknet/x64/cfg/darknet.cfg +++ /dev/null @@ -1,111 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=224 -width=224 -channels=3 -momentum=0.9 -decay=0.0005 -max_crop=320 - -learning_rate=0.1 -policy=poly -power=4 -max_batches=1600000 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 -padding=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=leaky - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/darknet19.cfg b/build/darknet/x64/cfg/darknet19.cfg deleted file mode 100644 index bf73fb7b48a..00000000000 --- a/build/darknet/x64/cfg/darknet19.cfg +++ /dev/null @@ -1,194 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=224 -width=224 -channels=3 -momentum=0.9 -decay=0.0005 -max_crop=448 - -learning_rate=0.1 -policy=poly -power=4 -max_batches=1600000 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/darknet19_448.cfg b/build/darknet/x64/cfg/darknet19_448.cfg deleted file mode 100644 index 1918a8b2d62..00000000000 --- a/build/darknet/x64/cfg/darknet19_448.cfg +++ /dev/null @@ -1,202 +0,0 @@ -[net] -#batch=128 -#subdivisions=4 -batch=1 -subdivisions=1 -height=448 -width=448 -max_crop=512 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.001 -policy=poly -power=4 -max_batches=100000 - -angle=7 -hue = .1 -saturation=.75 -exposure=.75 -aspect=.75 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/darknet53.cfg b/build/darknet/x64/cfg/darknet53.cfg deleted file mode 100644 index a1f084a943f..00000000000 --- a/build/darknet/x64/cfg/darknet53.cfg +++ /dev/null @@ -1,566 +0,0 @@ -[net] -# Training -batch=128 -subdivisions=8 - -# Testing -#batch=1 -#subdivisions=1 - -height=256 -width=256 -channels=3 -min_crop=128 -max_crop=448 - -burn_in=1000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=800000 -momentum=0.9 -decay=0.0005 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[avgpool] - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[softmax] -groups=1 - diff --git a/build/darknet/x64/cfg/darknet53_448_xnor.cfg b/build/darknet/x64/cfg/darknet53_448_xnor.cfg deleted file mode 100644 index a48ef698a47..00000000000 --- a/build/darknet/x64/cfg/darknet53_448_xnor.cfg +++ /dev/null @@ -1,619 +0,0 @@ -[net] -# Training - start training with darknet53.weights -batch=120 -subdivisions=20 - -# Testing -#batch=1 -#subdivisions=1 - -height=448 -width=448 -channels=3 -min_crop=448 -max_crop=512 - -burn_in=1000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=100000 -momentum=0.9 -decay=0.0005 - - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -xnor=1 -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -xnor=1 -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -xnor=1 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -xnor=1 -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[avgpool] - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[softmax] -groups=1 - diff --git a/build/darknet/x64/cfg/densenet201.cfg b/build/darknet/x64/cfg/densenet201.cfg deleted file mode 100644 index 5e1e7dd1fda..00000000000 --- a/build/darknet/x64/cfg/densenet201.cfg +++ /dev/null @@ -1,1954 +0,0 @@ -[net] -# Training -# batch=128 -# subdivisions=4 - -# Testing -batch=1 -subdivisions=1 - -height=256 -width=256 -max_crop=448 -channels=3 -momentum=0.9 -decay=0.0005 - -burn_in=1000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=1600000 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1,-3 - - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/efficientnet-lite3.cfg b/build/darknet/x64/cfg/efficientnet-lite3.cfg deleted file mode 100644 index e76bbe3085d..00000000000 --- a/build/darknet/x64/cfg/efficientnet-lite3.cfg +++ /dev/null @@ -1,1009 +0,0 @@ -# https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/lite/efficientnet_lite_builder.py -# (width_coefficient, depth_coefficient, resolution, dropout_rate) -# 'efficientnet-lite3': (1.2, 1.4, 280, 0.3), -# -#_DEFAULT_BLOCKS_ARGS = [ -# 'r1_k3_s11_e1_i32_o16_se0.25', 'r2_k3_s22_e6_i16_o24_se0.25', -# 'r2_k5_s22_e6_i24_o40_se0.25', 'r3_k3_s22_e6_i40_o80_se0.25', -# 'r3_k5_s11_e6_i80_o112_se0.25', 'r4_k5_s22_e6_i112_o192_se0.25', -# 'r1_k3_s11_e6_i192_o320_se0.25', -#] - -[net] -# Training -batch=120 -subdivisions=6 -height=288 -width=288 -channels=3 -momentum=0.9 -decay=0.0005 -max_crop=320 - -cutmix=1 -mosaic=1 -label_smooth_eps=0.1 - -burn_in=1000 -learning_rate=0.256 -policy=step -step=10000 -scale=0.96 -max_batches=1600000 -momentum=0.9 -decay=0.00005 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - - -### CONV1 - 1 (1) -# conv1 -[convolutional] -filters=40 #32 -size=3 -pad=1 -stride=2 -batch_normalize=1 -activation=relu6 - - -### CONV2 - MBConv1 - 1 (2) -# conv2_1_expand -[convolutional] -filters=40 #32 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv2_1_dwise -[convolutional] -groups=40 #32 -filters=40 #32 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv2_1_linear -[convolutional] -filters=16 #16 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV2 - MBConv1 - 2 (2) -# conv2_1_expand -[convolutional] -filters=40 #32 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv2_1_dwise -[convolutional] -groups=40 #32 -filters=40 #32 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv2_1_linear -[convolutional] -filters=16 #16 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV3 - MBConv6 - 1 (3) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_3_1 -[shortcut] -from=-5 -activation=linear - -# conv2_2_expand -[convolutional] -filters=112 #96 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv2_2_dwise -[convolutional] -groups=112 #96 -filters=112 #96 -size=3 -pad=1 -stride=2 -batch_normalize=1 -activation=relu6 - -# conv2_2_linear -[convolutional] -filters=32 #24 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV3 - MBConv6 - 2 (3) -# conv3_1_expand -[convolutional] -filters=176 #144 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv3_1_dwise -[convolutional] -groups=176 #144 -filters=176 #144 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv3_1_linear -[convolutional] -filters=32 #24 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV3 - MBConv6 - 3 (3) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_3_1 -[shortcut] -from=-5 -activation=linear - -# conv3_1_expand -[convolutional] -filters=176 #144 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv3_1_dwise -[convolutional] -groups=176 #144 -filters=176 #144 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv3_1_linear -[convolutional] -filters=32 #24 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV4 - MBConv6 - 1 (3) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_3_1 -[shortcut] -from=-5 -activation=linear - -# conv_3_2_expand -[convolutional] -filters=176 #144 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_3_2_dwise -[convolutional] -groups=176 #144 -filters=176 #144 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=relu6 - -# conv_3_2_linear -[convolutional] -filters=48 #40 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV4 - MBConv6 - 2 (3) -# conv_4_1_expand -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_4_1_dwise -[convolutional] -groups=232 #192 -filters=232 #192 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_4_1_linear -[convolutional] -filters=48 #40 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV4 - MBConv6 - 3 (3) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_4_2 -[shortcut] -from=-5 -activation=linear - -# conv_4_1_expand -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_4_1_dwise -[convolutional] -groups=232 #192 -filters=232 #192 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_4_1_linear -[convolutional] -filters=48 #40 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - - -### CONV5 - MBConv6 - 1 (5) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_4_2 -[shortcut] -from=-5 -activation=linear - -# conv_4_3_expand -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_4_3_dwise -[convolutional] -groups=232 #192 -filters=232 #192 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_4_3_linear -[convolutional] -filters=96 #80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV5 - MBConv6 - 2 (5) -# conv_4_4_expand -[convolutional] -filters=464 #384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_4_4_dwise -[convolutional] -groups=464 #384 -filters=464 #384 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_4_4_linear -[convolutional] -filters=96 #80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV5 - MBConv6 - 3 (5) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_4_4 -[shortcut] -from=-5 -activation=linear - -# conv_4_5_expand -[convolutional] -filters=464 #384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_4_5_dwise -[convolutional] -groups=464 #384 -filters=464 #384 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_4_5_linear -[convolutional] -filters=96 #80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV5 - MBConv6 - 4 (5) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_4_4 -[shortcut] -from=-5 -activation=linear - -# conv_4_5_expand -[convolutional] -filters=464 #384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_4_5_dwise -[convolutional] -groups=464 #384 -filters=464 #384 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_4_5_linear -[convolutional] -filters=96 #80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV5 - MBConv6 - 5 (5) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_4_4 -[shortcut] -from=-5 -activation=linear - -# conv_4_5_expand -[convolutional] -filters=464 #384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_4_5_dwise -[convolutional] -groups=464 #384 -filters=464 #384 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_4_5_linear -[convolutional] -filters=96 #80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV6 - MBConv6 - 1 (5) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_4_6 -[shortcut] -from=-5 -activation=linear - -# conv_4_7_expand -[convolutional] -filters=464 #384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_4_7_dwise -[convolutional] -groups=464 #384 -filters=464 #384 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=relu6 - -# conv_4_7_linear -[convolutional] -filters=136 #112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV6 - MBConv6 - 2 (5) -# conv_5_1_expand -[convolutional] -filters=688 #576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_5_1_dwise -[convolutional] -groups=688 #576 -filters=688 #576 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_5_1_linear -[convolutional] -filters=136 #112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV6 - MBConv6 - 3 (5) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_5_1 -[shortcut] -from=-5 -activation=linear - -# conv_5_2_expand -[convolutional] -filters=688 #576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_5_2_dwise -[convolutional] -groups=688 #576 -filters=688 #576 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_5_2_linear -[convolutional] -filters=136 #112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV6 - MBConv6 - 4 (5) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_5_1 -[shortcut] -from=-5 -activation=linear - -# conv_5_2_expand -[convolutional] -filters=688 #576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_5_2_dwise -[convolutional] -groups=688 #576 -filters=688 #576 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_5_2_linear -[convolutional] -filters=136 #112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV6 - MBConv6 - 5 (5) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_5_1 -[shortcut] -from=-5 -activation=linear - -# conv_5_2_expand -[convolutional] -filters=688 #576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_5_2_dwise -[convolutional] -groups=688 #576 -filters=688 #576 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_5_2_linear -[convolutional] -filters=136 #112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV7 - MBConv6 - 1 (6) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_5_2 -[shortcut] -from=-5 -activation=linear - -# conv_5_3_expand -[convolutional] -filters=688 #576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_5_3_dwise -[convolutional] -groups=688 #576 -filters=688 #576 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=relu6 - - -# conv_5_3_linear -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 2 (6) -# conv_6_1_expand -[convolutional] -filters=1152 #960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_6_1_dwise -[convolutional] -groups=1152 #960 -filters=1152 #960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_6_1_linear -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 3 (6) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_6_1 -[shortcut] -from=-5 -activation=linear - -# conv_6_2_expand -[convolutional] -filters=1152 #960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_6_2_dwise -[convolutional] -groups=1152 #960 -filters=1152 #960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_6_2_linear -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 4 (6) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_6_1 -[shortcut] -from=-5 -activation=linear - -# conv_6_2_expand -[convolutional] -filters=1152 #960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_6_2_dwise -[convolutional] -groups=1152 #960 -filters=1152 #960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_6_2_linear -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 5 (6) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_6_1 -[shortcut] -from=-5 -activation=linear - -# conv_6_2_expand -[convolutional] -filters=1152 #960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_6_2_dwise -[convolutional] -groups=1152 #960 -filters=1152 #960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - -# conv_6_2_linear -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 6 (6) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_6_1 -[shortcut] -from=-5 -activation=linear - -# conv_6_2_expand -[convolutional] -filters=1152 #960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_6_2_dwise -[convolutional] -groups=1152 #960 -filters=1152 #960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - - - -# conv_6_2_linear -[convolutional] -filters=232 #192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV8 - MBConv6 - 1 (1) -# dropout only before residual connection -[dropout] -probability=.3 - -# block_6_2 -[shortcut] -from=-5 -activation=linear - -# conv_6_3_expand -[convolutional] -filters=1152 #960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - -# conv_6_3_dwise -[convolutional] -groups=1152 #960 -filters=1152 #960 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=relu6 - - - -# conv_6_3_linear -[convolutional] -filters=384 #320 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - - -### CONV9 - Conv2d 1x1 -# conv_6_4 -[convolutional] -filters=1536 #1280 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=relu6 - - -[avgpool] - -[dropout] -probability=.3 - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=0 -activation=linear - -[softmax] -groups=1 - -#[cost] -#type=sse - diff --git a/build/darknet/x64/cfg/efficientnet_b0.cfg b/build/darknet/x64/cfg/efficientnet_b0.cfg deleted file mode 100644 index 70f780692a6..00000000000 --- a/build/darknet/x64/cfg/efficientnet_b0.cfg +++ /dev/null @@ -1,1009 +0,0 @@ -[net] -# Training -batch=120 -subdivisions=4 -# Testing -#batch=1 -#subdivisions=1 -height=224 -width=224 -channels=3 -momentum=0.9 -decay=0.0005 -max_crop=256 -#mixup=4 -blur=1 -cutmix=1 -mosaic=1 - -burn_in=1000 -#burn_in=100 -learning_rate=0.256 -policy=poly -power=4 -max_batches=800000 -momentum=0.9 -decay=0.00005 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - - -### CONV1 - 1 (1) -# conv1 -[convolutional] -filters=32 -size=3 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -### CONV2 - MBConv1 - 1 (1) -# conv2_1_expand -[convolutional] -filters=32 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv2_1_dwise -[convolutional] -groups=32 -filters=32 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=4 (recommended r=16) -[convolutional] -filters=8 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=32 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv2_1_linear -[convolutional] -filters=16 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV3 - MBConv6 - 1 (2) -# conv2_2_expand -[convolutional] -filters=96 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv2_2_dwise -[convolutional] -groups=96 -filters=96 -size=3 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=8 (recommended r=16) -[convolutional] -filters=16 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=96 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv2_2_linear -[convolutional] -filters=24 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV3 - MBConv6 - 2 (2) -# conv3_1_expand -[convolutional] -filters=144 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv3_1_dwise -[convolutional] -groups=144 -filters=144 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=8 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=144 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv3_1_linear -[convolutional] -filters=24 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV4 - MBConv6 - 1 (2) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_3_1 -[shortcut] -from=-9 -activation=linear - -# conv_3_2_expand -[convolutional] -filters=144 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_3_2_dwise -[convolutional] -groups=144 -filters=144 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=8 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=144 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_3_2_linear -[convolutional] -filters=40 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV4 - MBConv6 - 2 (2) -# conv_4_1_expand -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_1_dwise -[convolutional] -groups=192 -filters=192 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=16 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=192 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_1_linear -[convolutional] -filters=40 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - - -### CONV5 - MBConv6 - 1 (3) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_4_2 -[shortcut] -from=-9 -activation=linear - -# conv_4_3_expand -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_3_dwise -[convolutional] -groups=192 -filters=192 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=16 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=192 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_3_linear -[convolutional] -filters=80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV5 - MBConv6 - 2 (3) -# conv_4_4_expand -[convolutional] -filters=384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_4_dwise -[convolutional] -groups=384 -filters=384 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=24 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=384 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_4_linear -[convolutional] -filters=80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV5 - MBConv6 - 3 (3) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_4_4 -[shortcut] -from=-9 -activation=linear - -# conv_4_5_expand -[convolutional] -filters=384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_5_dwise -[convolutional] -groups=384 -filters=384 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=24 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=384 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_5_linear -[convolutional] -filters=80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV6 - MBConv6 - 1 (3) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_4_6 -[shortcut] -from=-9 -activation=linear - -# conv_4_7_expand -[convolutional] -filters=384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_7_dwise -[convolutional] -groups=384 -filters=384 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=24 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=384 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_7_linear -[convolutional] -filters=112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV6 - MBConv6 - 2 (3) -# conv_5_1_expand -[convolutional] -filters=576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_5_1_dwise -[convolutional] -groups=576 -filters=576 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=32 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=576 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_5_1_linear -[convolutional] -filters=112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV6 - MBConv6 - 3 (3) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_5_1 -[shortcut] -from=-9 -activation=linear - -# conv_5_2_expand -[convolutional] -filters=576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_5_2_dwise -[convolutional] -groups=576 -filters=576 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=32 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=576 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_5_2_linear -[convolutional] -filters=112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 1 (4) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_5_2 -[shortcut] -from=-9 -activation=linear - -# conv_5_3_expand -[convolutional] -filters=576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_5_3_dwise -[convolutional] -groups=576 -filters=576 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=32 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=576 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_5_3_linear -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 2 (4) -# conv_6_1_expand -[convolutional] -filters=960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_6_1_dwise -[convolutional] -groups=960 -filters=960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=64 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=960 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_6_1_linear -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 3 (4) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_6_1 -[shortcut] -from=-9 -activation=linear - -# conv_6_2_expand -[convolutional] -filters=960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_6_2_dwise -[convolutional] -groups=960 -filters=960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=64 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=960 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_6_2_linear -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 4 (4) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_6_1 -[shortcut] -from=-9 -activation=linear - -# conv_6_2_expand -[convolutional] -filters=960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_6_2_dwise -[convolutional] -groups=960 -filters=960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=64 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=960 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_6_2_linear -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV8 - MBConv6 - 1 (1) -# dropout only before residual connection -[dropout] -probability=.2 - -# block_6_2 -[shortcut] -from=-9 -activation=linear - -# conv_6_3_expand -[convolutional] -filters=960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_6_3_dwise -[convolutional] -groups=960 -filters=960 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=64 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=960 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_6_3_linear -[convolutional] -filters=320 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV9 - Conv2d 1x1 -# conv_6_4 -[convolutional] -filters=1280 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - - -[avgpool] - -[dropout] -probability=.2 - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=0 -activation=linear - -[softmax] -groups=1 - -#[cost] -#type=sse - diff --git a/build/darknet/x64/cfg/enet-coco.cfg b/build/darknet/x64/cfg/enet-coco.cfg deleted file mode 100644 index b530ed360b3..00000000000 --- a/build/darknet/x64/cfg/enet-coco.cfg +++ /dev/null @@ -1,1072 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=8 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -### CONV1 - 1 (1) -# conv1 -[convolutional] -filters=32 -size=3 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -### CONV2 - MBConv1 - 1 (1) -# conv2_1_expand -[convolutional] -filters=32 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv2_1_dwise -[convolutional] -groups=32 -filters=32 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=4 (recommended r=16) -[convolutional] -filters=8 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=32 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv2_1_linear -[convolutional] -filters=16 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV3 - MBConv6 - 1 (2) -# conv2_2_expand -[convolutional] -filters=96 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv2_2_dwise -[convolutional] -groups=96 -filters=96 -size=3 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=8 (recommended r=16) -[convolutional] -filters=16 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=96 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv2_2_linear -[convolutional] -filters=24 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV3 - MBConv6 - 2 (2) -# conv3_1_expand -[convolutional] -filters=144 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv3_1_dwise -[convolutional] -groups=144 -filters=144 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=8 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=144 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv3_1_linear -[convolutional] -filters=24 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV4 - MBConv6 - 1 (2) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_3_1 -[shortcut] -from=-9 -activation=linear - -# conv_3_2_expand -[convolutional] -filters=144 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_3_2_dwise -[convolutional] -groups=144 -filters=144 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=8 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=144 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_3_2_linear -[convolutional] -filters=40 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV4 - MBConv6 - 2 (2) -# conv_4_1_expand -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_1_dwise -[convolutional] -groups=192 -filters=192 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=16 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=192 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_1_linear -[convolutional] -filters=40 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - - -### CONV5 - MBConv6 - 1 (3) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_4_2 -[shortcut] -from=-9 -activation=linear - -# conv_4_3_expand -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_3_dwise -[convolutional] -groups=192 -filters=192 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=16 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=192 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_3_linear -[convolutional] -filters=80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV5 - MBConv6 - 2 (3) -# conv_4_4_expand -[convolutional] -filters=384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_4_dwise -[convolutional] -groups=384 -filters=384 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=24 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=384 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_4_linear -[convolutional] -filters=80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV5 - MBConv6 - 3 (3) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_4_4 -[shortcut] -from=-9 -activation=linear - -# conv_4_5_expand -[convolutional] -filters=384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_5_dwise -[convolutional] -groups=384 -filters=384 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=24 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=384 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_5_linear -[convolutional] -filters=80 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV6 - MBConv6 - 1 (3) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_4_6 -[shortcut] -from=-9 -activation=linear - -# conv_4_7_expand -[convolutional] -filters=384 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_4_7_dwise -[convolutional] -groups=384 -filters=384 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=24 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=384 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_4_7_linear -[convolutional] -filters=112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV6 - MBConv6 - 2 (3) -# conv_5_1_expand -[convolutional] -filters=576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_5_1_dwise -[convolutional] -groups=576 -filters=576 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=32 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=576 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_5_1_linear -[convolutional] -filters=112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV6 - MBConv6 - 3 (3) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_5_1 -[shortcut] -from=-9 -activation=linear - -# conv_5_2_expand -[convolutional] -filters=576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_5_2_dwise -[convolutional] -groups=576 -filters=576 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=32 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=576 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_5_2_linear -[convolutional] -filters=112 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 1 (4) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_5_2 -[shortcut] -from=-9 -activation=linear - -# conv_5_3_expand -[convolutional] -filters=576 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_5_3_dwise -[convolutional] -groups=576 -filters=576 -size=5 -pad=1 -stride=2 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=32 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=576 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_5_3_linear -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 2 (4) -# conv_6_1_expand -[convolutional] -filters=960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_6_1_dwise -[convolutional] -groups=960 -filters=960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=64 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=960 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_6_1_linear -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 3 (4) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_6_1 -[shortcut] -from=-9 -activation=linear - -# conv_6_2_expand -[convolutional] -filters=960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_6_2_dwise -[convolutional] -groups=960 -filters=960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=64 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=960 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_6_2_linear -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV7 - MBConv6 - 4 (4) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_6_1 -[shortcut] -from=-9 -activation=linear - -# conv_6_2_expand -[convolutional] -filters=960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_6_2_dwise -[convolutional] -groups=960 -filters=960 -size=5 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=64 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=960 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_6_2_linear -[convolutional] -filters=192 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - - -### CONV8 - MBConv6 - 1 (1) -# dropout only before residual connection -[dropout] -probability=.0 - -# block_6_2 -[shortcut] -from=-9 -activation=linear - -# conv_6_3_expand -[convolutional] -filters=960 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -# conv_6_3_dwise -[convolutional] -groups=960 -filters=960 -size=3 -stride=1 -pad=1 -batch_normalize=1 -activation=swish - - -#squeeze-n-excitation -[avgpool] - -# squeeze ratio r=16 (recommended r=16) -[convolutional] -filters=64 -size=1 -stride=1 -activation=swish - -# excitation -[convolutional] -filters=960 -size=1 -stride=1 -activation=logistic - -# multiply channels -[scale_channels] -from=-4 - - -# conv_6_3_linear -[convolutional] -filters=320 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=linear - - -### CONV9 - Conv2d 1x1 -# conv_6_4 -[convolutional] -filters=1280 -size=1 -stride=1 -pad=0 -batch_normalize=1 -activation=swish - -########################## - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -activation=leaky -from=-2 - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - - -[yolo] -mask = 3,4,5 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=0 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[shortcut] -activation=leaky -from=90 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -activation=leaky -from=-3 - -[shortcut] -activation=leaky -from=90 - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 1,2,3 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=0 - diff --git a/build/darknet/x64/cfg/extraction.cfg b/build/darknet/x64/cfg/extraction.cfg deleted file mode 100644 index 94e106754ef..00000000000 --- a/build/darknet/x64/cfg/extraction.cfg +++ /dev/null @@ -1,206 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=224 -width=224 -max_crop=320 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.1 -policy=poly -power=4 -max_batches=1600000 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=192 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=leaky - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/extraction.conv.cfg b/build/darknet/x64/cfg/extraction.conv.cfg deleted file mode 100644 index 2a7d09ec80f..00000000000 --- a/build/darknet/x64/cfg/extraction.conv.cfg +++ /dev/null @@ -1,179 +0,0 @@ -[net] -batch=1 -subdivisions=1 -height=256 -width=256 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.5 -policy=poly -power=6 -max_batches=500000 - -[convolutional] -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[avgpool] - -[connected] -output=1000 -activation=leaky - -[softmax] -groups=1 - diff --git a/build/darknet/x64/cfg/extraction22k.cfg b/build/darknet/x64/cfg/extraction22k.cfg deleted file mode 100644 index 4cec6da9605..00000000000 --- a/build/darknet/x64/cfg/extraction22k.cfg +++ /dev/null @@ -1,209 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=224 -width=224 -max_crop=320 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.01 -max_batches = 0 -policy=steps -steps=444000,590000,970000 -scales=.5,.2,.1 - -#policy=sigmoid -#gamma=.00008 -#step=100000 -#max_batches=200000 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=192 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=3 -stride=1 -pad=1 -activation=leaky - -[avgpool] - -[connected] -output=21842 -activation=leaky - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/go.test.cfg b/build/darknet/x64/cfg/go.test.cfg deleted file mode 100644 index 6b92d335cd1..00000000000 --- a/build/darknet/x64/cfg/go.test.cfg +++ /dev/null @@ -1,131 +0,0 @@ -[net] -batch=1 -subdivisions=1 -height=19 -width=19 -channels=1 -momentum=0.9 -decay=0.0005 - -learning_rate=0.1 -policy=poly -power=4 -max_batches=400000 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - -[convolutional] -filters=192 -size=3 -stride=1 -pad=1 -activation=relu -batch_normalize=1 - - -[convolutional] -filters=1 -size=1 -stride=1 -pad=1 -activation=linear - -[softmax] - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/gru.cfg b/build/darknet/x64/cfg/gru.cfg deleted file mode 100644 index f9a06999e62..00000000000 --- a/build/darknet/x64/cfg/gru.cfg +++ /dev/null @@ -1,34 +0,0 @@ -[net] -subdivisions=1 -inputs=256 -batch = 1 -momentum=0.9 -decay=0.001 -time_steps=1 -learning_rate=0.5 - -policy=poly -power=4 -max_batches=2000 - -[gru] -batch_normalize=1 -output = 1024 - -[gru] -batch_normalize=1 -output = 1024 - -[gru] -batch_normalize=1 -output = 1024 - -[connected] -output=256 -activation=linear - -[softmax] - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/imagenet1k.data b/build/darknet/x64/cfg/imagenet1k.data deleted file mode 100644 index b01f2facec9..00000000000 --- a/build/darknet/x64/cfg/imagenet1k.data +++ /dev/null @@ -1,9 +0,0 @@ -classes=1000 -train = data/imagenet1k.train.list -#train = data/inet.val.list -valid = data/inet.val.list -backup = backup -labels = data/imagenet.labels.list -names = data/imagenet.shortnames.list -top=5 - diff --git a/build/darknet/x64/cfg/imagenet22k.dataset b/build/darknet/x64/cfg/imagenet22k.dataset deleted file mode 100644 index 920785d603b..00000000000 --- a/build/darknet/x64/cfg/imagenet22k.dataset +++ /dev/null @@ -1,8 +0,0 @@ -classes=21842 -train = /data/imagenet/imagenet22k.train.list -valid = /data/imagenet/imagenet22k.valid.list -backup = /home/pjreddie/backup/ -labels = data/imagenet.labels.list -names = data/imagenet.shortnames.list -top = 5 - diff --git a/build/darknet/x64/cfg/imagenet9k.hierarchy.dataset b/build/darknet/x64/cfg/imagenet9k.hierarchy.dataset deleted file mode 100644 index 41fb71b0655..00000000000 --- a/build/darknet/x64/cfg/imagenet9k.hierarchy.dataset +++ /dev/null @@ -1,9 +0,0 @@ -classes=9418 -train = data/9k.train.list -valid = /data/imagenet/imagenet1k.valid.list -leaves = data/imagenet1k.labels -backup = /home/pjreddie/backup/ -labels = data/9k.labels -names = data/9k.names -top=5 - diff --git a/build/darknet/x64/cfg/jnet-conv.cfg b/build/darknet/x64/cfg/jnet-conv.cfg deleted file mode 100644 index 056f82aa6e2..00000000000 --- a/build/darknet/x64/cfg/jnet-conv.cfg +++ /dev/null @@ -1,118 +0,0 @@ -[net] -batch=1 -subdivisions=1 -height=10 -width=10 -channels=3 -learning_rate=0.01 -momentum=0.9 -decay=0.0005 - -[convolutional] -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -stride=2 -size=2 - -[convolutional] -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -stride=2 -size=2 - -[convolutional] -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -stride=2 -size=2 - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -stride=2 -size=2 - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -stride=2 -size=2 - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - diff --git a/build/darknet/x64/cfg/lstm.train.cfg b/build/darknet/x64/cfg/lstm.train.cfg deleted file mode 100644 index f0d4721d414..00000000000 --- a/build/darknet/x64/cfg/lstm.train.cfg +++ /dev/null @@ -1,35 +0,0 @@ -[net] -subdivisions=8 -inputs=256 -batch = 128 -momentum=0.9 -decay=0.001 -max_batches = 2000 -time_steps=576 -learning_rate=0.5 -policy=steps -burn_in=10 -steps=1000,1500 -scales=.1,.1 - -[lstm] -batch_normalize=1 -output = 1024 - -[lstm] -batch_normalize=1 -output = 1024 - -[lstm] -batch_normalize=1 -output = 1024 - -[connected] -output=256 -activation=leaky - -[softmax] - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/openimages.data b/build/darknet/x64/cfg/openimages.data deleted file mode 100644 index fa80e5ab7d8..00000000000 --- a/build/darknet/x64/cfg/openimages.data +++ /dev/null @@ -1,8 +0,0 @@ -classes= 601 -train = /home/pjreddie/data/openimsv4/openimages.train.list -#valid = coco_testdev -valid = data/coco_val_5k.list -names = data/openimages.names -backup = /home/pjreddie/backup/ -eval=coco - diff --git a/build/darknet/x64/cfg/resnet101.cfg b/build/darknet/x64/cfg/resnet101.cfg deleted file mode 100644 index 48dffbf2ec5..00000000000 --- a/build/darknet/x64/cfg/resnet101.cfg +++ /dev/null @@ -1,990 +0,0 @@ -[net] -# Training -batch=128 -subdivisions=2 - -# Testing -#batch=1 -#subdivisions=1 - -height=256 -width=256 -channels=3 -min_crop=128 -max_crop=448 - -burn_in=1000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=800000 -momentum=0.9 -decay=0.0005 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - - - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -# Conv 4 -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -#Conv 5 -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - - - - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/resnet152.cfg b/build/darknet/x64/cfg/resnet152.cfg deleted file mode 100644 index d5fe90948a2..00000000000 --- a/build/darknet/x64/cfg/resnet152.cfg +++ /dev/null @@ -1,1463 +0,0 @@ -[net] -# Training -# batch=128 -# subdivisions=8 - -# Testing -batch=1 -subdivisions=1 - -height=256 -width=256 -max_crop=448 -channels=3 -momentum=0.9 -decay=0.0005 - -burn_in=1000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=1600000 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -# Conv 4 -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -#Conv 5 -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - - - - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/resnet152_trident.cfg b/build/darknet/x64/cfg/resnet152_trident.cfg deleted file mode 100644 index 1ac8cc73a78..00000000000 --- a/build/darknet/x64/cfg/resnet152_trident.cfg +++ /dev/null @@ -1,2177 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=64 -width=608 -height=608 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - - -learning_rate=0.001 -burn_in=1000 -max_batches = 10000 - -policy=sgdr -sgdr_cycle=1000 -sgdr_mult=2 -steps=4000,6000,8000,9000 -#scales=1, 1, 0.1, 0.1 - - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-2 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -# Conv 4 -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-2 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - - -### TridentNet - large objects - Start - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -## Conv 5 -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-2 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -dilation=3 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=2048 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=24 -activation=linear - -[yolo] -mask = 8,9,10,11 -anchors = 8,8, 10,13, 16,30, 33,23, 32,32, 30,61, 62,45, 59,119, 80,80, 116,90, 156,198, 373,326 -classes=1 -num=12 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=0 - -### TridentNet - large objects - End - - - - - - - -### TridentNet - medium objects - Start - -[route] -layers = 165 - -[convolutional] -share_index=166 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=167 -dilation=2 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=168 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=170 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=171 -dilation=2 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=172 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=174 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=175 -dilation=2 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=176 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=178 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=179 -dilation=2 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=180 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=182 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=183 -dilation=2 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=184 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=186 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=187 -dilation=2 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=188 -dilation=2 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -## Conv 5 -[convolutional] -share_index=190 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=191 -dilation=2 -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -share_index=192 -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-2 -activation=leaky - -[convolutional] -share_index=194 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=195 -dilation=2 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=196 -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=198 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=199 -dilation=2 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=200 -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 49 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=24 -activation=linear - -[yolo] -mask = 4,5,6,7 -anchors = 8,8, 10,13, 16,30, 33,23, 32,32, 30,61, 62,45, 64,64, 59,119, 116,90, 156,198, 373,326 -classes=1 -num=12 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=0 - -### TridentNet - medium objects - End - - - - - - - - - - - -### TridentNet - small objects - Start - -[route] -layers = 165 - -[convolutional] -share_index=166 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=167 -dilation=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=168 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=170 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=171 -dilation=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=172 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=174 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=175 -dilation=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=176 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=178 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=179 -dilation=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=180 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=182 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=183 -dilation=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=184 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=186 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=187 -dilation=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=188 -dilation=1 -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -## Conv 5 -[convolutional] -share_index=190 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=191 -dilation=1 -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -share_index=192 -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-2 -activation=leaky - -[convolutional] -share_index=194 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=195 -dilation=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=196 -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -share_index=198 -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=199 -dilation=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -share_index=200 -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=512 -activation=leaky - -[upsample] -stride=4 - -[route] -layers = -1, 17 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=24 -activation=linear - -[yolo] -mask = 0,1,2,3 -anchors = 8,8, 10,13, 16,30, 33,23, 32,32, 30,61, 62,45, 64,64, 59,119, 116,90, 156,198, 373,326 -classes=1 -num=12 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=0 - -### TridentNet - small objects - End - diff --git a/build/darknet/x64/cfg/resnet50.cfg b/build/darknet/x64/cfg/resnet50.cfg deleted file mode 100644 index bfe69b18e3b..00000000000 --- a/build/darknet/x64/cfg/resnet50.cfg +++ /dev/null @@ -1,511 +0,0 @@ -[net] -# Training -# batch=128 -# subdivisions=4 - -# Testing -batch=1 -subdivisions=1 - -height=256 -width=256 -max_crop=448 -channels=3 -momentum=0.9 -decay=0.0005 - -burn_in=1000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=1600000 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -# Conv 4 -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -#Conv 5 -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - - - - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/resnext152-32x4d.cfg b/build/darknet/x64/cfg/resnext152-32x4d.cfg deleted file mode 100644 index 48279fd28eb..00000000000 --- a/build/darknet/x64/cfg/resnext152-32x4d.cfg +++ /dev/null @@ -1,1562 +0,0 @@ -[net] -# Training -# batch=128 -# subdivisions=16 - -# Testing -batch=1 -subdivisions=1 - -height=256 -width=256 -channels=3 -min_crop=128 -max_crop=448 - -burn_in=1000 -learning_rate=0.1 -policy=poly -power=4 -max_batches=800000 -momentum=0.9 -decay=0.0005 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - - -[convolutional] -batch_normalize=1 -filters=64 -size=7 -stride=2 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=2048 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=4096 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=4096 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -groups = 32 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=4096 -size=1 -stride=1 -pad=1 -activation=linear - -[shortcut] -from=-4 -activation=leaky - - - - -[avgpool] - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[softmax] -groups=1 - diff --git a/build/darknet/x64/cfg/rnn.cfg b/build/darknet/x64/cfg/rnn.cfg deleted file mode 100644 index 68c032d27f9..00000000000 --- a/build/darknet/x64/cfg/rnn.cfg +++ /dev/null @@ -1,40 +0,0 @@ -[net] -subdivisions=1 -inputs=256 -batch = 1 -momentum=0.9 -decay=0.001 -max_batches = 2000 -time_steps=1 -learning_rate=0.1 -policy=steps -steps=1000,1500 -scales=.1,.1 - -[rnn] -batch_normalize=1 -output = 1024 -hidden=1024 -activation=leaky - -[rnn] -batch_normalize=1 -output = 1024 -hidden=1024 -activation=leaky - -[rnn] -batch_normalize=1 -output = 1024 -hidden=1024 -activation=leaky - -[connected] -output=256 -activation=leaky - -[softmax] - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/rnn.train.cfg b/build/darknet/x64/cfg/rnn.train.cfg deleted file mode 100644 index 3c63956a249..00000000000 --- a/build/darknet/x64/cfg/rnn.train.cfg +++ /dev/null @@ -1,40 +0,0 @@ -[net] -subdivisions=8 -inputs=256 -batch = 128 -momentum=0.9 -decay=0.001 -max_batches = 2000 -time_steps=576 -learning_rate=0.1 -policy=steps -steps=1000,1500 -scales=.1,.1 - -[rnn] -batch_normalize=1 -output = 1024 -hidden=1024 -activation=leaky - -[rnn] -batch_normalize=1 -output = 1024 -hidden=1024 -activation=leaky - -[rnn] -batch_normalize=1 -output = 1024 -hidden=1024 -activation=leaky - -[connected] -output=256 -activation=leaky - -[softmax] - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/strided.cfg b/build/darknet/x64/cfg/strided.cfg deleted file mode 100644 index a52700b4303..00000000000 --- a/build/darknet/x64/cfg/strided.cfg +++ /dev/null @@ -1,185 +0,0 @@ -[net] -batch=128 -subdivisions=4 -height=256 -width=256 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.01 -policy=steps -scales=.1,.1,.1 -steps=200000,300000,400000 -max_batches=800000 - - -[crop] -crop_height=224 -crop_width=224 -flip=1 -angle=0 -saturation=1 -exposure=1 -shift=.2 - -[convolutional] -filters=64 -size=7 -stride=2 -pad=1 -activation=ramp - -[convolutional] -filters=192 -size=3 -stride=2 -pad=1 -activation=ramp - -[convolutional] -filters=128 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=256 -size=3 -stride=2 -pad=1 -activation=ramp - -[convolutional] -filters=128 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=128 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=512 -size=3 -stride=2 -pad=1 -activation=ramp - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=256 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=1024 -size=3 -stride=2 -pad=1 -activation=ramp - -[convolutional] -filters=512 -size=1 -stride=1 -pad=1 -activation=ramp - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=ramp - -[maxpool] -size=3 -stride=2 - -[connected] -output=4096 -activation=ramp - -[dropout] -probability=0.5 - -[connected] -output=1000 -activation=ramp - -[softmax] - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/t1.test.cfg b/build/darknet/x64/cfg/t1.test.cfg deleted file mode 100644 index b3628114e04..00000000000 --- a/build/darknet/x64/cfg/t1.test.cfg +++ /dev/null @@ -1,117 +0,0 @@ -[net] -batch=1 -subdivisions=1 -height=224 -width=224 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.0005 -policy=steps -steps=200,400,600,20000,30000 -scales=2.5,2,2,.1,.1 -max_batches = 40000 - -[convolutional] -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[connected] -output= 1470 -activation=linear - -[detection] -classes=20 -coords=4 -rescore=1 -side=7 -num=2 -softmax=0 -sqrt=1 -jitter=.2 - -object_scale=1 -noobject_scale=.5 -class_scale=1 -coord_scale=5 - diff --git a/build/darknet/x64/cfg/tiny-yolo-voc.cfg b/build/darknet/x64/cfg/tiny-yolo-voc.cfg deleted file mode 100644 index ab2c066a216..00000000000 --- a/build/darknet/x64/cfg/tiny-yolo-voc.cfg +++ /dev/null @@ -1,134 +0,0 @@ -[net] -batch=64 -subdivisions=8 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -max_batches = 40200 -policy=steps -steps=-1,100,20000,30000 -scales=.1,10,.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=125 -activation=linear - -[region] -anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 -bias_match=1 -classes=20 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/tiny-yolo.cfg b/build/darknet/x64/cfg/tiny-yolo.cfg deleted file mode 100644 index 5580098b45f..00000000000 --- a/build/darknet/x64/cfg/tiny-yolo.cfg +++ /dev/null @@ -1,134 +0,0 @@ -[net] -batch=64 -subdivisions=8 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -max_batches = 120000 -policy=steps -steps=-1,100,80000,100000 -scales=.1,10,.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=425 -activation=linear - -[region] -anchors = 0.738768,0.874946, 2.42204,2.65704, 4.30971,7.04493, 10.246,4.59428, 12.6868,11.8741 -bias_match=1 -classes=80 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/tiny-yolo_xnor.cfg b/build/darknet/x64/cfg/tiny-yolo_xnor.cfg deleted file mode 100644 index 42a96309db0..00000000000 --- a/build/darknet/x64/cfg/tiny-yolo_xnor.cfg +++ /dev/null @@ -1,148 +0,0 @@ -[net] -batch=64 -subdivisions=8 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -max_batches = 40200 -policy=steps -steps=-1,100,20000,30000 -scales=.1,10,.1,.1 - -[convolutional] -#xnor=1 -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -xnor=1 -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=425 -activation=linear - -[region] -anchors = 0.738768,0.874946, 2.42204,2.65704, 4.30971,7.04493, 10.246,4.59428, 12.6868,11.8741 -bias_match=1 -classes=80 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/tiny.cfg b/build/darknet/x64/cfg/tiny.cfg deleted file mode 100644 index 99c260366d7..00000000000 --- a/build/darknet/x64/cfg/tiny.cfg +++ /dev/null @@ -1,172 +0,0 @@ -[net] -batch=128 -subdivisions=1 -height=224 -width=224 -channels=3 -momentum=0.9 -decay=0.0005 -max_crop=320 - -learning_rate=0.1 -policy=poly -power=4 -max_batches=1600000 - -angle=7 -hue=.1 -saturation=.75 -exposure=.75 -aspect=.75 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=16 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=16 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1000 -size=1 -stride=1 -pad=1 -activation=linear - -[avgpool] - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/vgg-16.cfg b/build/darknet/x64/cfg/vgg-16.cfg deleted file mode 100644 index 2b6f7029b70..00000000000 --- a/build/darknet/x64/cfg/vgg-16.cfg +++ /dev/null @@ -1,153 +0,0 @@ -[net] -batch=128 -subdivisions=4 -height=256 -width=256 -channels=3 -learning_rate=0.00001 -momentum=0.9 -decay=0.0005 - -[crop] -crop_height=224 -crop_width=224 -flip=1 -exposure=1 -saturation=1 -angle=0 - -[convolutional] -filters=64 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=64 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=128 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=128 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[connected] -output=4096 -activation=relu - -[dropout] -probability=.5 - -[connected] -output=4096 -activation=relu - -[dropout] -probability=.5 - -[connected] -output=1000 -activation=linear - -[softmax] -groups=1 - -[cost] -type=sse - diff --git a/build/darknet/x64/cfg/vgg-conv.cfg b/build/darknet/x64/cfg/vgg-conv.cfg deleted file mode 100644 index e173e28bff6..00000000000 --- a/build/darknet/x64/cfg/vgg-conv.cfg +++ /dev/null @@ -1,123 +0,0 @@ -[net] -batch=1 -subdivisions=1 -width=112 -height=112 -#width=224 -#height=224 -channels=3 -learning_rate=0.00001 -momentum=0.9 -decay=0.0005 - -[convolutional] -filters=64 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=64 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=128 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=128 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=256 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[convolutional] -filters=512 -size=3 -stride=1 -pad=1 -activation=relu - -[maxpool] -size=2 -stride=2 - diff --git a/build/darknet/x64/cfg/voc.data b/build/darknet/x64/cfg/voc.data deleted file mode 100644 index d6775870f65..00000000000 --- a/build/darknet/x64/cfg/voc.data +++ /dev/null @@ -1,7 +0,0 @@ -classes= 20 -train = data/train_voc.txt -valid = data/2007_test.txt -#difficult = data/difficult_2007_test.txt -names = data/voc.names -backup = backup/ - diff --git a/build/darknet/x64/cfg/writing.cfg b/build/darknet/x64/cfg/writing.cfg deleted file mode 100644 index 1ed899bcd63..00000000000 --- a/build/darknet/x64/cfg/writing.cfg +++ /dev/null @@ -1,41 +0,0 @@ -[net] -batch=128 -subdivisions=2 -height=256 -width=256 -channels=3 -learning_rate=0.00000001 -momentum=0.9 -decay=0.0005 -seen=0 - -[convolutional] -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=1 -size=3 -stride=1 -pad=1 -activation=logistic - -[cost] - diff --git a/build/darknet/x64/cfg/yolo-voc.2.0.cfg b/build/darknet/x64/cfg/yolo-voc.2.0.cfg deleted file mode 100644 index ceb3f2acf0b..00000000000 --- a/build/darknet/x64/cfg/yolo-voc.2.0.cfg +++ /dev/null @@ -1,244 +0,0 @@ -[net] -batch=64 -subdivisions=8 -height=416 -width=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.0001 -max_batches = 45000 -policy=steps -steps=100,25000,35000 -scales=10,.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[route] -layers=-9 - -[reorg] -stride=2 - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=125 -activation=linear - -[region] -anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 -bias_match=1 -classes=20 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=0 diff --git a/build/darknet/x64/cfg/yolo-voc.cfg b/build/darknet/x64/cfg/yolo-voc.cfg deleted file mode 100644 index dbf2de281c1..00000000000 --- a/build/darknet/x64/cfg/yolo-voc.cfg +++ /dev/null @@ -1,258 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=8 -height=416 -width=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 80200 -policy=steps -steps=40000,60000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[route] -layers=-9 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=64 -activation=leaky - -[reorg] -stride=2 - -[route] -layers=-1,-4 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=125 -activation=linear - - -[region] -anchors = 1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071 -bias_match=1 -classes=20 -coords=4 -num=5 -softmax=1 -jitter=.3 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/yolo.2.0.cfg b/build/darknet/x64/cfg/yolo.2.0.cfg deleted file mode 100644 index fda339a2b00..00000000000 --- a/build/darknet/x64/cfg/yolo.2.0.cfg +++ /dev/null @@ -1,244 +0,0 @@ -[net] -batch=1 -subdivisions=1 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -max_batches = 120000 -policy=steps -steps=-1,100,80000,100000 -scales=.1,10,.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[route] -layers=-9 - -[reorg] -stride=2 - -[route] -layers=-1,-3 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=425 -activation=linear - -[region] -anchors = 0.738768,0.874946, 2.42204,2.65704, 4.30971,7.04493, 10.246,4.59428, 12.6868,11.8741 -bias_match=1 -classes=80 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=0 diff --git a/build/darknet/x64/cfg/yolo.cfg b/build/darknet/x64/cfg/yolo.cfg deleted file mode 100644 index 7001dfa58a9..00000000000 --- a/build/darknet/x64/cfg/yolo.cfg +++ /dev/null @@ -1,258 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=8 -height=416 -width=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[route] -layers=-9 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=64 -activation=leaky - -[reorg] -stride=2 - -[route] -layers=-1,-4 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=425 -activation=linear - - -[region] -anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 -bias_match=1 -classes=80 -coords=4 -num=5 -softmax=1 -jitter=.3 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/yolo9000.cfg b/build/darknet/x64/cfg/yolo9000.cfg deleted file mode 100644 index e745f78a6e3..00000000000 --- a/build/darknet/x64/cfg/yolo9000.cfg +++ /dev/null @@ -1,218 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=8 -batch=1 -subdivisions=1 -height=544 -width=544 -channels=3 -momentum=0.9 -decay=0.0005 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -hue=.1 -saturation=.75 -exposure=.75 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -filters=28269 -size=1 -stride=1 -pad=1 -activation=linear - -[region] -anchors = 0.77871, 1.14074, 3.00525, 4.31277, 9.22725, 9.61974 -bias_match=1 -classes=9418 -coords=4 -num=3 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -thresh = .6 -absolute=1 -random=1 - -tree=data/9k.tree -map = data/coco9k.map diff --git a/build/darknet/x64/cfg/yolov2-tiny-voc.cfg b/build/darknet/x64/cfg/yolov2-tiny-voc.cfg deleted file mode 100644 index c4c127cdd35..00000000000 --- a/build/darknet/x64/cfg/yolov2-tiny-voc.cfg +++ /dev/null @@ -1,138 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=2 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -max_batches = 40200 -policy=steps -steps=-1,100,20000,30000 -scales=.1,10,.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=125 -activation=linear - -[region] -anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 -bias_match=1 -classes=20 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/yolov2-tiny.cfg b/build/darknet/x64/cfg/yolov2-tiny.cfg deleted file mode 100644 index 81d0ac45d6d..00000000000 --- a/build/darknet/x64/cfg/yolov2-tiny.cfg +++ /dev/null @@ -1,139 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=2 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=425 -activation=linear - -[region] -anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 -bias_match=1 -classes=80 -coords=4 -num=5 -softmax=1 -jitter=.2 -rescore=0 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/yolov2-voc.cfg b/build/darknet/x64/cfg/yolov2-voc.cfg deleted file mode 100644 index dbf2de281c1..00000000000 --- a/build/darknet/x64/cfg/yolov2-voc.cfg +++ /dev/null @@ -1,258 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=8 -height=416 -width=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 80200 -policy=steps -steps=40000,60000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[route] -layers=-9 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=64 -activation=leaky - -[reorg] -stride=2 - -[route] -layers=-1,-4 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=125 -activation=linear - - -[region] -anchors = 1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071 -bias_match=1 -classes=20 -coords=4 -num=5 -softmax=1 -jitter=.3 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/yolov2.cfg b/build/darknet/x64/cfg/yolov2.cfg deleted file mode 100644 index 2a0cd98fbd0..00000000000 --- a/build/darknet/x64/cfg/yolov2.cfg +++ /dev/null @@ -1,258 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=8 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - - -####### - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[route] -layers=-9 - -[convolutional] -batch_normalize=1 -size=1 -stride=1 -pad=1 -filters=64 -activation=leaky - -[reorg] -stride=2 - -[route] -layers=-1,-4 - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=425 -activation=linear - - -[region] -anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828 -bias_match=1 -classes=80 -coords=4 -num=5 -softmax=1 -jitter=.3 -rescore=1 - -object_scale=5 -noobject_scale=1 -class_scale=1 -coord_scale=1 - -absolute=1 -thresh = .6 -random=1 diff --git a/build/darknet/x64/cfg/yolov3-openimages.cfg b/build/darknet/x64/cfg/yolov3-openimages.cfg deleted file mode 100644 index 65d241a74c4..00000000000 --- a/build/darknet/x64/cfg/yolov3-openimages.cfg +++ /dev/null @@ -1,789 +0,0 @@ -[net] -# Testing - batch=1 - subdivisions=1 -# Training -batch=64 -subdivisions=16 -width=608 -height=608 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=5000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -###################### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=1818 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=601 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 61 - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=1818 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=601 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 36 - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=1818 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=601 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - diff --git a/build/darknet/x64/cfg/yolov3-spp.cfg b/build/darknet/x64/cfg/yolov3-spp.cfg deleted file mode 100644 index 4ad2a052d88..00000000000 --- a/build/darknet/x64/cfg/yolov3-spp.cfg +++ /dev/null @@ -1,822 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=16 -width=608 -height=608 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -###################### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -### SPP ### -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 - -### End SPP ### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 61 - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 36 - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - diff --git a/build/darknet/x64/cfg/yolov3-tiny-prn.cfg b/build/darknet/x64/cfg/yolov3-tiny-prn.cfg deleted file mode 100644 index 215162e973b..00000000000 --- a/build/darknet/x64/cfg/yolov3-tiny-prn.cfg +++ /dev/null @@ -1,199 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=8 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -activation=leaky -from=-3 - -########### - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -activation=leaky -from=-2 - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - - -[yolo] -mask = 3,4,5 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[shortcut] -activation=leaky -from=8 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -activation=leaky -from=-3 - -[shortcut] -activation=leaky -from=8 - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 1,2,3 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 diff --git a/build/darknet/x64/cfg/yolov3-tiny.cfg b/build/darknet/x64/cfg/yolov3-tiny.cfg deleted file mode 100644 index cfca3cfa641..00000000000 --- a/build/darknet/x64/cfg/yolov3-tiny.cfg +++ /dev/null @@ -1,182 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=2 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - - -[yolo] -mask = 3,4,5 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 8 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 diff --git a/build/darknet/x64/cfg/yolov3-tiny_3l.cfg b/build/darknet/x64/cfg/yolov3-tiny_3l.cfg deleted file mode 100644 index 76aaa0d9587..00000000000 --- a/build/darknet/x64/cfg/yolov3-tiny_3l.cfg +++ /dev/null @@ -1,227 +0,0 @@ -[net] -# Testing -# batch=1 -# subdivisions=1 -# Training -batch=64 -subdivisions=16 -width=608 -height=608 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 200000 -policy=steps -steps=180000,190000 -scales=.1,.1 - - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=21 -activation=linear - - - -[yolo] -mask = 6,7,8 -anchors = 4,7, 7,15, 13,25, 25,42, 41,67, 75,94, 91,162, 158,205, 250,332 -classes=2 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 8 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=21 -activation=linear - -[yolo] -mask = 3,4,5 -anchors = 4,7, 7,15, 13,25, 25,42, 41,67, 75,94, 91,162, 158,205, 250,332 -classes=2 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - - -[route] -layers = -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 6 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=21 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 4,7, 7,15, 13,25, 25,42, 41,67, 75,94, 91,162, 158,205, 250,332 -classes=2 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 \ No newline at end of file diff --git a/build/darknet/x64/cfg/yolov3-tiny_obj.cfg b/build/darknet/x64/cfg/yolov3-tiny_obj.cfg deleted file mode 100644 index 8308e442517..00000000000 --- a/build/darknet/x64/cfg/yolov3-tiny_obj.cfg +++ /dev/null @@ -1,182 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=2 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - - -[yolo] -mask = 3,4,5 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 8 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 diff --git a/build/darknet/x64/cfg/yolov3-tiny_occlusion_track.cfg b/build/darknet/x64/cfg/yolov3-tiny_occlusion_track.cfg deleted file mode 100644 index 2ef25370eea..00000000000 --- a/build/darknet/x64/cfg/yolov3-tiny_occlusion_track.cfg +++ /dev/null @@ -1,218 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=8 -subdivisions=4 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -track=1 -time_steps=20 -augment_speed=3 - -learning_rate=0.001 -burn_in=1000 -max_batches = 10000 -policy=steps -steps=9000,9500 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - - -[crnn] -batch_normalize=1 -size=3 -pad=1 -output=512 -hidden=256 -activation=leaky - -#[shortcut] -#from=-2 -#activation=linear - -########### - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=18 -activation=linear - - - -[yolo] -mask = 3,4,5 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=1 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=0 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 8 - -[crnn] -batch_normalize=1 -size=3 -pad=1 -output=256 -hidden=128 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - - -[convolutional] -size=1 -stride=1 -pad=1 -filters=18 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=1 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=0 diff --git a/build/darknet/x64/cfg/yolov3-tiny_xnor.cfg b/build/darknet/x64/cfg/yolov3-tiny_xnor.cfg deleted file mode 100644 index 725ce079c37..00000000000 --- a/build/darknet/x64/cfg/yolov3-tiny_xnor.cfg +++ /dev/null @@ -1,197 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=2 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=16 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=2 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[maxpool] -size=2 -stride=1 - -[convolutional] -xnor=1 -bin_output=1 -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -########### - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - - -[yolo] -mask = 3,4,5 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -xnor=1 -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 8 - -[convolutional] -xnor=1 -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 diff --git a/build/darknet/x64/cfg/yolov3-voc.cfg b/build/darknet/x64/cfg/yolov3-voc.cfg deleted file mode 100644 index 3f3e8dfb31b..00000000000 --- a/build/darknet/x64/cfg/yolov3-voc.cfg +++ /dev/null @@ -1,785 +0,0 @@ -[net] -# Testing - batch=1 - subdivisions=1 -# Training -# batch=64 -# subdivisions=16 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 50200 -policy=steps -steps=40000,45000 -scales=.1,.1 - - - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -###################### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=75 -activation=linear - -[yolo] -mask = 6,7,8 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=20 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 61 - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=75 -activation=linear - -[yolo] -mask = 3,4,5 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=20 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -random=1 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 36 - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=75 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=20 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -random=1 - diff --git a/build/darknet/x64/cfg/yolov3-voc.yolov3-giou-40.cfg b/build/darknet/x64/cfg/yolov3-voc.yolov3-giou-40.cfg deleted file mode 100644 index b56f8a5d698..00000000000 --- a/build/darknet/x64/cfg/yolov3-voc.yolov3-giou-40.cfg +++ /dev/null @@ -1,808 +0,0 @@ -[net] -# Testing -# batch=1 -# subdivisions=1 -# Training -batch=64 -subdivisions=16 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -## single gpu -learning_rate=0.001 -burn_in=1000 -max_batches = 100400 - -## 2x -#learning_rate=0.0005 -#burn_in=2000 -#max_batches = 100400 -#max_batches = 200800 - -## 4x -#learning_rate=0.00025 -#burn_in=4000 -#max_batches = 50200 -##max_batches = 200800 - -policy=steps -steps=40000,45000 -scales=.1,.1 - - - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -###################### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=75 -activation=linear - -[yolo] -mask = 6,7,8 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=20 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -random=1 -iou_normalizer=0.25 -cls_normalizer=1.0 -iou_loss=giou - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 61 - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=75 -activation=linear - -[yolo] -mask = 3,4,5 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=20 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -random=1 -iou_normalizer=0.25 -cls_normalizer=1.0 -iou_loss=giou - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 36 - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=75 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=20 -num=9 -jitter=.3 -ignore_thresh = .5 -truth_thresh = 1 -random=1 -iou_normalizer=0.25 -cls_normalizer=1.0 -iou_loss=giou - diff --git a/build/darknet/x64/cfg/yolov3.cfg b/build/darknet/x64/cfg/yolov3.cfg deleted file mode 100644 index 4a0ecc3320e..00000000000 --- a/build/darknet/x64/cfg/yolov3.cfg +++ /dev/null @@ -1,789 +0,0 @@ -[net] -# Testing -batch=1 -subdivisions=1 -# Training -# batch=64 -# subdivisions=16 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -###################### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 61 - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 36 - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - diff --git a/build/darknet/x64/cfg/yolov3.coco-giou-12.cfg b/build/darknet/x64/cfg/yolov3.coco-giou-12.cfg deleted file mode 100644 index f3fd72db0b1..00000000000 --- a/build/darknet/x64/cfg/yolov3.coco-giou-12.cfg +++ /dev/null @@ -1,806 +0,0 @@ -[net] -# Testing -# batch=1 -# subdivisions=1 -# Training -batch=64 -subdivisions=16 -width=608 -height=608 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -## single gpu -learning_rate=0.001 -burn_in=1000 -max_batches = 550400 - -## 2 gpu -#learning_rate=0.0005 -#burn_in=2000 -#max_batches = 500200 - -## 4 gpu -#learning_rate=0.00025 -#burn_in=4000 -#max_batches = 500200 -###max_batches = 2000800 - -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -###################### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 -iou_normalizer=0.5 -iou_loss=giou - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 61 - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 -iou_normalizer=0.5 -iou_loss=giou - - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 36 - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 -iou_normalizer=0.5 -iou_loss=giou diff --git a/build/darknet/x64/cfg/yolov3_5l.cfg b/build/darknet/x64/cfg/yolov3_5l.cfg deleted file mode 100644 index fec157e0a52..00000000000 --- a/build/darknet/x64/cfg/yolov3_5l.cfg +++ /dev/null @@ -1,968 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=16 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=1 -pad=1 -activation=leaky - -[shortcut] -from=-3 -activation=linear - -###################### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 12,13,14 -anchors = 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=15 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 61 - - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 9,10,11 -anchors = 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=15 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 36 - - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=15 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - - -############### - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 11 - - - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=15 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - - - - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 4 - - - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=64 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=64 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=64 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 4,4, 5,5, 6,6, 7,7, 8,8, 9,9, 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=15 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 - diff --git a/build/darknet/x64/cfg/yolov4-csp.cfg b/build/darknet/x64/cfg/yolov4-csp.cfg deleted file mode 100644 index 691ec03b04a..00000000000 --- a/build/darknet/x64/cfg/yolov4-csp.cfg +++ /dev/null @@ -1,1279 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=8 -width=512 -height=512 -channels=3 -momentum=0.949 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500500 -policy=steps -steps=400000,450000 -scales=.1,.1 - -mosaic=1 - -letter_box=1 - -ema_alpha=0.9998 - -#optimized_memory=1 - -#23:104x104 54:52x52 85:26x26 104:13x13 for 416 - - - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=mish - -#[convolutional] -#batch_normalize=1 -#filters=64 -#size=1 -#stride=1 -#pad=1 -#activation=mish - -#[route] -#layers = -2 - -#[convolutional] -#batch_normalize=1 -#filters=64 -#size=1 -#stride=1 -#pad=1 -#activation=mish - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -#[convolutional] -#batch_normalize=1 -#filters=64 -#size=1 -#stride=1 -#pad=1 -#activation=mish - -#[route] -#layers = -1,-7 - -#[convolutional] -#batch_normalize=1 -#filters=64 -#size=1 -#stride=1 -#pad=1 -#activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-10 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=mish - -########################## - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -### SPP ### -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 -### End SPP ### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=mish - -[route] -layers = -1, -13 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 79 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=mish - -[route] -layers = -1, -6 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 48 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=128 -activation=mish - -[route] -layers = -1, -6 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -########################## - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=logistic - - -[yolo] -mask = 0,1,2 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.1 -scale_x_y = 2.0 -objectness_smooth=0 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=4.0 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -new_coords=1 -max_delta=5 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=256 -activation=mish - -[route] -layers = -1, -20 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=mish - -[route] -layers = -1,-6 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=logistic - - -[yolo] -mask = 3,4,5 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.1 -scale_x_y = 2.0 -objectness_smooth=1 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=1.0 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -new_coords=1 -max_delta=5 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=512 -activation=mish - -[route] -layers = -1, -49 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=mish - -[route] -layers = -1,-6 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=logistic - - -[yolo] -mask = 6,7,8 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.1 -scale_x_y = 2.0 -objectness_smooth=1 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=0.4 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -new_coords=1 -max_delta=2 diff --git a/build/darknet/x64/cfg/yolov4-custom.cfg b/build/darknet/x64/cfg/yolov4-custom.cfg deleted file mode 100644 index 32516bdc120..00000000000 --- a/build/darknet/x64/cfg/yolov4-custom.cfg +++ /dev/null @@ -1,1160 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=16 -width=608 -height=608 -channels=3 -momentum=0.949 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500500 -policy=steps -steps=400000,450000 -scales=.1,.1 - -#cutmix=1 -mosaic=1 - -#:104x104 54:52x52 85:26x26 104:13x13 for 416 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-7 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-10 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=mish -stopbackward=800 - -########################## - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -### SPP ### -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 -### End SPP ### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 85 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 54 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -########################## - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -scale_x_y = 1.2 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 -max_delta=5 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=256 -activation=leaky - -[route] -layers = -1, -16 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -scale_x_y = 1.1 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 -max_delta=5 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=512 -activation=leaky - -[route] -layers = -1, -37 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 -scale_x_y = 1.05 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 -max_delta=5 - diff --git a/build/darknet/x64/cfg/yolov4-tiny-3l.cfg b/build/darknet/x64/cfg/yolov4-tiny-3l.cfg deleted file mode 100644 index 116407066a3..00000000000 --- a/build/darknet/x64/cfg/yolov4-tiny-3l.cfg +++ /dev/null @@ -1,332 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=1 -width=608 -height=608 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.00261 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -################################## - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - - -[yolo] -mask = 6,7,8 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -scale_x_y = 1.05 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -ignore_thresh = .7 -truth_thresh = 1 -random=0 -resize=1.5 -nms_kind=greedynms -beta_nms=0.6 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 23 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 3,4,5 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -scale_x_y = 1.05 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -ignore_thresh = .7 -truth_thresh = 1 -random=0 -resize=1.5 -nms_kind=greedynms -beta_nms=0.6 - - -[route] -layers = -3 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 15 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -scale_x_y = 1.05 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -ignore_thresh = .7 -truth_thresh = 1 -random=0 -resize=1.5 -nms_kind=greedynms -beta_nms=0.6 - diff --git a/build/darknet/x64/cfg/yolov4-tiny-custom.cfg b/build/darknet/x64/cfg/yolov4-tiny-custom.cfg deleted file mode 100644 index 5c83be0e19c..00000000000 --- a/build/darknet/x64/cfg/yolov4-tiny-custom.cfg +++ /dev/null @@ -1,281 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=1 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.00261 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -################################## - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - - -[yolo] -mask = 3,4,5 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -scale_x_y = 1.05 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -ignore_thresh = .7 -truth_thresh = 1 -random=0 -resize=1.5 -nms_kind=greedynms -beta_nms=0.6 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 23 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 0,1,2 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -scale_x_y = 1.05 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -ignore_thresh = .7 -truth_thresh = 1 -random=0 -resize=1.5 -nms_kind=greedynms -beta_nms=0.6 diff --git a/build/darknet/x64/cfg/yolov4-tiny.cfg b/build/darknet/x64/cfg/yolov4-tiny.cfg deleted file mode 100644 index d990b5134d8..00000000000 --- a/build/darknet/x64/cfg/yolov4-tiny.cfg +++ /dev/null @@ -1,294 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=1 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.00261 -burn_in=1000 - -max_batches = 2000200 -policy=steps -steps=1600000,1800000 -scales=.1,.1 - - -#weights_reject_freq=1001 -#ema_alpha=0.9998 -#equidistant_point=1000 -#num_sigmas_reject_badlabels=3 -#badlabels_rejection_percentage=0.2 - - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -################################## - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - - -[yolo] -mask = 3,4,5 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -scale_x_y = 1.05 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -ignore_thresh = .7 -truth_thresh = 1 -random=0 -resize=1.5 -nms_kind=greedynms -beta_nms=0.6 -#new_coords=1 -#scale_x_y = 2.0 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 23 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - -[yolo] -mask = 1,2,3 -anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 -classes=80 -num=6 -jitter=.3 -scale_x_y = 1.05 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -ignore_thresh = .7 -truth_thresh = 1 -random=0 -resize=1.5 -nms_kind=greedynms -beta_nms=0.6 -#new_coords=1 -#scale_x_y = 2.0 diff --git a/build/darknet/x64/cfg/yolov4-tiny_contrastive.cfg b/build/darknet/x64/cfg/yolov4-tiny_contrastive.cfg deleted file mode 100644 index 1fed0433cf0..00000000000 --- a/build/darknet/x64/cfg/yolov4-tiny_contrastive.cfg +++ /dev/null @@ -1,452 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=2 -width=416 -height=416 -channels=3 -momentum=0.9 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -contrastive=1 -contrastive_jit_flip=1 -contrastive_color=0 - -learning_rate=0.00261 -burn_in=1000 -max_batches = 500200 -policy=steps -steps=400000,450000 -scales=.1,.1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers=-1 -groups=2 -group_id=1 - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1,-2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -6,-1 - -[maxpool] -size=2 -stride=2 - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - -################################## - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -#[conv_lstm] -#batch_normalize=1 -#size=3 -#pad=1 -#output=128 -#groups=1 -#peephole=0 -#bottleneck=1 -##time_normalizer=0.5 -#lstm_activation=tanh -#activation=leaky - - -########### - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=leaky - - -########### to [yolo-3] - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 23 - -########### - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -#[conv_lstm] -#batch_normalize=1 -#size=3 -#pad=1 -#output=128 -#groups=1 -#peephole=0 -#bottleneck=1 -##time_normalizer=0.5 -#lstm_activation=tanh -#activation=leaky - -########### - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -########### to [yolo-2] - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = -1, 15 - -########### - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=leaky - -#[conv_lstm] -#batch_normalize=1 -#size=3 -#pad=1 -#output=64 -#groups=1 -#peephole=0 -#bottleneck=1 -##time_normalizer=0.5 -#lstm_activation=tanh -#activation=leaky - -########### - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[route] -layers= 0 -onlyforward=1 - -[local_avgpool] -size=4 -stride=4 - -[route] -layers= -1,-3 -onlyforward=1 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -# Contrastive embeddings -[convolutional] -batch_normalize=1 -filters=1152 -size=1 -stride=1 -pad=1 -#activation=tanh -#activation=leaky -activation=linear - -[route] -layers= -9 -#onlyforward=1 - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=765 -activation=linear - - - -[yolo] -mask = 0,1,2,3,4,5,6,7,8 -anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 -classes=80 -num=9 -jitter=.3 -scale_x_y = 1.05 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -ignore_thresh = .7 -truth_thresh = 1 -random=0 -resize=1.5 -nms_kind=greedynms -beta_nms=0.6 -max_delta=5 -embedding_layer = -4 - -track_history_size = 20 -sim_thresh = 0.7 -dets_for_show = 2 -dets_for_track = 8 -track_ciou_norm = 0.2 - -[route] -layers= -5 - - -[contrastive] -classes=1 -temperature=1.0 -yolo_layer= -2 -cls_normalizer=1.0 -max_delta=10 diff --git a/build/darknet/x64/cfg/yolov4.cfg b/build/darknet/x64/cfg/yolov4.cfg deleted file mode 100644 index a7be12b3088..00000000000 --- a/build/darknet/x64/cfg/yolov4.cfg +++ /dev/null @@ -1,1158 +0,0 @@ -[net] -batch=64 -subdivisions=8 -# Training -#width=512 -#height=512 -width=608 -height=608 -channels=3 -momentum=0.949 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.0013 -burn_in=1000 -max_batches = 500500 -policy=steps -steps=400000,450000 -scales=.1,.1 - -#cutmix=1 -mosaic=1 - -#:104x104 54:52x52 85:26x26 104:13x13 for 416 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=32 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-7 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=64 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=64 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-10 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=128 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=256 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-28 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1024 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=512 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-16 - -[convolutional] -batch_normalize=1 -filters=1024 -size=1 -stride=1 -pad=1 -activation=mish - -########################## - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -### SPP ### -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 -### End SPP ### - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 85 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[upsample] -stride=2 - -[route] -layers = 54 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=128 -size=1 -stride=1 -pad=1 -activation=leaky - -########################## - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=256 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 0,1,2 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -scale_x_y = 1.2 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 -max_delta=5 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=256 -activation=leaky - -[route] -layers = -1, -16 - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=256 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=512 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 3,4,5 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -scale_x_y = 1.1 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 -max_delta=5 - - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=512 -activation=leaky - -[route] -layers = -1, -37 - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -batch_normalize=1 -filters=512 -size=1 -stride=1 -pad=1 -activation=leaky - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1024 -activation=leaky - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=linear - - -[yolo] -mask = 6,7,8 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.3 -ignore_thresh = .7 -truth_thresh = 1 -random=1 -scale_x_y = 1.05 -iou_thresh=0.213 -cls_normalizer=1.0 -iou_normalizer=0.07 -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 -max_delta=5 - diff --git a/build/darknet/x64/cfg/yolov4x-mish.cfg b/build/darknet/x64/cfg/yolov4x-mish.cfg deleted file mode 100644 index 2ff854f6dcc..00000000000 --- a/build/darknet/x64/cfg/yolov4x-mish.cfg +++ /dev/null @@ -1,1436 +0,0 @@ -[net] -# Testing -#batch=1 -#subdivisions=1 -# Training -batch=64 -subdivisions=8 -width=640 -height=640 -channels=3 -momentum=0.949 -decay=0.0005 -angle=0 -saturation = 1.5 -exposure = 1.5 -hue=.1 - -learning_rate=0.001 -burn_in=1000 -max_batches = 500500 -policy=steps -steps=400000,450000 -scales=.1,.1 - -mosaic=1 - -letter_box=1 - -#optimized_memory=1 - -[convolutional] -batch_normalize=1 -filters=32 -size=3 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=40 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -# Downsample - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=80 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=80 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-13 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-34 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-34 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -# Downsample - -[convolutional] -batch_normalize=1 -filters=1280 -size=3 -stride=2 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=3 -stride=1 -pad=1 -activation=mish - -[shortcut] -from=-3 -activation=linear - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1,-19 - -[convolutional] -batch_normalize=1 -filters=1280 -size=1 -stride=1 -pad=1 -activation=mish - -########################## 6 0 6 6 3 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -### SPP ### -[maxpool] -stride=1 -size=5 - -[route] -layers=-2 - -[maxpool] -stride=1 -size=9 - -[route] -layers=-4 - -[maxpool] -stride=1 -size=13 - -[route] -layers=-1,-3,-5,-6 -### End SPP ### - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -15 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 94 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[upsample] -stride=2 - -[route] -layers = 57 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -1, -3 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=160 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=160 -activation=mish - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=160 -activation=mish - -[route] -layers = -1, -8 - -[convolutional] -batch_normalize=1 -filters=160 -size=1 -stride=1 -pad=1 -activation=mish -stopbackward=800 - -########################## - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=logistic - - -[yolo] -mask = 0,1,2 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.1 -scale_x_y = 2.0 -objectness_smooth=0 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=4.0 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -new_coords=1 -max_delta=5 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1, -22 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=320 -activation=mish - -[route] -layers = -1,-8 - -[convolutional] -batch_normalize=1 -filters=320 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=logistic - - -[yolo] -mask = 3,4,5 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.1 -scale_x_y = 2.0 -objectness_smooth=1 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=1.0 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -new_coords=1 -max_delta=5 - -[route] -layers = -4 - -[convolutional] -batch_normalize=1 -size=3 -stride=2 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1, -55 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[route] -layers = -2 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=640 -activation=mish - -[route] -layers = -1,-8 - -[convolutional] -batch_normalize=1 -filters=640 -size=1 -stride=1 -pad=1 -activation=mish - -[convolutional] -batch_normalize=1 -size=3 -stride=1 -pad=1 -filters=1280 -activation=mish - -[convolutional] -size=1 -stride=1 -pad=1 -filters=255 -activation=logistic - - -[yolo] -mask = 6,7,8 -anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 -classes=80 -num=9 -jitter=.1 -scale_x_y = 2.0 -objectness_smooth=1 -ignore_thresh = .7 -truth_thresh = 1 -#random=1 -resize=1.5 -iou_thresh=0.2 -iou_normalizer=0.05 -cls_normalizer=0.5 -obj_normalizer=0.4 -iou_loss=ciou -nms_kind=diounms -beta_nms=0.6 -new_coords=1 -max_delta=2 diff --git a/build/darknet/x64/darknet.py b/build/darknet/x64/darknet.py deleted file mode 100644 index bb0ee183688..00000000000 --- a/build/darknet/x64/darknet.py +++ /dev/null @@ -1,311 +0,0 @@ -#!python3 -""" -Python 3 wrapper for identifying objects in images - -Requires DLL compilation - -Both the GPU and no-GPU version should be compiled; the no-GPU version should be renamed "yolo_cpp_dll_nogpu.dll". - -On a GPU system, you can force CPU evaluation by any of: - -- Set global variable DARKNET_FORCE_CPU to True -- Set environment variable CUDA_VISIBLE_DEVICES to -1 -- Set environment variable "FORCE_CPU" to "true" - -Directly viewing or returning bounding-boxed images requires scikit-image to be installed (`pip install scikit-image`) - -Original *nix 2.7: https://github.com/pjreddie/darknet/blob/0f110834f4e18b30d5f101bf8f1724c34b7b83db/python/darknet.py -Windows Python 2.7 version: https://github.com/AlexeyAB/darknet/blob/fc496d52bf22a0bb257300d3c79be9cd80e722cb/build/darknet/x64/darknet.py - -@author: Philip Kahn -@date: 20180503 -""" -from ctypes import * -import math -import random -import os - - -class BOX(Structure): - _fields_ = [("x", c_float), - ("y", c_float), - ("w", c_float), - ("h", c_float)] - - -class DETECTION(Structure): - _fields_ = [("bbox", BOX), - ("classes", c_int), - ("prob", POINTER(c_float)), - ("mask", POINTER(c_float)), - ("objectness", c_float), - ("sort_class", c_int), - ("uc", POINTER(c_float)), - ("points", c_int), - ("embeddings", POINTER(c_float)), - ("embedding_size", c_int), - ("sim", c_float), - ("track_id", c_int)] - -class DETNUMPAIR(Structure): - _fields_ = [("num", c_int), - ("dets", POINTER(DETECTION))] - - -class IMAGE(Structure): - _fields_ = [("w", c_int), - ("h", c_int), - ("c", c_int), - ("data", POINTER(c_float))] - - -class METADATA(Structure): - _fields_ = [("classes", c_int), - ("names", POINTER(c_char_p))] - - -def network_width(net): - return lib.network_width(net) - - -def network_height(net): - return lib.network_height(net) - - -def bbox2points(bbox): - """ - From bounding box yolo format - to corner points cv2 rectangle - """ - x, y, w, h = bbox - xmin = int(round(x - (w / 2))) - xmax = int(round(x + (w / 2))) - ymin = int(round(y - (h / 2))) - ymax = int(round(y + (h / 2))) - return xmin, ymin, xmax, ymax - - -def class_colors(names): - """ - Create a dict with one random BGR color for each - class name - """ - return {name: ( - random.randint(0, 255), - random.randint(0, 255), - random.randint(0, 255)) for name in names} - - -def load_network(config_file, data_file, weights, batch_size=1): - """ - load model description and weights from config files - args: - config_file (str): path to .cfg model file - data_file (str): path to .data model file - weights (str): path to weights - returns: - network: trained model - class_names - class_colors - """ - network = load_net_custom( - config_file.encode("ascii"), - weights.encode("ascii"), 0, batch_size) - metadata = load_meta(data_file.encode("ascii")) - class_names = [metadata.names[i].decode("ascii") for i in range(metadata.classes)] - colors = class_colors(class_names) - return network, class_names, colors - - -def print_detections(detections, coordinates=False): - print("\nObjects:") - for label, confidence, bbox in detections: - x, y, w, h = bbox - if coordinates: - print("{}: {}% (left_x: {:.0f} top_y: {:.0f} width: {:.0f} height: {:.0f})".format(label, confidence, x, y, w, h)) - else: - print("{}: {}%".format(label, confidence)) - - -def draw_boxes(detections, image, colors): - import cv2 - for label, confidence, bbox in detections: - left, top, right, bottom = bbox2points(bbox) - cv2.rectangle(image, (left, top), (right, bottom), colors[label], 1) - cv2.putText(image, "{} [{:.2f}]".format(label, float(confidence)), - (left, top - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, - colors[label], 2) - return image - - -def decode_detection(detections): - decoded = [] - for label, confidence, bbox in detections: - confidence = str(round(confidence * 100, 2)) - decoded.append((str(label), confidence, bbox)) - return decoded - - -def remove_negatives(detections, class_names, num): - """ - Remove all classes with 0% confidence within the detection - """ - predictions = [] - for j in range(num): - for idx, name in enumerate(class_names): - if detections[j].prob[idx] > 0: - bbox = detections[j].bbox - bbox = (bbox.x, bbox.y, bbox.w, bbox.h) - predictions.append((name, detections[j].prob[idx], (bbox))) - return predictions - - -def detect_image(network, class_names, image, thresh=.5, hier_thresh=.5, nms=.45): - """ - Returns a list with highest confidence class and their bbox - """ - pnum = pointer(c_int(0)) - predict_image(network, image) - detections = get_network_boxes(network, image.w, image.h, - thresh, hier_thresh, None, 0, pnum, 0) - num = pnum[0] - if nms: - do_nms_sort(detections, num, len(class_names), nms) - predictions = remove_negatives(detections, class_names, num) - predictions = decode_detection(predictions) - free_detections(detections, num) - return sorted(predictions, key=lambda x: x[1]) - - -# lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL) -# lib = CDLL("libdarknet.so", RTLD_GLOBAL) -hasGPU = True -if os.name == "nt": - cwd = os.path.dirname(__file__) - os.environ['PATH'] = cwd + ';' + os.environ['PATH'] - winGPUdll = os.path.join(cwd, "yolo_cpp_dll.dll") - winNoGPUdll = os.path.join(cwd, "yolo_cpp_dll_nogpu.dll") - envKeys = list() - for k, v in os.environ.items(): - envKeys.append(k) - try: - try: - tmp = os.environ["FORCE_CPU"].lower() - if tmp in ["1", "true", "yes", "on"]: - raise ValueError("ForceCPU") - else: - print("Flag value {} not forcing CPU mode".format(tmp)) - except KeyError: - # We never set the flag - if 'CUDA_VISIBLE_DEVICES' in envKeys: - if int(os.environ['CUDA_VISIBLE_DEVICES']) < 0: - raise ValueError("ForceCPU") - try: - global DARKNET_FORCE_CPU - if DARKNET_FORCE_CPU: - raise ValueError("ForceCPU") - except NameError as cpu_error: - print(cpu_error) - if not os.path.exists(winGPUdll): - raise ValueError("NoDLL") - lib = CDLL(winGPUdll, RTLD_GLOBAL) - except (KeyError, ValueError): - hasGPU = False - if os.path.exists(winNoGPUdll): - lib = CDLL(winNoGPUdll, RTLD_GLOBAL) - print("Notice: CPU-only mode") - else: - # Try the other way, in case no_gpu was compile but not renamed - lib = CDLL(winGPUdll, RTLD_GLOBAL) - print("Environment variables indicated a CPU run, but we didn't find {}. Trying a GPU run anyway.".format(winNoGPUdll)) -else: - lib = CDLL("./libdarknet.so", RTLD_GLOBAL) -lib.network_width.argtypes = [c_void_p] -lib.network_width.restype = c_int -lib.network_height.argtypes = [c_void_p] -lib.network_height.restype = c_int - -copy_image_from_bytes = lib.copy_image_from_bytes -copy_image_from_bytes.argtypes = [IMAGE,c_char_p] - -predict = lib.network_predict_ptr -predict.argtypes = [c_void_p, POINTER(c_float)] -predict.restype = POINTER(c_float) - -if hasGPU: - set_gpu = lib.cuda_set_device - set_gpu.argtypes = [c_int] - -init_cpu = lib.init_cpu - -make_image = lib.make_image -make_image.argtypes = [c_int, c_int, c_int] -make_image.restype = IMAGE - -get_network_boxes = lib.get_network_boxes -get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int), c_int] -get_network_boxes.restype = POINTER(DETECTION) - -make_network_boxes = lib.make_network_boxes -make_network_boxes.argtypes = [c_void_p] -make_network_boxes.restype = POINTER(DETECTION) - -free_detections = lib.free_detections -free_detections.argtypes = [POINTER(DETECTION), c_int] - -free_batch_detections = lib.free_batch_detections -free_batch_detections.argtypes = [POINTER(DETNUMPAIR), c_int] - -free_ptrs = lib.free_ptrs -free_ptrs.argtypes = [POINTER(c_void_p), c_int] - -network_predict = lib.network_predict_ptr -network_predict.argtypes = [c_void_p, POINTER(c_float)] - -reset_rnn = lib.reset_rnn -reset_rnn.argtypes = [c_void_p] - -load_net = lib.load_network -load_net.argtypes = [c_char_p, c_char_p, c_int] -load_net.restype = c_void_p - -load_net_custom = lib.load_network_custom -load_net_custom.argtypes = [c_char_p, c_char_p, c_int, c_int] -load_net_custom.restype = c_void_p - -do_nms_obj = lib.do_nms_obj -do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float] - -do_nms_sort = lib.do_nms_sort -do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float] - -free_image = lib.free_image -free_image.argtypes = [IMAGE] - -letterbox_image = lib.letterbox_image -letterbox_image.argtypes = [IMAGE, c_int, c_int] -letterbox_image.restype = IMAGE - -load_meta = lib.get_metadata -lib.get_metadata.argtypes = [c_char_p] -lib.get_metadata.restype = METADATA - -load_image = lib.load_image_color -load_image.argtypes = [c_char_p, c_int, c_int] -load_image.restype = IMAGE - -rgbgr_image = lib.rgbgr_image -rgbgr_image.argtypes = [IMAGE] - -predict_image = lib.network_predict_image -predict_image.argtypes = [c_void_p, IMAGE] -predict_image.restype = POINTER(c_float) - -predict_image_letterbox = lib.network_predict_image_letterbox -predict_image_letterbox.argtypes = [c_void_p, IMAGE] -predict_image_letterbox.restype = POINTER(c_float) - -network_predict_batch = lib.network_predict_batch -network_predict_batch.argtypes = [c_void_p, IMAGE, c_int, c_int, c_int, - c_float, c_float, POINTER(c_int), c_int, c_int] -network_predict_batch.restype = POINTER(DETNUMPAIR) diff --git a/build/darknet/x64/darknet_video.py b/build/darknet/x64/darknet_video.py deleted file mode 100644 index de96d709ed1..00000000000 --- a/build/darknet/x64/darknet_video.py +++ /dev/null @@ -1,134 +0,0 @@ -from ctypes import * -import random -import os -import cv2 -import time -import darknet -import argparse -from threading import Thread, enumerate -from queue import Queue - - -def parser(): - parser = argparse.ArgumentParser(description="YOLO Object Detection") - parser.add_argument("--input", type=str, default=0, - help="video source. If empty, uses webcam 0 stream") - parser.add_argument("--out_filename", type=str, default="", - help="inference video name. Not saved if empty") - parser.add_argument("--weights", default="yolov4.weights", - help="yolo weights path") - parser.add_argument("--dont_show", action='store_true', - help="windown inference display. For headless systems") - parser.add_argument("--ext_output", action='store_true', - help="display bbox coordinates of detected objects") - parser.add_argument("--config_file", default="./cfg/yolov4.cfg", - help="path to config file") - parser.add_argument("--data_file", default="./cfg/coco.data", - help="path to data file") - parser.add_argument("--thresh", type=float, default=.25, - help="remove detections with confidence below this value") - return parser.parse_args() - - -def str2int(video_path): - """ - argparse returns and string althout webcam uses int (0, 1 ...) - Cast to int if needed - """ - try: - return int(video_path) - except ValueError: - return video_path - - -def check_arguments_errors(args): - assert 0 < args.thresh < 1, "Threshold should be a float between zero and one (non-inclusive)" - if not os.path.exists(args.config_file): - raise(ValueError("Invalid config path {}".format(os.path.abspath(args.config_file)))) - if not os.path.exists(args.weights): - raise(ValueError("Invalid weight path {}".format(os.path.abspath(args.weights)))) - if not os.path.exists(args.data_file): - raise(ValueError("Invalid data file path {}".format(os.path.abspath(args.data_file)))) - if str2int(args.input) == str and not os.path.exists(args.input): - raise(ValueError("Invalid video path {}".format(os.path.abspath(args.input)))) - - -def set_saved_video(input_video, output_video, size): - fourcc = cv2.VideoWriter_fourcc(*"MJPG") - fps = int(input_video.get(cv2.CAP_PROP_FPS)) - video = cv2.VideoWriter(output_video, fourcc, fps, size) - return video - - -def video_capture(frame_queue, darknet_image_queue): - while cap.isOpened(): - ret, frame = cap.read() - if not ret: - break - frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - frame_resized = cv2.resize(frame_rgb, (width, height), - interpolation=cv2.INTER_LINEAR) - frame_queue.put(frame_resized) - darknet.copy_image_from_bytes(darknet_image, frame_resized.tobytes()) - darknet_image_queue.put(darknet_image) - cap.release() - - -def inference(darknet_image_queue, detections_queue, fps_queue): - while cap.isOpened(): - darknet_image = darknet_image_queue.get() - prev_time = time.time() - detections = darknet.detect_image(network, class_names, darknet_image, thresh=args.thresh) - detections_queue.put(detections) - fps = int(1/(time.time() - prev_time)) - fps_queue.put(fps) - print("FPS: {}".format(fps)) - darknet.print_detections(detections, args.ext_output) - cap.release() - - -def drawing(frame_queue, detections_queue, fps_queue): - random.seed(3) # deterministic bbox colors - video = set_saved_video(cap, args.out_filename, (width, height)) - while cap.isOpened(): - frame_resized = frame_queue.get() - detections = detections_queue.get() - fps = fps_queue.get() - if frame_resized is not None: - image = darknet.draw_boxes(detections, frame_resized, class_colors) - image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - if args.out_filename is not None: - video.write(image) - if not args.dont_show: - cv2.imshow('Inference', image) - if cv2.waitKey(fps) == 27: - break - cap.release() - video.release() - cv2.destroyAllWindows() - - -if __name__ == '__main__': - frame_queue = Queue() - darknet_image_queue = Queue(maxsize=1) - detections_queue = Queue(maxsize=1) - fps_queue = Queue(maxsize=1) - - args = parser() - check_arguments_errors(args) - network, class_names, class_colors = darknet.load_network( - args.config_file, - args.data_file, - args.weights, - batch_size=1 - ) - # Darknet doesn't accept numpy images. - # Create one with image we reuse for each detect - width = darknet.network_width(network) - height = darknet.network_height(network) - darknet_image = darknet.make_image(width, height, 3) - input_path = str2int(args.input) - cap = cv2.VideoCapture(input_path) - Thread(target=video_capture, args=(frame_queue, darknet_image_queue)).start() - Thread(target=inference, args=(darknet_image_queue, detections_queue, fps_queue)).start() - Thread(target=drawing, args=(frame_queue, detections_queue, fps_queue)).start() diff --git a/build/darknet/x64/data/9k.labels b/build/darknet/x64/data/9k.labels deleted file mode 100644 index e2bd3082485..00000000000 --- a/build/darknet/x64/data/9k.labels +++ /dev/null @@ -1,9418 +0,0 @@ -n00002452 -n00020827 -n00002684 -n11425580 -n05220461 -n09225146 -n05538625 -n01900150 -n05225602 -n05418717 -n05302499 -n05578095 -n09475179 -n09376198 -n14877585 -n15046900 -n00019613 -n00021265 -n15067877 -n09436708 -n14915184 -n07555863 -n07850329 -n07849336 -n07705711 -n07622061 -n07594066 -n07854982 -n07852833 -n07852614 -n07854184 -n07852229 -n07851443 -n07705931 -n07707451 -n07752966 -n07760859 -n07747055 -n07754684 -n07768694 -n07764847 -n07768858 -n07739125 -n07746551 -n07753113 -n07763987 -n07748574 -n07751451 -n07762244 -n07750872 -n07742704 -n07765208 -n07763792 -n07767847 -n07766173 -n07751004 -n07760153 -n07758680 -n07753592 -n07751280 -n07769731 -n07763629 -n07755411 -n07754451 -n07753275 -n07764155 -n07765073 -n07762114 -n07762913 -n07753743 -n07765999 -n07765361 -n07752377 -n07757132 -n07769584 -n07751148 -n07761141 -n07761309 -n07749731 -n07747951 -n07749446 -n07747607 -n07749582 -n07750449 -n07749969 -n07750146 -n07748157 -n07748416 -n07748276 -n07748912 -n07748753 -n07749192 -n07749312 -n07739344 -n07739506 -n07742313 -n07740220 -n07740954 -n07740461 -n07740342 -n07745940 -n07767171 -n07744246 -n07744057 -n07744811 -n07744682 -n07745466 -n07743902 -n07746334 -n07746186 -n07743544 -n07743224 -n07755707 -n07756951 -n07755929 -n07757990 -n07757312 -n07757511 -n07734744 -n07719213 -n07768423 -n07735510 -n07718472 -n07710283 -n07713395 -n07708398 -n07710007 -n07718747 -n07708798 -n07723039 -n07715561 -n07709333 -n07730406 -n07730033 -n07733394 -n07713267 -n07722217 -n07817871 -n07736813 -n07719839 -n07712267 -n07730207 -n07710616 -n07710952 -n07711569 -n07711080 -n07713763 -n07713895 -n07733567 -n07715103 -n07715221 -n07715407 -n07714990 -n07735687 -n07735803 -n07714188 -n07714448 -n07714895 -n07714571 -n07714078 -n07720442 -n07734017 -n07713074 -n07734555 -n07720615 -n07721325 -n07720875 -n07721195 -n07721018 -n07721456 -n07722052 -n07721942 -n07721678 -n07734292 -n07734183 -n07724943 -n07725376 -n07726095 -n07725255 -n07729485 -n07726796 -n07727458 -n07727048 -n07727578 -n07727868 -n07728804 -n07728053 -n07728585 -n07728181 -n07729384 -n07729828 -n07725531 -n07725789 -n07725888 -n07715721 -n07717070 -n07716906 -n07716358 -n07716034 -n07717556 -n07717410 -n07720277 -n07736256 -n07723330 -n07719616 -n07736692 -n07733712 -n07732747 -n07730855 -n07731587 -n07731006 -n07723559 -n07724654 -n07724269 -n07724492 -n07722485 -n07723177 -n07722888 -n07639069 -n07679356 -n07682197 -n07680517 -n07695878 -n07685730 -n07682316 -n07684517 -n07680761 -n07681691 -n07684600 -n07684164 -n07686720 -n07680932 -n07687211 -n07681450 -n07683786 -n07695742 -n07682477 -n07686873 -n07684289 -n07683490 -n07682808 -n07690585 -n07684938 -n07690892 -n07685399 -n07693972 -n07690273 -n07691091 -n07687789 -n07685218 -n07694516 -n07694839 -n07694659 -n07690511 -n07690739 -n07690431 -n07688624 -n07688898 -n07689003 -n07690152 -n07693725 -n07690019 -n07692614 -n07691758 -n07691539 -n07691650 -n07693223 -n07693048 -n07691237 -n07687626 -n07687381 -n07687469 -n07871810 -n07684084 -n14580897 -n15062057 -n14698884 -n14696793 -n14765422 -n14844693 -n15019030 -n12167075 -n14974264 -n14858292 -n15075141 -n04033425 -n07556637 -n07566340 -n07560652 -n07881800 -n07938313 -n07800091 -n07570720 -n01464844 -n07556406 -n07840804 -n07802417 -n07925608 -n07844867 -n07569644 -n07568502 -n07809096 -n07843775 -n07755089 -n07882497 -n07573347 -n07923748 -n07572957 -n07731952 -n07804323 -n07804771 -n07803093 -n07803545 -n07732168 -n07732636 -n07804657 -n07804900 -n07809368 -n07841345 -n07827284 -n07827130 -n07822518 -n07827410 -n07816052 -n07812184 -n07810907 -n07858595 -n07811416 -n07824702 -n07818277 -n07819769 -n07920989 -n07822323 -n07815424 -n07814390 -n07826930 -n07814487 -n07814203 -n07583066 -n07822845 -n07767344 -n07823105 -n07828987 -n07582609 -n07825972 -n07823460 -n07823698 -n07822197 -n07856270 -n07767709 -n07829412 -n07829331 -n07829248 -n07857731 -n07857170 -n07838233 -n07836838 -n07826091 -n07830593 -n07840027 -n07832416 -n07832902 -n07835921 -n07835457 -n07831146 -n07831267 -n07834618 -n07834507 -n07595914 -n07858978 -n07859583 -n07860103 -n07860331 -n07860447 -n07816164 -n07818689 -n07821260 -n07820683 -n07816575 -n07817160 -n07817315 -n07819166 -n07817024 -n07818995 -n07816398 -n07820497 -n07932841 -n07820145 -n07819896 -n07816296 -n07821758 -n07933154 -n07935379 -n07935043 -n07847198 -n07844042 -n07848196 -n07847453 -n07847917 -n07847827 -n07678729 -n07860805 -n07860988 -n07883031 -n07623136 -n07861158 -n07627931 -n07628068 -n07565161 -n07565083 -n07561590 -n07561112 -n07560903 -n07562495 -n07564971 -n07938149 -n07938007 -n07884567 -n07924033 -n07919310 -n07891189 -n07922764 -n07929519 -n07921455 -n07933274 -n07927197 -n07925966 -n07891309 -n07936263 -n07883251 -n07914271 -n07911371 -n07901587 -n07891433 -n07891726 -n07886176 -n07886057 -n07907943 -n07921615 -n07886572 -n07902121 -n07886463 -n07912211 -n07911677 -n07914777 -n07930554 -n07930433 -n07930315 -n07915491 -n07915094 -n07913393 -n07916041 -n07914995 -n07916183 -n07914413 -n07917392 -n07917133 -n07915918 -n07930864 -n07931870 -n07932039 -n07930062 -n07906111 -n07907037 -n07902799 -n07904865 -n07905474 -n07902937 -n07904395 -n07905038 -n07902336 -n07905979 -n07903101 -n07904760 -n07903208 -n07904934 -n07906284 -n07902443 -n07903841 -n07903962 -n07903731 -n07903643 -n07907161 -n07906718 -n07907831 -n07907548 -n07907429 -n07906877 -n07906572 -n07893253 -n07892418 -n07893642 -n07899003 -n07896287 -n07896661 -n07893528 -n07896165 -n07900225 -n07893891 -n07900406 -n07895237 -n07898745 -n07896060 -n07899108 -n07892512 -n07897750 -n07892813 -n07894703 -n07894102 -n07894551 -n07900616 -n07900958 -n07900734 -n07900825 -n07901457 -n07898117 -n07895435 -n07899434 -n07899292 -n07894298 -n07895595 -n07894965 -n07897865 -n07895839 -n07895710 -n07898333 -n07897438 -n07895962 -n07896893 -n07899899 -n07895100 -n07898443 -n07899533 -n07894799 -n07897975 -n07899660 -n07894451 -n07910656 -n07909593 -n07911249 -n07910048 -n07908411 -n07910379 -n07908647 -n07886849 -n07887634 -n07887099 -n07889510 -n07887192 -n07887304 -n07888229 -n07887967 -n07889274 -n07887461 -n07888465 -n07890226 -n07890352 -n07889814 -n07890068 -n07890540 -n07888816 -n07924834 -n07924443 -n07924276 -n07920540 -n07920222 -n07920052 -n07920349 -n07919441 -n07731284 -n07919572 -n07920872 -n07921239 -n07934282 -n07933799 -n07929172 -n07927931 -n07928488 -n07928367 -n07927512 -n07928887 -n07928696 -n07928790 -n07936745 -n07935737 -n07936548 -n07801508 -n07805594 -n07800740 -n07801091 -n07802026 -n07801779 -n07801892 -n07557165 -n07560193 -n07651025 -n07560331 -n07557434 -n07556970 -n05399243 -n15089258 -n07560542 -n07573696 -n07613815 -n07643981 -n07596684 -n07600696 -n07597145 -n07597365 -n07599998 -n07596967 -n07620689 -n07642471 -n07643200 -n07642742 -n07643026 -n07642933 -n07643306 -n07606538 -n07599911 -n07607138 -n07608429 -n07598256 -n07606669 -n07607605 -n07601572 -n07609632 -n07605597 -n07607967 -n07609215 -n07841907 -n07606764 -n07605944 -n07601686 -n07605380 -n07605040 -n07601809 -n07605474 -n07842130 -n07842044 -n07600285 -n07600177 -n07842202 -n07579688 -n07580053 -n07588947 -n07842753 -n07583197 -n07879350 -n07880751 -n07868200 -n07863802 -n07875152 -n07824191 -n07878785 -n07865484 -n07866015 -n07868955 -n07861557 -n07580253 -n07877187 -n07866868 -n07880458 -n07648913 -n07580470 -n07866277 -n07591961 -n07868508 -n07871436 -n07864934 -n07874780 -n07879659 -n07878926 -n07937461 -n07842433 -n07862611 -n07863374 -n07866723 -n07867021 -n07867164 -n07726525 -n07624466 -n07842308 -n07877299 -n07880080 -n07862348 -n07873464 -n07869775 -n07879953 -n07625061 -n07843636 -n07696403 -n07580592 -n07655263 -n07868340 -n07619004 -n07879174 -n07867324 -n07843464 -n07877961 -n07873807 -n07867421 -n07654298 -n07878647 -n07611839 -n07842605 -n07871720 -n07869611 -n07876651 -n07880968 -n07875436 -n07806221 -n07841495 -n07823951 -n07712382 -n07591586 -n07590320 -n07587111 -n07592481 -n07590611 -n07591473 -n07590502 -n07591049 -n07592768 -n07585758 -n07588193 -n07586894 -n07588299 -n07584110 -n07587441 -n07587023 -n07586099 -n07588574 -n07584332 -n07586604 -n07586718 -n07585107 -n07585557 -n07585208 -n07584593 -n07585906 -n07584423 -n07587618 -n07587700 -n07588111 -n07704054 -n07704205 -n07871234 -n07870167 -n07863547 -n07700003 -n07619208 -n07619409 -n07874159 -n07874343 -n07874259 -n07874441 -n07874063 -n07867751 -n07867616 -n07808587 -n07807834 -n07806633 -n07807171 -n07807710 -n07807922 -n07808904 -n07806774 -n07807472 -n07841639 -n07841800 -n07695965 -n07712748 -n07712559 -n07697825 -n07697313 -n07696728 -n07696625 -n07698543 -n07698401 -n07865105 -n07696977 -n07698250 -n07698782 -n07697100 -n07696839 -n07697537 -n07712856 -n07712959 -n07579575 -n07579787 -n07609840 -n07581346 -n07611991 -n07613266 -n07611358 -n07612632 -n07612996 -n07613480 -n07611267 -n07612367 -n07611148 -n07611046 -n07617611 -n07612137 -n07616386 -n07631926 -n07615774 -n07616487 -n07614730 -n07614500 -n07614198 -n07616748 -n07616046 -n07617051 -n07615671 -n07615190 -n07614825 -n07615460 -n07617708 -n07618432 -n07582152 -n07734879 -n07581775 -n07582277 -n07730320 -n07581249 -n15089645 -n15089472 -n15093137 -n15093298 -n15090742 -n15091473 -n14919819 -n15091669 -n14810561 -n14973585 -n15091304 -n15091846 -n15092227 -n15090065 -n07576438 -n07577374 -n07575984 -n07574602 -n07574426 -n07593199 -n07576182 -n07574923 -n07574780 -n07575726 -n07575076 -n07578093 -n07576577 -n07577144 -n07576781 -n07574504 -n07577538 -n09335240 -n00027167 -n09334396 -n09283193 -n03892891 -n09287968 -n03059685 -n00003553 -n09300905 -n09452395 -n09260907 -n08630039 -n08630985 -n09386842 -n08593262 -n08620061 -n09379111 -n08649711 -n08658309 -n08568978 -n08512259 -n03823111 -n04170933 -n09433839 -n08578517 -n08640739 -n08574314 -n08552138 -n08645104 -n08505018 -n08659861 -n08659446 -n08673395 -n08583455 -n08598301 -n08651247 -n03120491 -n02802544 -n08614632 -n08674739 -n08569998 -n08494231 -n08677424 -n08616050 -n08518171 -n08573842 -n08521623 -n03368352 -n03417345 -n04454908 -n03902482 -n04610879 -n08579352 -n03963645 -n03417749 -n08524735 -n08537837 -n08551296 -n08628141 -n08633683 -n08539072 -n09249034 -n09263912 -n08583292 -n09443281 -n08547544 -n08664443 -n04602044 -n08580944 -n03581125 -n08517676 -n08598568 -n08584914 -n03899933 -n02776631 -n03322099 -n03935234 -n04052442 -n03159535 -n15102894 -n09242389 -n09382099 -n09282208 -n09392402 -n09393605 -n09445289 -n03030880 -n03946162 -n03485997 -n03882960 -n04322026 -n03474896 -n02764398 -n02907082 -n03948830 -n09205509 -n09472413 -n09443453 -n09309292 -n09366017 -n09366317 -n09376786 -n09348460 -n09246464 -n09433442 -n09454153 -n09409752 -n09403734 -n09331251 -n09437454 -n09238926 -n09283866 -n09217230 -n09305898 -n09288635 -n09308743 -n09308572 -n09194227 -n09289331 -n09468604 -n09344324 -n09335809 -n09435739 -n09215437 -n09259219 -n09217638 -n09304750 -n09206896 -n09405787 -n09233446 -n09290444 -n09457979 -n09245515 -n09376526 -n09415671 -n09448690 -n09230041 -n09398076 -n09453008 -n09303008 -n09359803 -n09302616 -n09409512 -n09399592 -n09199101 -n09230202 -n09283405 -n09326662 -n09193705 -n09218641 -n09472597 -n09421951 -n09270735 -n09406793 -n09213434 -n09256479 -n09210862 -n09421799 -n09224725 -n09396465 -n09362945 -n09259025 -n09398677 -n09428293 -n09447666 -n09332890 -n08596076 -n09428628 -n09361517 -n09265620 -n09303528 -n09436444 -n09274152 -n09213565 -n09269472 -n09206985 -n09228055 -n09466678 -n09415584 -n09475925 -n09257843 -n09239302 -n09294877 -n00021939 -n00004258 -n00019128 -n02749953 -n02852523 -n03767112 -n14977504 -n03129123 -n03848729 -n03964744 -n04362025 -n04469003 -n04341686 -n03575240 -n03873064 -n03122748 -n03309808 -n02871147 -n03364340 -n14786479 -n03169390 -n04564698 -n04339291 -n00022903 -n03315023 -n03302121 -n03076708 -n04188643 -n03354613 -n14976871 -n03670849 -n02917521 -n04414909 -n04435180 -n02725872 -n04076846 -n02743547 -n03816849 -n04007894 -n03934656 -n03720163 -n04227144 -n04260364 -n03925226 -n04564581 -n02744844 -n04042358 -n03927091 -n03927539 -n03876519 -n04485423 -n03835197 -n03342127 -n04246271 -n04321238 -n04180314 -n03625783 -n03684611 -n03514693 -n03421485 -n04026180 -n02870526 -n04599396 -n06415688 -n03822171 -n04582205 -n03727605 -n03849679 -n04598792 -n03631922 -n02933649 -n03600722 -n03169176 -n03418618 -n02727016 -n03526198 -n03794798 -n03859608 -n03968581 -n03717447 -n03614782 -n03915900 -n04431025 -n03974070 -n02779435 -n03941231 -n04399382 -n03603442 -n09229709 -n03548402 -n03944138 -n04238128 -n04284869 -n03061211 -n03219135 -n09282724 -n09191635 -n09443641 -n04186268 -n03447358 -n03607029 -n03536348 -n02857023 -n04381860 -n04213626 -n03961939 -n04394630 -n03365592 -n04501550 -n04296562 -n03159640 -n04354182 -n03549732 -n03360300 -n03892178 -n02768973 -n03906224 -n03313333 -n02990373 -n02861886 -n03365991 -n02898711 -n03109693 -n13898207 -n04358874 -n02687821 -n03135532 -n03545756 -n03548626 -n03469175 -n03688943 -n02914991 -n04191595 -n09218315 -n03074380 -n02699494 -n02733524 -n04460130 -n04471148 -n03792048 -n03388043 -n03837869 -n03321954 -n02733213 -n03687137 -n03065424 -n02839110 -n03894379 -n03725717 -n04226464 -n03071160 -n03839993 -n02913152 -n04128413 -n04008947 -n03917198 -n03222318 -n04295881 -n03241335 -n02735688 -n02777734 -n03984381 -n03216828 -n03517899 -n03546340 -n04361095 -n13897996 -n03171356 -n03290195 -n03743902 -n03297735 -n04217882 -n02863426 -n03408054 -n03463381 -n03758089 -n03686130 -n02800497 -n03379828 -n03233744 -n02953197 -n04108822 -n03865557 -n04492749 -n04532670 -n04311004 -n03122073 -n03415486 -n04366367 -n04479939 -n03956922 -n03069752 -n04592465 -n03316406 -n03212811 -n03844673 -n04068441 -n04103094 -n03387653 -n04311595 -n03697007 -n04300358 -n04032603 -n02810782 -n03492250 -n03826186 -n03547054 -n04411264 -n03550153 -n03560430 -n03254189 -n03792972 -n04025508 -n03900979 -n02769963 -n03374473 -n02954163 -n03334291 -n04549028 -n03035252 -n03448956 -n04113765 -n03975035 -n04486054 -n02905152 -n03784896 -n04104384 -n02946127 -n04501947 -n03047052 -n04206790 -n03029197 -n03767745 -n04028581 -n04220250 -n04556948 -n04479823 -n04028764 -n04312432 -n03347617 -n03519387 -n04361260 -n03098959 -n02826886 -n02814860 -n02922292 -n04251701 -n04051825 -n03390786 -n02811936 -n02699770 -n04546855 -n03409393 -n04544325 -n02755823 -n03904657 -n02825961 -n02898369 -n04326799 -n02796623 -n03839795 -n03967942 -n03659686 -n03454707 -n04127395 -n03795580 -n02788148 -n02894605 -n03459775 -n04571566 -n04047401 -n03549589 -n04304680 -n03327234 -n03160309 -n03427296 -n03221720 -n03698815 -n03985881 -n04501370 -n03395514 -n02963821 -n04153025 -n03394649 -n03226880 -n03579538 -n04239074 -n04086446 -n02793842 -n03498662 -n04329834 -n04547592 -n04082710 -n04046974 -n03000134 -n03252637 -n03511175 -n04604644 -n03930313 -n04326547 -n04560882 -n02920369 -n03262072 -n03108853 -n04390977 -n03999160 -n03542333 -n04409384 -n02666943 -n02726681 -n02763604 -n03478756 -n03545150 -n04104500 -n04081699 -n03859280 -n03402941 -n03739518 -n03542605 -n03661043 -n02977936 -n03322570 -n03953416 -n04081281 -n03770316 -n04112654 -n03839671 -n03842012 -n04407686 -n04217546 -n03449564 -n03457902 -n04093625 -n03956157 -n04018399 -n02882190 -n03544360 -n04118635 -n02734725 -n04233124 -n03430418 -n04146050 -n03007444 -n04417809 -n03479397 -n03092166 -n02993546 -n04080705 -n08640531 -n03788498 -n08560295 -n04095109 -n04229737 -n03541696 -n03790755 -n03036022 -n03466839 -n03698723 -n03333610 -n03837698 -n03121298 -n04187547 -n03416489 -n02968074 -n03860404 -n03055857 -n02859443 -n04598318 -n02727426 -n03730334 -n03210552 -n04294879 -n03016389 -n03123809 -n02793495 -n03884778 -n03028079 -n04407435 -n04210390 -n04346328 -n03724756 -n04374735 -n03788195 -n03007130 -n03618982 -n02667576 -n02984061 -n02984203 -n03772077 -n02935658 -n04111414 -n02760099 -n02892499 -n02935891 -n03199647 -n02956699 -n03282295 -n04461437 -n03005033 -n03152303 -n04305210 -n03121431 -n03558176 -n03557360 -n02696165 -n03393017 -n04258438 -n02919792 -n04115256 -n02932400 -n03257210 -n03719053 -n03685820 -n03428090 -n03686924 -n04131368 -n03118969 -n03219483 -n04052658 -n02857477 -n03180865 -n04535524 -n03002816 -n04079244 -n03322836 -n04413969 -n02907873 -n03878066 -n04305323 -n03718458 -n04354026 -n03158186 -n04535370 -n03010915 -n03718935 -n04073948 -n03439348 -n03892557 -n03877845 -n03781244 -n02667379 -n02667478 -n03165616 -n03092314 -n03801671 -n03849814 -n03801533 -n03032252 -n03678729 -n03529860 -n03097362 -n04177931 -n02940385 -n03111041 -n03064935 -n03626115 -n02838728 -n03356858 -n02902079 -n04439585 -n03263076 -n04453037 -n03942920 -n03379204 -n03522003 -n03220692 -n02782778 -n02918112 -n02704949 -n03899768 -n03109881 -n02775178 -n03517647 -n03024064 -n02894158 -n04030518 -n03004824 -n02758134 -n03120198 -n03200231 -n04105893 -n02750070 -n03285912 -n03813078 -n02694045 -n04328946 -n03443005 -n03378005 -n02754656 -n03047941 -n03382292 -n04446276 -n04356925 -n03288500 -n04363991 -n04112579 -n03038685 -n03412058 -n03718581 -n02991302 -n03691817 -n04139395 -n03238131 -n02839592 -n02824319 -n03619890 -n03660909 -n04329477 -n04602762 -n04180229 -n02710324 -n03200701 -n04065464 -n03541091 -n04058096 -n02873839 -n03089879 -n02821627 -n03040376 -n03679712 -n03222176 -n03478907 -n04061793 -n02857644 -n04345028 -n03683708 -n03062122 -n04406239 -n03079741 -n03120778 -n03982331 -n02807731 -n03098688 -n02715513 -n04558478 -n03746486 -n04555291 -n04018667 -n03529175 -n03653740 -n04345201 -n03885535 -n04324387 -n04523831 -n04067818 -n03200539 -n02952585 -n03319745 -n04119478 -n03283221 -n04064862 -n03850245 -n04401680 -n04541987 -n03090172 -n04209613 -n03727465 -n03788601 -n03465718 -n03542860 -n03225108 -n03836062 -n03165466 -n03457008 -n03086580 -n03878211 -n03303831 -n03891538 -n03235042 -n04000592 -n03075946 -n02932019 -n03939677 -n02931148 -n03696065 -n02933462 -n03061505 -n04305572 -n02960352 -n02934451 -n04299370 -n03235180 -n04414199 -n02936714 -n03964495 -n03907227 -n04539203 -n03993703 -n03683079 -n03016737 -n03003730 -n04061969 -n02843276 -n04037220 -n03550289 -n03124590 -n04100519 -n03376159 -n04262161 -n02921884 -n03348868 -n04080454 -n03404449 -n02868638 -n03555006 -n04076713 -n03732114 -n03617095 -n02849885 -n03837606 -n03425325 -n03566193 -n03762434 -n03073694 -n03343560 -n03346455 -n02731398 -n02991847 -n03148324 -n04295571 -n03411544 -n02705201 -n03854722 -n04327204 -n04355267 -n03399677 -n04527648 -n03168107 -n02770211 -n03986704 -n03721590 -n03251533 -n02853016 -n03259505 -n04409625 -n03679384 -n03776460 -n03088389 -n02726305 -n04549919 -n02992032 -n03088580 -n04613696 -n03685307 -n04517408 -n03507241 -n03354207 -n03042490 -n03529629 -n04172107 -n04584373 -n04412416 -n02672371 -n03349892 -n02932693 -n02822064 -n03361297 -n03010473 -n04360501 -n03391770 -n03903868 -n02929289 -n03373943 -n02669295 -n04087826 -n02926591 -n04589593 -n03390983 -n03416094 -n03530642 -n04492375 -n03646916 -n03111296 -n03931765 -n04587648 -n03042697 -n04478512 -n02689144 -n03454536 -n03453443 -n04545305 -n02977619 -n04387261 -n02732827 -n04038727 -n03793186 -n04136510 -n02976350 -n03855333 -n02813399 -n04297750 -n04232800 -n03211789 -n04110178 -n03986562 -n04473108 -n03041810 -n03224603 -n03224753 -n03637898 -n03320959 -n03961711 -n02790669 -n02835829 -n03696301 -n03207630 -n04459773 -n03896526 -n03900393 -n03792526 -n04340935 -n03386011 -n03385557 -n02806088 -n03610098 -n03628511 -n02676938 -n02695627 -n03723781 -n03334382 -n02805983 -n03296328 -n03878963 -n02980441 -n02993194 -n03743016 -n04178329 -n02892201 -n03810952 -n03884926 -n03220237 -n03745571 -n03953020 -n03574555 -n04511002 -n03748162 -n03841666 -n02931417 -n03506370 -n03965456 -n03119203 -n03176763 -n04202417 -n03722288 -n02879309 -n04131208 -n04200800 -n02871525 -n03871371 -n04428634 -n03606251 -n04462240 -n03039827 -n02813544 -n03436417 -n03367410 -n03249342 -n03416640 -n03173387 -n04245508 -n02791270 -n04299215 -n04443257 -n03822656 -n02927161 -n03952576 -n03089624 -n03099274 -n02813645 -n08492461 -n03461385 -n03847823 -n04358707 -n03555426 -n03457686 -n04261281 -n03322704 -n08571898 -n03822504 -n02885882 -n03504723 -n03111690 -n03856012 -n03592245 -n03911513 -n04005630 -n04447443 -n04566257 -n03294048 -n03091374 -n03563967 -n03405265 -n03183080 -n02997391 -n04377057 -n03094503 -n03100490 -n06254669 -n03176594 -n02807523 -n03128519 -n03690938 -n04186051 -n03476991 -n03794136 -n03916031 -n03475823 -n02723165 -n03994008 -n03113152 -n02808185 -n03484487 -n03067339 -n04357314 -n03640850 -n02862916 -n04450640 -n03487444 -n02683791 -n03992325 -n03898271 -n03916470 -n03071021 -n04448070 -n03980026 -n02901793 -n04447276 -n04386792 -n03177165 -n03519081 -n03714235 -n03314780 -n03676087 -n03309687 -n03724066 -n03676483 -n04112752 -n03309110 -n03308481 -n02738031 -n03171228 -n02866578 -n02703275 -n03812924 -n02813752 -n02746365 -n03647520 -n02950256 -n03332393 -n03786715 -n02801450 -n03553248 -n02753044 -n04113641 -n04206570 -n04063373 -n04285146 -n03926148 -n03811847 -n03889726 -n03430959 -n04137444 -n03414162 -n03888257 -n03278248 -n02727825 -n02761206 -n03729951 -n02774921 -n04393095 -n02979290 -n03192543 -n04533802 -n02799897 -n03135030 -n03039259 -n04225729 -n04607035 -n03132261 -n02802721 -n03594148 -n04212282 -n03446832 -n04275661 -n04318131 -n02885338 -n02885462 -n03472232 -n04571292 -n02800213 -n02811059 -n02811204 -n02797881 -n02811350 -n02799175 -n03528901 -n03349771 -n04425804 -n04164406 -n04102037 -n04102162 -n04102618 -n03558404 -n03523987 -n04273972 -n03336282 -n03132076 -n04582869 -n03445924 -n03447075 -n04399537 -n03446070 -n04597066 -n03585073 -n03244047 -n04284341 -n04569822 -n03762332 -n04028074 -n03823216 -n03950537 -n04135024 -n03524150 -n03978686 -n03535780 -n03538037 -n04509260 -n03888605 -n04469514 -n02777292 -n04524142 -n03980478 -n03255030 -n02790996 -n03289660 -n02942699 -n03037404 -n03338821 -n03667664 -n02884994 -n03358726 -n03976467 -n03974915 -n04569063 -n03789171 -n03196062 -n03987266 -n04069434 -n04609531 -n04067658 -n03817191 -n04071263 -n03619396 -n04091097 -n03351434 -n04295081 -n04091693 -n03138669 -n03139464 -n04179824 -n03349469 -n02966687 -n03650551 -n03241093 -n03240683 -n03494706 -n04247876 -n03503718 -n04124202 -n03480719 -n02900160 -n04290615 -n04266162 -n02768226 -n02778669 -n04028315 -n03982430 -n02882647 -n03716327 -n03020416 -n04113406 -n03442756 -n04540255 -n03941417 -n04254680 -n03982232 -n02882301 -n04256891 -n03333252 -n04023962 -n02839351 -n03134739 -n03131967 -n04409515 -n03445777 -n04118538 -n03145719 -n03742019 -n02802426 -n03267113 -n03942813 -n03482877 -n02799071 -n04039742 -n02861147 -n04540053 -n03598930 -n06785654 -n03014440 -n04579986 -n03901750 -n02802215 -n03820318 -n03278914 -n03782006 -n03781787 -n04405762 -n04401088 -n03857828 -n03916720 -n02872529 -n02979186 -n02988304 -n04060647 -n02757462 -n03656957 -n03963294 -n04405540 -n03034405 -n02979074 -n02995345 -n03775388 -n04142731 -n04392985 -n03181293 -n03777754 -n03293741 -n04392526 -n02705944 -n02992529 -n04270371 -n03179910 -n03902125 -n03488438 -n03187595 -n04044498 -n04405907 -n04043733 -n04137773 -n03516996 -n03046921 -n04077430 -n03517760 -n04315948 -n03584254 -n04546340 -n03584400 -n03436182 -n02942349 -n04404997 -n03909160 -n04026053 -n04173511 -n04070003 -n03257586 -n03509608 -n04171208 -n04450243 -n04506506 -n03434188 -n03567066 -n02923129 -n03386544 -n03046802 -n03757604 -n03927299 -n03924679 -n04608923 -n03316105 -n03767459 -n03987990 -n03084834 -n03422072 -n02855390 -n02921029 -n03425769 -n03871524 -n02852360 -n04105704 -n04408871 -n04241573 -n04402057 -n03664943 -n03605915 -n03543012 -n03196990 -n03639497 -n02840134 -n04594218 -n02999410 -n03086868 -n02790823 -n03886641 -n02709637 -n03374838 -n02835412 -n04440963 -n03011018 -n03600977 -n03093792 -n03228967 -n04573281 -n03521076 -n04144241 -n04571958 -n04160372 -n03787523 -n02928299 -n04333869 -n03213826 -n04476972 -n04593866 -n02788689 -n04451818 -n04516672 -n04116512 -n03816136 -n03294833 -n04317420 -n02908217 -n03532342 -n04185071 -n04285622 -n03653220 -n04369282 -n03346135 -n03837422 -n04317833 -n03039947 -n04100174 -n04608567 -n04208427 -n04282872 -n03396074 -n02865931 -n04112147 -n04459909 -n03659292 -n04463679 -n03487090 -n03138344 -n04317976 -n03613592 -n04393808 -n03903424 -n04099003 -n03470629 -n04264628 -n02771004 -n04193377 -n04400737 -n02670683 -n04367011 -n03489162 -n03588951 -n03919430 -n03418242 -n03967562 -n03075097 -n03239726 -n03154446 -n04387706 -n03417970 -n04050066 -n04299963 -n03684224 -n03919289 -n03970156 -n03941684 -n03966976 -n04258859 -n04266486 -n03481172 -n03946076 -n04606574 -n04154565 -n04489817 -n04140064 -n03848348 -n04150980 -n04208210 -n02898269 -n04269944 -n02966545 -n03430313 -n03715386 -n03731695 -n04457910 -n03947466 -n02680754 -n03848168 -n02697675 -n02886434 -n03474779 -n03376938 -n03488188 -n04016240 -n04016576 -n03109150 -n02877962 -n02951585 -n03511333 -n03649909 -n03995856 -n04089976 -n03995372 -n03240140 -n03154073 -n04503593 -n02844307 -n02848216 -n03624400 -n02866386 -n03030557 -n03265032 -n04148054 -n03623556 -n02764044 -n04057047 -n04594828 -n03020692 -n03954731 -n04186848 -n04250473 -n04016684 -n04163530 -n02973904 -n02880842 -n03973628 -n03041632 -n03549473 -n02976123 -n03890093 -n03658185 -n04373089 -n03911658 -n02811468 -n03498962 -n04185804 -n04332074 -n04127521 -n03067212 -n04597400 -n03601638 -n04247630 -n04283585 -n03621049 -n02997607 -n03403643 -n04103206 -n04059516 -n03724417 -n03621377 -n04293119 -n03775199 -n03101517 -n03101986 -n03454885 -n03767966 -n03266371 -n04578934 -n02850732 -n03880531 -n03133878 -n02999138 -n04270147 -n03459328 -n03284981 -n04309548 -n03101796 -n03101156 -n04500060 -n03846677 -n04317325 -n03400231 -n04097760 -n04596742 -n04138977 -n03453231 -n03047799 -n03984234 -n03262519 -n04326676 -n03992703 -n04282992 -n03018209 -n02869155 -n03713436 -n03317788 -n03625646 -n03133050 -n04546194 -n03729826 -n03053474 -n03332271 -n04277352 -n04321453 -n04296261 -n03250847 -n03715669 -n02949202 -n04374315 -n02806379 -n04381724 -n04491388 -n02698634 -n03355925 -n03141823 -n03274265 -n04453156 -n04122349 -n04156140 -n03475581 -n02902687 -n04185946 -n03908714 -n04310904 -n03145522 -n04039381 -n04292414 -n04409806 -n02772700 -n04426316 -n04333129 -n03012013 -n04072551 -n03831382 -n03651843 -n04156946 -n03873416 -n02831894 -n04150153 -n03258905 -n04292921 -n02906734 -n04367480 -n04111190 -n04549629 -n04182322 -n03949317 -n03616428 -n02764779 -n03976657 -n03351979 -n03091044 -n04434531 -n03244231 -n03127408 -n04472563 -n04277493 -n02946824 -n02871824 -n04319937 -n04230603 -n03051396 -n02931836 -n04267577 -n03726993 -n03726760 -n02883004 -n04610676 -n03775847 -n04115996 -n03711999 -n03382856 -n03374372 -n04279353 -n03908204 -n03906997 -n03518943 -n03003091 -n03128248 -n03652100 -n02783161 -n04185529 -n04033901 -n03388183 -n03326948 -n03405725 -n03842156 -n03200906 -n04550184 -n02821943 -n04379243 -n04379964 -n04549122 -n03636649 -n03201035 -n04555400 -n02912065 -n02933112 -n02766320 -n02822579 -n03649797 -n03129753 -n02870880 -n03290653 -n03298716 -n04161981 -n04165409 -n03015254 -n03337140 -n04104147 -n02963302 -n04529681 -n03050546 -n02739550 -n02818832 -n02831724 -n03962852 -n03540914 -n02920083 -n04491638 -n03388549 -n03115762 -n02920259 -n04503413 -n04236809 -n04222210 -n03482252 -n03799876 -n03225988 -n03414676 -n03465426 -n04381587 -n03116530 -n02699629 -n02894337 -n04301000 -n03090000 -n03904060 -n03620967 -n03850492 -n04398951 -n03653583 -n04603729 -n03428226 -n03238586 -n03179701 -n03246933 -n03063968 -n04480033 -n03092883 -n03011741 -n02789487 -n03735963 -n04061681 -n04130143 -n04247736 -n03231368 -n03630262 -n04608329 -n04164868 -n03164722 -n03201208 -n03202354 -n04067921 -n03367059 -n04380533 -n04057981 -n03237340 -n03018349 -n03742115 -n02804414 -n03131574 -n02970534 -n03125729 -n03001627 -n04447861 -n04326896 -n04256520 -n03858418 -n02828884 -n03649674 -n03002711 -n04099969 -n04373704 -n04429376 -n04331277 -n03632729 -n03518445 -n02738535 -n04590933 -n03376595 -n04576002 -n03790953 -n02791124 -n03262932 -n04062428 -n03786621 -n04593077 -n03168217 -n02946270 -n03801880 -n04382438 -n03380724 -n04177755 -n03165096 -n03100346 -n03693474 -n03015149 -n04344873 -n03891251 -n03360622 -n03920867 -n04177820 -n04590021 -n03016953 -n03518305 -n02843553 -n03508101 -n03666591 -n06791372 -n03099945 -n03141702 -n03243218 -n03626760 -n03904909 -n03800933 -n04200537 -n04198797 -n03699975 -n03088707 -n02776205 -n04294212 -n03339643 -n03738472 -n02676261 -n04474466 -n03008976 -n02688443 -n04114844 -n03929660 -n03287351 -n03320046 -n03553019 -n03175604 -n02678897 -n04461879 -n04359589 -n03851341 -n04331639 -n04450749 -n03923918 -n03574816 -n03074855 -n04074963 -n03302790 -n03075768 -n04554406 -n04210120 -n04562262 -n02855089 -n04526964 -n02895606 -n02730265 -n04226826 -n03467796 -n04081844 -n03614007 -n03269401 -n02729965 -n03345837 -n03111899 -n04069276 -n02694426 -n03277771 -n04252331 -n03525827 -n03744840 -n03613294 -n03827536 -n04263760 -n03568117 -n03180969 -n02895438 -n03565288 -n02683558 -n03537241 -n03267972 -n04228054 -n03664675 -n04258333 -n03272239 -n04041069 -n03423479 -n03099147 -n04265275 -n04330267 -n03031422 -n03728437 -n07273802 -n06793231 -n06794110 -n06874185 -n03269203 -n02981321 -n03582959 -n04375405 -n03307792 -n02988963 -n03580518 -n04338517 -n03279153 -n03614532 -n04586932 -n02803349 -n03915437 -n03254862 -n03025886 -n02787622 -n04615226 -n04132603 -n03467517 -n02880546 -n04224842 -n03698360 -n03716887 -n03716966 -n03495258 -n02676566 -n03499907 -n04506289 -n03272010 -n04536153 -n04536866 -n02992211 -n04536335 -n04536595 -n04330998 -n04419642 -n03273551 -n04376400 -n03928116 -n03039015 -n03854065 -n02672831 -n03452741 -n04515003 -n04278353 -n03738066 -n02766792 -n03086457 -n03496296 -n04278247 -n03840681 -n04598582 -n02891788 -n03854815 -n03393324 -n04579667 -n03945615 -n03609397 -n03372029 -n02817799 -n03228016 -n04222847 -n02804610 -n03838899 -n03037709 -n04141076 -n02793089 -n02912894 -n03369276 -n03394916 -n04487394 -n03110669 -n03494537 -n03494278 -n03086670 -n03006626 -n03884397 -n02775483 -n03343354 -n03912218 -n03245724 -n02803934 -n02804252 -n02804123 -n03301568 -n03483230 -n02869249 -n03447721 -n04532831 -n04311174 -n03721384 -n03440682 -n03017168 -n03612965 -n03720891 -n03249569 -n03157348 -n02869737 -n02803666 -n04387400 -n04249415 -n04410086 -n04243941 -n03996416 -n03999992 -n02769290 -n04004475 -n03702248 -n03789946 -n04252653 -n02977058 -n03322940 -n03082979 -n04613939 -n03765561 -n04303357 -n03997484 -n03087069 -n04303497 -n04237423 -n04417180 -n04064401 -n02938886 -n04525305 -n04243546 -n02760199 -n03418915 -n02829596 -n03551395 -n04024274 -n03007591 -n03563200 -n04004767 -n03250405 -n03672827 -n03643737 -n03675235 -n04419868 -n03985069 -n04505036 -n02794664 -n04595285 -n03225777 -n02909285 -n03571942 -n04184435 -n03240892 -n03460040 -n03646296 -n03766044 -n03287733 -n03273061 -n03507963 -n03596285 -n02761557 -n02687423 -n03433877 -n04309049 -n03579982 -n04591517 -n03424630 -n03193107 -n03859000 -n04040373 -n04099175 -n03321103 -n02872333 -n04265904 -n02700064 -n04587404 -n04304375 -n03616763 -n03146846 -n03500699 -n03075634 -n04428191 -n03496892 -n03210245 -n03496612 -n04238763 -n06359193 -n03528523 -n04175147 -n03196324 -n04358117 -n04603399 -n03918480 -n03985232 -n03180011 -n03832673 -n03956785 -n03642806 -n03485407 -n03914337 -n04561422 -n03736064 -n03063485 -n04477219 -n04587559 -n03272125 -n03996145 -n02911332 -n03034663 -n03000684 -n04380916 -n04121728 -n02786837 -n04279462 -n03689157 -n03604156 -n03452267 -n02666196 -n02679257 -n03483823 -n04171831 -n04594489 -n03106898 -n03510244 -n02934168 -n03760310 -n04471632 -n03666362 -n03020034 -n03336575 -n03604843 -n04402984 -n03898129 -n04401828 -n03995265 -n03307037 -n03300443 -n03268918 -n04004990 -n03995535 -n03350602 -n03373237 -n03251932 -n04573937 -n04334365 -n03861271 -n04520784 -n04332243 -n02688273 -n03843555 -n04216634 -n04398834 -n03066849 -n03407865 -n02710201 -n04040759 -n03736970 -n04110955 -n04112430 -n02969010 -n03096960 -n03996849 -n02761392 -n02677718 -n03102859 -n03431243 -n04392764 -n03339529 -n04289027 -n04011827 -n02709367 -n03446268 -n04568069 -n03700963 -n04167346 -n04021798 -n03432129 -n04088797 -n02918595 -n03532672 -n04228215 -n03119510 -n04063154 -n04371774 -n04590746 -n04586581 -n04586421 -n03189083 -n04211528 -n03296081 -n02903204 -n03150232 -n04282494 -n03082807 -n02686227 -n02962200 -n03198500 -n02973017 -n04475411 -n03431745 -n04306592 -n02692086 -n04154152 -n04020298 -n04574999 -n03559999 -n03659809 -n03566329 -n03767203 -n04563204 -n04101701 -n02836035 -n02980036 -n03460147 -n04115144 -n03334912 -n04543772 -n04563413 -n02974003 -n04289690 -n03944341 -n03992509 -n03430551 -n03244919 -n03874293 -n04113194 -n04290507 -n02833793 -n03943115 -n04051549 -n02764505 -n04154340 -n03456299 -n03425413 -n02835724 -n04354487 -n03487886 -n02995871 -n03329302 -n04102406 -n02966193 -n04510706 -n03054901 -n03393761 -n03209359 -n02860415 -n04067472 -n04211857 -n02848523 -n03473227 -n03032811 -n04111668 -n03873699 -n03563460 -n03320421 -n03208556 -n04019541 -n02890188 -n04448361 -n03397947 -n03954393 -n04385799 -n03712111 -n04519153 -n04313503 -n03450018 -n03602883 -n04072193 -n04372370 -n02783459 -n02927887 -n04438507 -n03374649 -n03325088 -n04422875 -n02727141 -n03775636 -n04327682 -n04445952 -n04027023 -n03186818 -n03537412 -n03793850 -n03222516 -n02826589 -n03363549 -n03795758 -n03469493 -n03103396 -n03301833 -n02686379 -n03432061 -n03389611 -n04579432 -n04218564 -n03743279 -n03506560 -n02824448 -n03123917 -n03028596 -n03201529 -n04275548 -n03794056 -n03680858 -n04568557 -n03819994 -n03639077 -n03352628 -n04529962 -n04283255 -n04283096 -n04112252 -n03357716 -n04117464 -n03536122 -n04592741 -n03303217 -n03271574 -n02887079 -n03176386 -n02768114 -n04320973 -n03933933 -n03934042 -n02767433 -n04190052 -n03638883 -n02783994 -n04283378 -n02797692 -n04314914 -n02887209 -n03938401 -n02817031 -n04098513 -n03057920 -n03495570 -n04081044 -n02888569 -n04386051 -n02871005 -n04341414 -n03506184 -n04161358 -n04430475 -n03490884 -n04038440 -n03495039 -n02953455 -n03632577 -n02871439 -n03719343 -n03814639 -n03622839 -n02713003 -n02768655 -n02737660 -n03505133 -n03019685 -n02741475 -n04148579 -n03105467 -n04190376 -n04220036 -n04094720 -n04515129 -n02886599 -n04476831 -n02815950 -n04590263 -n03223686 -n04318787 -n03592773 -n03073977 -n03988170 -n04360798 -n02974348 -n03443149 -n03821518 -n02864593 -n03637181 -n04402449 -n03733131 -n04436329 -n04119751 -n04433585 -n04045644 -n03437941 -n04436185 -n03366974 -n03601840 -n02970685 -n03937931 -n03955489 -n04123740 -n03002096 -n02835915 -n02910145 -n02770830 -n04325041 -n03288886 -n04485082 -n04275175 -n03704549 -n03801760 -n02943871 -n03262809 -n02759257 -n04009801 -n03340723 -n03643253 -n03656484 -n03838298 -n03087366 -n02943241 -n02709101 -n03094159 -n04355933 -n03309465 -n03333711 -n03395859 -n03987376 -n03049782 -n04403413 -n04583212 -n03967396 -n04147495 -n03733925 -n04565375 -n03467068 -n03231160 -n02708711 -n03813176 -n03852280 -n03739693 -n03575958 -n02981911 -n03308152 -n04419073 -n04089836 -n04383015 -n03070193 -n03760944 -n02670382 -n04340521 -n03709206 -n03092656 -n04403638 -n03760671 -n02751295 -n03293863 -n03852688 -n04044716 -n04070207 -n03333129 -n04068601 -n02978478 -n03822767 -n04145863 -n03715114 -n03279508 -n03332989 -n03667829 -n02841506 -n03484931 -n03850053 -n03082280 -n03692522 -n03868643 -n03247083 -n04070415 -n04053508 -n02794156 -n03904782 -n04421872 -n02751215 -n03735637 -n03429288 -n04437953 -n02710600 -n02939866 -n03991837 -n04382880 -n04141975 -n04392113 -n03753077 -n03554460 -n04180888 -n04118776 -n02699915 -n04029734 -n03736470 -n04559730 -n04518343 -n02710429 -n03424862 -n04001499 -n03718335 -n04274985 -n02753394 -n03046257 -n04555897 -n04355338 -n04438304 -n03544143 -n03452594 -n03196217 -n02694662 -n04548280 -n02708093 -n03909406 -n03145147 -n03197337 -n02708433 -n03973839 -n04607869 -n04328186 -n03891332 -n03026907 -n04528968 -n03759661 -n02777100 -n02708555 -n03277459 -n03272810 -n03841143 -n02702989 -n04273796 -n03842986 -n04561287 -n04541320 -n03708843 -n04449966 -n03467984 -n02879718 -n02880393 -n02892948 -n03624134 -n04373894 -n04346157 -n04008634 -n02715712 -n03343853 -n04177041 -n02689274 -n03423306 -n03875955 -n02950826 -n02759963 -n03948459 -n04502851 -n03732020 -n03803116 -n04090263 -n04076284 -n04171459 -n02760429 -n03416775 -n03695857 -n04171629 -n02760855 -n02749479 -n02760658 -n03701391 -n04347519 -n02923682 -n04517211 -n03607659 -n04450133 -n03073296 -n03178674 -n04086273 -n03427202 -n03363749 -n03802007 -n04250224 -n04585980 -n02961451 -n03136369 -n03687928 -n03615790 -n02812949 -n03699591 -n03158885 -n04054361 -n03327691 -n02904640 -n02987492 -n04121511 -n03292475 -n03375575 -n02916350 -n02950943 -n03080633 -n04015908 -n02745611 -n03178000 -n03706229 -n03080497 -n02841315 -n04272054 -n04009552 -n04403925 -n03443912 -n04356056 -n04238617 -n03399761 -n03795976 -n03864692 -n03555662 -n02963503 -n04376876 -n04317175 -n03643149 -n03858183 -n04364545 -n04083800 -n03514451 -n03938037 -n04056180 -n03302671 -n04477387 -n04080833 -n04251144 -n03868863 -n02731629 -n03876231 -n04287747 -n02889646 -n03484576 -n03323703 -n04162706 -n03652932 -n04125853 -n02891188 -n03803284 -n02999936 -n02865665 -n02910353 -n03627232 -n03041114 -n03051249 -n02982599 -n03940256 -n03229244 -n04153751 -n04238321 -n02928608 -n04159354 -n03887185 -n03682487 -n04431745 -n03683606 -n03038281 -n03043958 -n02960690 -n03804744 -n04445327 -n03836451 -n02881906 -n02880189 -n03644858 -n03497352 -n04095342 -n03476313 -n04227900 -n03499354 -n02903126 -n02860640 -n02796318 -n04127249 -n04197781 -n03057541 -n04554871 -n03423719 -n03503477 -n03855604 -n03874599 -n04136800 -n03645011 -n03075370 -n03223162 -n03886762 -n02915904 -n03476684 -n03551084 -n03208938 -n03250089 -n04505470 -n04036303 -n03085013 -n03928814 -n03033362 -n04168199 -n03589513 -n03098140 -n04401949 -n03034244 -n03968293 -n03275681 -n03163222 -n04470953 -n04257986 -n02715229 -n02955247 -n04269270 -n04072960 -n04364160 -n04257790 -n02810471 -n04414675 -n03048883 -n04595855 -n03084420 -n03577090 -n03778817 -n04004210 -n03578656 -n03125057 -n03033986 -n03788047 -n03274561 -n03261776 -n03759954 -n03691459 -n04402580 -n03505667 -n03087816 -n02963692 -n04502670 -n02917377 -n04390873 -n04599124 -n04349401 -n03846772 -n03204955 -n04041747 -n04404817 -n03207305 -n04142999 -n04610274 -n04540547 -n03359285 -n03651388 -n03870980 -n04013729 -n04258138 -n03773035 -n03485198 -n02965783 -n04059947 -n03861842 -n02921756 -n02761834 -n04201064 -n03343737 -n04058594 -n04143140 -n04494204 -n03211117 -n03918737 -n03221351 -n04464615 -n03793489 -n02714751 -n03506727 -n02823124 -n04484432 -n03913343 -n03085219 -n03782190 -n04152593 -n03196598 -n03676759 -n03361380 -n04588739 -n03187268 -n02940570 -n03085602 -n02769075 -n02988066 -n03027250 -n03070059 -n03525454 -n04538552 -n02948557 -n03031152 -n02947818 -n03746005 -n03746155 -n02935017 -n03851787 -n03706653 -n03744276 -n03708036 -n04063868 -n02763306 -n03079230 -n04533946 -n02988679 -n02988486 -n02757061 -n03492542 -n03209910 -n03359436 -n04052757 -n04534359 -n02979399 -n04391838 -n03924069 -n03694639 -n04178190 -n03636248 -n03665366 -n03358172 -n03640988 -n02948072 -n03818343 -n04534895 -n04384910 -n03423877 -n03844045 -n03549897 -n03370387 -n04335886 -n04286575 -n03272383 -n03590841 -n03018712 -n03359137 -n03665924 -n03911767 -n03503997 -n04107743 -n04339879 -n03318294 -n04148703 -n04160847 -n03824713 -n02852173 -n04456115 -n03365374 -n03401129 -n03442597 -n03187037 -n04529108 -n03975232 -n03668279 -n03482523 -n04371050 -n03772584 -n04164757 -n03544238 -n04288272 -n04116098 -n03066359 -n02886321 -n03525074 -n04585745 -n03281145 -n03126707 -n04575824 -n03178430 -n03733281 -n03078287 -n03820728 -n03440216 -n04080138 -n03302938 -n03738241 -n03085915 -n04141712 -n04082886 -n04545858 -n04041544 -n04400289 -n04402746 -n03578055 -n03580845 -n04404412 -n04137897 -n04365328 -n03072201 -n03681477 -n04358491 -n03300216 -n04595028 -n04008385 -n03674440 -n04366116 -n03401279 -n03957315 -n04488202 -n04555700 -n03206908 -n02893692 -n03210683 -n03991062 -n02920658 -n04074185 -n03147509 -n02774152 -n02978881 -n03256032 -n02773037 -n03733805 -n03438257 -n03875806 -n03733644 -n03291819 -n04183329 -n03935335 -n02801938 -n04179712 -n04139859 -n03994614 -n02946921 -n04576211 -n04600312 -n02839910 -n02949542 -n03779370 -n02964843 -n04533700 -n02975212 -n02974697 -n04531098 -n03233905 -n04060904 -n03871083 -n04560292 -n02883344 -n03062336 -n03920288 -n03456024 -n04176190 -n04499062 -n04350581 -n02880940 -n02978753 -n04050933 -n02927764 -n04130257 -n03775546 -n03984759 -n02997910 -n04263257 -n04023695 -n04103769 -n02682922 -n04254120 -n02754103 -n03571280 -n03174731 -n02815749 -n03629520 -n03063073 -n03002948 -n04397452 -n03216710 -n03301940 -n04207343 -n03055418 -n04083309 -n02769748 -n04122685 -n02816656 -n04134008 -n02970408 -n03883524 -n03253886 -n02870676 -n04452528 -n03709823 -n04026417 -n03235796 -n03291963 -n04124098 -n04122825 -n03993180 -n04204081 -n04446844 -n03414029 -n03619793 -n03958227 -n03445617 -n04235860 -n03469903 -n03461288 -n04284572 -n03972524 -n04544450 -n03321563 -n03521899 -n03898395 -n03372549 -n04496872 -n04559910 -n02918831 -n03676623 -n04249882 -n04206225 -n02823750 -n04119360 -n03443371 -n04592099 -n03062245 -n04131690 -n03914438 -n03883385 -n03050864 -n03482405 -n02893608 -n04204238 -n04582349 -n03764736 -n02823510 -n04255586 -n03904433 -n02946509 -n04103364 -n03791053 -n04170037 -n04509417 -n04543158 -n02804515 -n03484083 -n02766534 -n02834778 -n03538634 -n04467099 -n02959942 -n04482393 -n02740533 -n04065272 -n04464852 -n04252077 -n02916179 -n03684823 -n04335435 -n03791235 -n04465501 -n03384352 -n02740300 -n02739889 -n03256788 -n02946348 -n04520382 -n04211219 -n03193597 -n03272562 -n04389854 -n04465358 -n04310018 -n03193260 -n03193423 -n03506880 -n04490091 -n02704792 -n03389761 -n03790512 -n03444034 -n02958343 -n04252225 -n03345487 -n04520170 -n04467665 -n04474035 -n03417042 -n03632852 -n04461696 -n03256166 -n04465666 -n03930630 -n03173929 -n03796401 -n03896419 -n03977966 -n02871314 -n04466871 -n03785016 -n02814533 -n03680512 -n03777568 -n03268790 -n03770679 -n03100240 -n03079136 -n02930766 -n04201733 -n04037443 -n03498781 -n04097373 -n02831335 -n04285965 -n04166281 -n03594945 -n03670208 -n03141065 -n02701002 -n04516354 -n04322801 -n04347119 -n03870105 -n03543394 -n04285008 -n03119396 -n03122295 -n02970849 -n03538406 -n03255899 -n03599486 -n03981924 -n03868242 -n04397027 -n03648431 -n04176068 -n02797295 -n04204347 -n03490119 -n02835271 -n04126066 -n04026813 -n03792782 -n02968473 -n03435991 -n02912557 -n04297098 -n03389889 -n02775039 -n03393912 -n03895866 -n02932523 -n02885108 -n04389521 -n03828020 -n04020912 -n03200357 -n04246855 -n04065789 -n02747177 -n03678558 -n04134523 -n03935116 -n02900705 -n03078995 -n03210372 -n03619650 -n04548362 -n02962843 -n03986355 -n03214582 -n03031012 -n04200000 -n03468821 -n02755140 -n03683995 -n04608435 -n04556533 -n02774630 -n03438863 -n03487533 -n04137217 -n02773838 -n04491769 -n03498441 -n03420345 -n04570815 -n02967294 -n03986949 -n03865371 -n04518764 -n02863750 -n03355768 -n02881193 -n03633091 -n02876657 -n02877266 -n03990474 -n03950228 -n02808440 -n03786901 -n02909870 -n03241496 -n03129001 -n04591887 -n04001265 -n04493381 -n03572321 -n04438897 -n02801525 -n03784270 -n02758960 -n03029445 -n02795169 -n04388743 -n03593526 -n02993368 -n04447028 -n03350204 -n04149083 -n04263336 -n04246060 -n03983396 -n04557648 -n03603722 -n02985963 -n03449451 -n03937543 -n02962061 -n03359566 -n02823428 -n03571625 -n03174450 -n04579056 -n03140431 -n04591713 -n02960903 -n03923379 -n04579145 -n04560804 -n03521675 -n03295246 -n04422727 -n02952374 -n04518132 -n03709363 -n03595409 -n04139140 -n04398044 -n03259401 -n04516214 -n04324297 -n03612814 -n02939185 -n03915118 -n04397768 -n03063689 -n03064250 -n04132985 -n04399158 -n04225031 -n03543603 -n03379343 -n03797390 -n03693707 -n04389430 -n03063599 -n04443766 -n02824058 -n02836174 -n02843158 -n04553703 -n02788572 -n02823335 -n04592005 -n03610418 -n03426134 -n04560113 -n04173046 -n02732072 -n04078574 -n04562935 -n04049303 -n02951703 -n02705429 -n03101664 -n02815834 -n04516116 -n03725600 -n04522168 -n03133415 -n03593122 -n03960374 -n04476259 -n02982515 -n03259009 -n03004275 -n04131929 -n03416900 -n03565830 -n03543735 -n03858085 -n04255163 -n02747802 -n03871628 -n02919414 -n03167978 -n02778456 -n03500389 -n03870672 -n02782681 -n02971356 -n03064758 -n04200258 -n04253057 -n03908618 -n03127925 -n02786331 -n04589325 -n03014705 -n04340750 -n02998003 -n03710193 -n02978055 -n02836392 -n03871724 -n04452615 -n04462011 -n03064350 -n03535024 -n04477548 -n02989099 -n02977438 -n04125257 -n02976939 -n04125021 -n04469813 -n03002341 -n04214282 -n04019101 -n04172342 -n03538179 -n04524313 -n04231693 -n04103918 -n04467307 -n04196502 -n03678362 -n03306385 -n04212165 -n04468005 -n02924116 -n03680942 -n03394272 -n03896233 -n04349306 -n03711044 -n03394480 -n03078802 -n02917067 -n04487081 -n03769881 -n04146614 -n04310157 -n02918964 -n04099429 -n03764276 -n03773504 -n03125870 -n04235291 -n03478589 -n04389033 -n03886053 -n03919096 -n03549199 -n02686568 -n04530566 -n04264914 -n03547229 -n03510583 -n04308084 -n03666917 -n03491032 -n03439814 -n03512147 -n04552348 -n02691156 -n02759387 -n02867715 -n02704645 -n04012084 -n02690373 -n02842573 -n03365231 -n03595860 -n03335030 -n04308273 -n04160586 -n02686121 -n04583620 -n03604311 -n03596543 -n04308397 -n03577672 -n02692877 -n02850950 -n02782093 -n03541923 -n02858304 -n04476116 -n04610013 -n04194289 -n04128837 -n02792409 -n03662601 -n03977592 -n03447447 -n04158807 -n02792552 -n04095210 -n04495843 -n04024983 -n03939178 -n04244997 -n03329663 -n04409128 -n02947660 -n03344393 -n03790230 -n03236423 -n03981566 -n03545470 -n04229480 -n02951358 -n03199901 -n04037964 -n03105306 -n04612504 -n03436891 -n03602081 -n04115456 -n03609235 -n03861430 -n03254374 -n04038231 -n04038338 -n04273569 -n03859170 -n02932891 -n03552749 -n04197110 -n04606251 -n03896103 -n03947888 -n03668488 -n03541269 -n04309348 -n02965300 -n04224543 -n04552696 -n03673027 -n03698604 -n02965216 -n03141327 -n03874138 -n04317063 -n02878222 -n03095699 -n02784124 -n03845190 -n04347754 -n03466493 -n03397266 -n02812201 -n03466600 -n02687172 -n03718212 -n03180504 -n02755529 -n03811295 -n04612373 -n03045228 -n03327133 -n04242408 -n03612010 -n03186285 -n04128499 -n02793199 -n04147183 -n04587327 -n04483307 -n02981792 -n02982416 -n04266014 -n04264765 -n03218198 -n02860847 -n02861022 -n04336792 -n03122202 -n06271778 -n06255081 -n06263609 -n06276697 -n06272290 -n06276501 -n06277280 -n06281040 -n06277135 -n06278338 -n06278475 -n06274760 -n06272803 -n06272612 -n06263369 -n06266417 -n06595351 -n06267145 -n06596607 -n06596727 -n06596364 -n06596474 -n06267893 -n06267564 -n06267655 -n06266633 -n06267991 -n03938244 -n03872495 -n04135315 -n02823964 -n03408444 -n02967626 -n04053677 -n04151940 -n04453910 -n03380867 -n04014297 -n03045698 -n04605726 -n04513827 -n03050026 -n03724870 -n03341153 -n03366823 -n03058107 -n02952237 -n03357376 -n03221059 -n03376279 -n03956623 -n03261603 -n02944459 -n04201297 -n02954938 -n03717622 -n03661340 -n04041243 -n02877765 -n03825788 -n03047690 -n04199027 -n02735538 -n02872752 -n03361550 -n04241394 -n03865949 -n04122578 -n04239786 -n03027625 -n04124370 -n04272389 -n02904927 -n04593524 -n04545748 -n02855701 -n02713364 -n03041449 -n03411079 -n03680355 -n04120489 -n03868406 -n02882894 -n03967270 -n04022332 -n04133789 -n03025250 -n04027706 -n04386664 -n03364008 -n03297103 -n03600475 -n02925666 -n04228581 -n03521544 -n04089666 -n04116294 -n03516844 -n04542715 -n03124043 -n03798061 -n02873733 -n03067518 -n03046133 -n04554211 -n04444749 -n03797896 -n04192858 -n02888270 -n04151581 -n04187233 -n02826068 -n04181718 -n04191943 -n04281375 -n04416005 -n04105068 -n03314608 -n03530910 -n04187061 -n02955065 -n03725035 -n03315644 -n03142679 -n02937958 -n02739668 -n02840245 -n02840619 -n03546766 -n02851099 -n03673767 -n03959701 -n03539433 -n02740764 -n02895154 -n03513376 -n02950632 -n03623338 -n03929855 -n04130907 -n04589890 -n03347037 -n04590553 -n03788365 -n03637318 -n03889871 -n03652729 -n02825657 -n04172776 -n02843684 -n02951843 -n03610524 -n02763901 -n04507155 -n03415252 -n03409591 -n04357121 -n03718789 -n03220513 -n03522100 -n04435653 -n03546235 -n04523525 -n04234887 -n03413684 -n04417672 -n03148727 -n03435593 -n03847471 -n02796207 -n04087709 -n03527444 -n04141327 -n04207763 -n03548086 -n04423845 -n03213538 -n03657121 -n03424325 -n03314378 -n04229816 -n02983189 -n02862048 -n04192698 -n03000247 -n02916936 -n03112719 -n03146219 -n02933340 -n04045255 -n02873520 -n04589190 -n03592669 -n03151077 -n04211356 -n04525584 -n04590129 -n04102285 -n04418357 -n04209239 -n02925107 -n02890513 -n03436549 -n03291741 -n02992368 -n07248320 -n03590306 -n03958752 -n04207151 -n03885293 -n03654576 -n02767665 -n03114379 -n02785648 -n02876084 -n04240752 -n02820210 -n04236377 -n02851939 -n03309356 -n04231272 -n04162433 -n02786058 -n04369025 -n02979836 -n03267821 -n04033995 -n02683323 -n02849154 -n02822220 -n03731483 -n03898633 -n03266749 -n03128427 -n03123553 -n04034262 -n04046400 -n03688405 -n04118021 -n03223299 -n03727837 -n04144539 -n04183217 -n03998194 -n02904233 -n04297847 -n04066270 -n02908773 -n03353951 -n03445326 -n04528079 -n03875218 -n03805725 -n03437430 -n03115897 -n03284743 -n04525417 -n03342015 -n03284886 -n03285578 -n03844233 -n04557308 -n03646020 -n04581102 -n03261019 -n03973402 -n03642444 -n04450994 -n04084889 -n04412097 -n03337383 -n03729308 -n03970546 -n03802393 -n04395024 -n04525038 -n02809105 -n03615406 -n02828427 -n04123567 -n03188725 -n04539794 -n03253796 -n03013850 -n03115400 -n04459610 -n03132666 -n03885194 -n03019938 -n03326795 -n03115180 -n04525191 -n04138261 -n03625355 -n04137355 -n04003856 -n03356982 -n04568841 -n03409297 -n02944579 -n04605163 -n02977330 -n04395106 -n03779128 -n02904803 -n04524941 -n04198453 -n02878425 -n03703862 -n03819595 -n03877351 -n04613015 -n03914831 -n03932670 -n03785237 -n04414476 -n04056932 -n02675219 -n03106722 -n03917814 -n03016868 -n02922798 -n04432662 -n02802990 -n03631177 -n04189282 -n03435743 -n03983612 -n03175189 -n03357267 -n04184316 -n02942460 -n03836906 -n03233123 -n03430091 -n03855214 -n03386726 -n03437741 -n04599235 -n04350458 -n04383839 -n03653110 -n04502502 -n03854421 -n02952109 -n03298858 -n03160740 -n03843438 -n04393549 -n02903852 -n03947798 -n03529444 -n04482297 -n03227317 -n03595523 -n03429914 -n04496614 -n03016609 -n03485794 -n03463666 -n03258330 -n03207743 -n04459362 -n02786198 -n03471190 -n02834397 -n04127904 -n03897943 -n03490006 -n03887697 -n03207835 -n03381776 -n03383099 -n04278447 -n03505383 -n04455652 -n03712337 -n02782602 -n03598151 -n03775747 -n03410571 -n03696568 -n04307767 -n03645577 -n03358380 -n04208065 -n03809603 -n02820556 -n03703730 -n03938522 -n04045397 -n03663531 -n03662719 -n03703945 -n03662887 -n04326084 -n02897820 -n14943580 -n14785065 -n15074568 -n14820180 -n04035912 -n03766935 -n04313628 -n03530511 -n03460297 -n03149686 -n03455488 -n03344642 -n03796522 -n03043693 -n02681392 -n04339638 -n15102455 -n04234455 -n03341297 -n04453390 -n14908027 -n14976759 -n03111177 -n03282401 -n03451798 -n03292603 -n03815149 -n03723267 -n02892304 -n07621618 -n02732572 -n03178782 -n02681518 -n03397087 -n03635108 -n04395651 -n03762602 -n03282591 -n06883725 -n03516367 -n04682462 -n03354903 -n02788021 -n04458633 -n03140292 -n03362890 -n05244934 -n11487732 -n03597469 -n03397532 -n03649161 -n03914106 -n02787435 -n03030262 -n02685082 -n02887970 -n02852043 -n03909020 -n03814906 -n03436075 -n03899328 -n04096066 -n03895293 -n04215402 -n04461570 -n03904183 -n03519981 -n02969323 -n04426618 -n04466613 -n03215508 -n03306610 -n02744323 -n02762508 -n02758863 -n04335209 -n04334599 -n03948242 -n03539678 -n02680512 -n03089014 -n03895585 -n04493505 -n04244379 -n04250850 -n04562496 -n02984469 -n02795528 -n03944672 -n03533014 -n04385536 -n03231912 -n03147280 -n04257684 -n04497962 -n04298661 -n03415749 -n02981024 -n04048441 -n04391569 -n02784218 -n03572107 -n02680337 -n03957420 -n02992795 -n03506028 -n03438071 -n04440749 -n02739427 -n04040247 -n02971167 -n04381994 -n04087432 -n03153375 -n03438661 -n03527149 -n03963198 -n04284002 -n04380346 -n03383948 -n04284438 -n04263502 -n04398688 -n04350769 -n04597913 -n03557270 -n04381073 -n03180384 -n02976249 -n02928049 -n04307986 -n04380255 -n02973805 -n02687992 -n04406817 -n02693246 -n02692232 -n03745146 -n04329190 -n04306080 -n04551055 -n03452449 -n03131669 -n03768916 -n03214253 -n03587205 -n03406966 -n03093574 -n03672352 -n03051540 -n02729837 -n03655720 -n03456186 -n02855925 -n03825080 -n04015204 -n03859495 -n03815482 -n03625943 -n03692379 -n02728440 -n03068998 -n03763968 -n03502509 -n03877472 -n03419014 -n02742322 -n04596852 -n03863108 -n03441112 -n02671780 -n02846141 -n03381126 -n02756098 -n04059157 -n02814774 -n03746330 -n04335693 -n04241249 -n04194127 -n03863262 -n04001845 -n02738859 -n03386870 -n03216402 -n02730930 -n04207903 -n03121897 -n03015478 -n03268645 -n04266375 -n03623198 -n03450516 -n04532106 -n03010795 -n02669723 -n02811719 -n03324928 -n03239259 -n03615563 -n03513137 -n03531281 -n04498389 -n03497657 -n02954340 -n03124474 -n04432203 -n03379051 -n03492922 -n03127747 -n04356595 -n03404360 -n03124170 -n02817516 -n02859184 -n04248507 -n03325941 -n02987379 -n04259630 -n04482177 -n02818135 -n03984643 -n02869837 -n03950899 -n02881757 -n03766322 -n03046029 -n03937835 -n02799323 -n03103563 -n04209133 -n03610682 -n02776825 -n03331077 -n04387095 -n02831237 -n04232153 -n03049924 -n04228693 -n04556408 -n02807133 -n03787032 -n04612026 -n02816768 -n03502331 -n04143897 -n04104770 -n03188531 -n04605572 -n04097866 -n04574067 -n03655072 -n04230808 -n04508163 -n04172904 -n04531873 -n04197391 -n03863923 -n03540090 -n02922578 -n04488530 -n04489008 -n04332580 -n03404149 -n03816005 -n04370774 -n03657511 -n04371563 -n03487642 -n04046277 -n04350905 -n04370048 -n03450734 -n03314884 -n03826039 -n02998841 -n03719743 -n03797182 -n03505504 -n04495698 -n03325584 -n04325704 -n03520493 -n03615655 -n03237992 -n03617480 -n02667093 -n02807616 -n03410938 -n04269822 -n03866082 -n03454442 -n03770439 -n03617312 -n03732458 -n02780815 -n03205669 -n04136333 -n03534580 -n03920737 -n02892767 -n03387323 -n04223299 -n03421324 -n03132776 -n04508949 -n02863014 -n02944146 -n04514241 -n03013580 -n04508489 -n03112869 -n03885788 -n04103665 -n03673450 -n03688192 -n02930214 -n04509171 -n03824381 -n02854739 -n04426427 -n02837887 -n02901114 -n03885028 -n03234164 -n04602956 -n03629231 -n03595614 -n03163381 -n03978966 -n03057021 -n03045337 -n04252560 -n04363777 -n03254046 -n04187970 -n03398228 -n03630383 -n03456665 -n03589791 -n04049405 -n02957008 -n04123448 -n03404251 -n03751269 -n04222307 -n02867966 -n03902756 -n04368496 -n03228254 -n02864504 -n03891051 -n03844815 -n04479046 -n03770954 -n04122492 -n03980874 -n04445154 -n04445040 -n03607923 -n04173907 -n04497570 -n04186455 -n02936402 -n04205318 -n03877674 -n04370288 -n04132158 -n02896442 -n03019434 -n04233715 -n03600285 -n03903733 -n03688605 -n03594734 -n03107488 -n03660124 -n04337287 -n02825442 -n02910864 -n03543112 -n02831595 -n03653833 -n03815615 -n03128085 -n02865351 -n04591157 -n02883205 -n02847631 -n03710721 -n04371430 -n02837789 -n03226538 -n03943920 -n04222470 -n03885669 -n02925519 -n04427715 -n04504141 -n04502197 -n02963159 -n04370456 -n04021028 -n04453666 -n03464053 -n02944075 -n03236735 -n02861387 -n02854926 -n03480579 -n03062015 -n04136161 -n02936570 -n04355511 -n03013438 -n04334105 -n03450230 -n03604400 -n03205574 -n02898585 -n04397645 -n02781121 -n03429682 -n03775071 -n03616979 -n02827606 -n03405595 -n03781683 -n03527565 -n02972397 -n03540267 -n04434932 -n04254777 -n04323819 -n03885904 -n03710637 -n02752496 -n04378956 -n03622931 -n02736798 -n03836976 -n03026506 -n03384891 -n03289985 -n03859958 -n02726017 -n03113657 -n03320519 -n03113835 -n03398153 -n04285803 -n02669534 -n03206718 -n03476083 -n03201776 -n02780704 -n03201638 -n03239054 -n02683454 -n04459018 -n04584207 -n03237416 -n02887489 -n02752615 -n03528263 -n03251766 -n04517823 -n03584829 -n04488857 -n03150511 -n04580493 -n04179913 -n04174101 -n03620052 -n03534776 -n04475631 -n04309833 -n03207941 -n04070727 -n04554684 -n03102654 -n03273913 -n03557590 -n03170635 -n04442312 -n03761084 -n04442441 -n03063338 -n03543254 -n04542943 -n03212114 -n03297495 -n04330340 -n03862676 -n03378174 -n03557692 -n03102371 -n03273740 -n03425595 -n04003241 -n02905036 -n04111531 -n03259280 -n03425241 -n03483316 -n03050655 -n04277826 -n04496726 -n04607242 -n02808304 -n03219010 -n04499446 -n02821030 -n03938725 -n04188179 -n04439712 -n03971218 -n03223553 -n02856463 -n03250279 -n03882058 -n03635668 -n02846511 -n04251791 -n04189816 -n02731900 -n04225987 -n04214046 -n04149813 -n04543996 -n03502200 -n03005285 -n03969259 -n04254009 -n04446521 -n04208936 -n04559451 -n03371875 -n03993053 -n04108268 -n03106110 -n03644378 -n02919890 -n04290079 -n03107046 -n04426788 -n02874537 -n04581829 -n03641569 -n03367545 -n04598965 -n04605321 -n00004475 -n00006484 -n12739332 -n00017222 -n00015388 -n01326291 -n11537327 -n00007846 -n12992868 -n00005787 -n12172906 -n13083586 -n13123431 -n11536673 -n11552806 -n13083023 -n13100156 -n12476510 -n11545524 -n11552386 -n13121544 -n12205694 -n13100677 -n13103136 -n13085113 -n13084834 -n13134302 -n13084184 -n12477163 -n12477583 -n12477747 -n12480895 -n12479537 -n12481458 -n11547562 -n11545714 -n13221529 -n13220122 -n13223265 -n13223588 -n13223710 -n12953206 -n13194572 -n13205058 -n12961879 -n12953484 -n13186654 -n13197274 -n13173882 -n13229543 -n13192625 -n13185269 -n13193642 -n13207335 -n13183056 -n13200651 -n13195341 -n13206817 -n13199970 -n12957924 -n13198914 -n13199717 -n13215586 -n13190747 -n13193856 -n13194036 -n11665372 -n11596108 -n12694486 -n11666854 -n11669921 -n11672400 -n12606438 -n12799776 -n11736694 -n12008487 -n11955896 -n12879527 -n12884260 -n12034141 -n12290748 -n12026476 -n12833149 -n11892817 -n12914923 -n11969607 -n11794024 -n12026018 -n11672269 -n12830222 -n11811473 -n12022054 -n11971406 -n11826198 -n12950314 -n11857875 -n11988596 -n11939699 -n11915214 -n11821184 -n12293723 -n11814584 -n11725015 -n12890265 -n11733312 -n11859472 -n11971248 -n11888800 -n11971927 -n12898774 -n11810358 -n11904109 -n11943407 -n11978233 -n12683407 -n12950126 -n11726707 -n11813077 -n11889619 -n11905749 -n11812910 -n11900569 -n12020184 -n11960245 -n11859737 -n12909421 -n12041446 -n12909917 -n11992806 -n11807979 -n11925303 -n11971783 -n11939491 -n11918473 -n11989869 -n11727091 -n11793779 -n11891175 -n11792341 -n11839568 -n11943660 -n11947802 -n12475242 -n11815491 -n12480456 -n11839823 -n11732567 -n12475035 -n12360108 -n12833985 -n11941924 -n11883328 -n11719286 -n11736851 -n11887119 -n12001707 -n11950345 -n11892637 -n11805956 -n11892029 -n11806219 -n12008252 -n11918286 -n11962272 -n12093600 -n12836862 -n12093329 -n11733054 -n12020507 -n11931918 -n11958080 -n12877838 -n11812094 -n11811706 -n11923174 -n12023726 -n12023407 -n11923637 -n11990313 -n11915899 -n12030908 -n12015221 -n11990167 -n11981192 -n11980318 -n11972759 -n11921395 -n12294124 -n12295796 -n12294723 -n12294331 -n12294871 -n12296432 -n12295033 -n11726269 -n11725821 -n11725973 -n12891305 -n12891643 -n11978713 -n11979527 -n11978961 -n11979715 -n12683571 -n12683791 -n11901759 -n11908549 -n11901294 -n11903671 -n11901977 -n11902389 -n11908846 -n11901597 -n11905392 -n11902200 -n11906917 -n12044467 -n12052787 -n12056217 -n12075830 -n12055516 -n12083113 -n12047884 -n12048056 -n12080820 -n12070381 -n12061380 -n12080395 -n12061614 -n12074408 -n12070583 -n12071744 -n12049282 -n12047345 -n12064389 -n12075010 -n12052447 -n12053405 -n12050533 -n12077944 -n12086539 -n12064591 -n12058822 -n12046028 -n12083591 -n12073991 -n12043444 -n12086012 -n12073554 -n12046815 -n12063639 -n12058630 -n12084890 -n12070016 -n12076223 -n12069679 -n12048399 -n12049562 -n12076577 -n12086192 -n12074867 -n12075299 -n12072722 -n12066018 -n12084555 -n12070712 -n12079963 -n12065316 -n12059314 -n12085664 -n12050959 -n12062468 -n12085267 -n12078172 -n12057211 -n12057447 -n12056758 -n12056601 -n12043836 -n12043673 -n12067193 -n12066630 -n12062781 -n12062626 -n11808299 -n11808721 -n11808932 -n11808468 -n11809594 -n11809094 -n11727358 -n11727738 -n11727540 -n11816649 -n11816336 -n11816829 -n11816121 -n11815918 -n11815721 -n12362274 -n12362668 -n12361946 -n11950877 -n11950686 -n11961100 -n12020736 -n12020941 -n11934616 -n11933546 -n11934807 -n12879963 -n12015959 -n11836722 -n11860555 -n12258885 -n11980682 -n12016567 -n11737534 -n11965627 -n11991263 -n11989393 -n12006766 -n12887293 -n12937130 -n12291959 -n11972291 -n11927215 -n12012111 -n11970586 -n11963932 -n11966215 -n11966083 -n12006930 -n12007196 -n11600372 -n11599324 -n11603246 -n11602873 -n11603835 -n11601333 -n12484784 -n12610328 -n11791569 -n11714853 -n13122364 -n11715430 -n11715678 -n12801781 -n11728099 -n11786131 -n12150028 -n12801520 -n11789066 -n11792742 -n12152532 -n12151615 -n12152722 -n11733548 -n11720353 -n12810595 -n12342299 -n13238375 -n12867826 -n12665048 -n11973341 -n12312728 -n11818069 -n12848499 -n11779300 -n12822955 -n12816508 -n12719684 -n12350758 -n12095020 -n11861641 -n11962667 -n12870891 -n12939282 -n12812478 -n12031927 -n12023108 -n12858150 -n12861892 -n12841007 -n12212361 -n12869061 -n12906214 -n12910285 -n12486574 -n12090890 -n12702948 -n12437513 -n11968931 -n11817914 -n11772408 -n12932173 -n12817694 -n11910460 -n12603449 -n12939874 -n12002428 -n12015525 -n11807108 -n12835331 -n12168565 -n12840362 -n12352287 -n11969166 -n11968704 -n12821895 -n12344283 -n11866248 -n11995092 -n12622875 -n11735053 -n12548280 -n13150894 -n12685431 -n12387633 -n12171966 -n12796022 -n12934036 -n12443323 -n12870535 -n12682668 -n12778605 -n12623077 -n12836212 -n11982115 -n12003696 -n12005656 -n12098403 -n12606545 -n11902709 -n12882945 -n12785889 -n11986511 -n12682411 -n12469517 -n12029635 -n12860365 -n12552309 -n11977303 -n11825351 -n12836337 -n12844939 -n12925179 -n11926833 -n12604228 -n11752578 -n12855042 -n11956850 -n12092262 -n12506991 -n12882779 -n11747468 -n12385429 -n12822115 -n12821505 -n12607456 -n12819728 -n12817464 -n12811027 -n12024445 -n12573474 -n12864545 -n11949402 -n11868814 -n11953038 -n12599435 -n12840749 -n13233727 -n12342498 -n12795555 -n11984542 -n12847008 -n12719944 -n11855274 -n12095647 -n12441183 -n12942572 -n12602980 -n12684379 -n12441390 -n12785724 -n11916696 -n12574320 -n12092417 -n12036939 -n11700058 -n12845413 -n11824146 -n11910271 -n11916467 -n11807525 -n12101870 -n11939180 -n12353754 -n12104501 -n12794985 -n12355760 -n12793015 -n12932966 -n12931542 -n12889713 -n12849061 -n11722466 -n11720643 -n12665857 -n12665271 -n11785668 -n11780148 -n11784497 -n11782036 -n11786539 -n11782761 -n12858871 -n12858397 -n11959632 -n11959862 -n12911673 -n12911440 -n12091213 -n12091550 -n12091377 -n12091953 -n12703557 -n12703190 -n12703383 -n12437930 -n12437769 -n12352639 -n12352844 -n12352990 -n12344700 -n12344483 -n12687957 -n12685831 -n12687698 -n12687462 -n12686274 -n12686077 -n12687044 -n12686676 -n12388989 -n12388143 -n12387839 -n12388858 -n12390099 -n12389501 -n12390314 -n12782915 -n12779603 -n12781940 -n12782530 -n11753700 -n11753355 -n11753143 -n12856680 -n12855494 -n12540250 -n12515711 -n12575322 -n12575812 -n12556307 -n12539306 -n12557681 -n12558425 -n12866162 -n12865824 -n12865037 -n12866635 -n12865562 -n12866002 -n11879054 -n11878283 -n11875691 -n11876634 -n11877193 -n11876803 -n11876432 -n11870418 -n11875938 -n11894327 -n11881742 -n11870747 -n11896722 -n11879722 -n11895092 -n11894770 -n11882074 -n11882426 -n13235503 -n13234678 -n12039317 -n12037691 -n12038406 -n12038585 -n12148757 -n12102133 -n12121610 -n12139575 -n12113195 -n12112918 -n12116429 -n12141495 -n12133462 -n12108871 -n12104238 -n12141167 -n12115180 -n12112008 -n12128071 -n12146311 -n12124627 -n12110778 -n12129134 -n12134025 -n12145477 -n12142085 -n12135898 -n12137120 -n12127030 -n12127768 -n12127460 -n12356023 -n12357485 -n12793494 -n12794135 -n12849279 -n12849416 -n12847374 -n12517642 -n11731659 -n12813189 -n11838916 -n12517445 -n12513172 -n12823859 -n12566954 -n13148208 -n12158798 -n12485981 -n13237188 -n12826516 -n13120211 -n12580654 -n11769621 -n12824053 -n11769803 -n12383402 -n12823717 -n12157769 -n13144794 -n12371439 -n12159055 -n12160490 -n12158443 -n12160303 -n12159388 -n12160857 -n12161969 -n12827270 -n12828791 -n12827537 -n11788727 -n11789589 -n12571781 -n11792029 -n12384839 -n12384227 -n12384037 -n12164363 -n12166128 -n12165170 -n12164881 -n12164656 -n13146583 -n13145040 -n12509476 -n13112664 -n13104059 -n12655869 -n12546183 -n12671651 -n12215579 -n12901724 -n12938193 -n12680864 -n12329260 -n12924623 -n12659356 -n12788201 -n12343480 -n13142504 -n11830906 -n12504783 -n12659539 -n12214789 -n11699442 -n12217453 -n12574866 -n12374418 -n12249542 -n13118707 -n12215022 -n12342852 -n12762896 -n12306717 -n11769176 -n12805146 -n12519089 -n11754893 -n12772908 -n12624381 -n12482031 -n12243109 -n12223764 -n12170585 -n12230794 -n12791329 -n12674120 -n12917901 -n12237486 -n12185859 -n12681893 -n12905412 -n12899537 -n12899752 -n12806015 -n12011620 -n12922763 -n12651229 -n12303083 -n11928352 -n11926365 -n12223569 -n12791064 -n12311579 -n11834654 -n11760785 -n12749679 -n12489815 -n12666965 -n12929403 -n12902662 -n12620196 -n12237641 -n12625383 -n12244153 -n11774513 -n12520864 -n12516828 -n12849717 -n12485653 -n12790430 -n12788854 -n11924445 -n12632335 -n11947251 -n12099342 -n11931540 -n12545635 -n11778257 -n11924849 -n12367611 -n12602262 -n12328567 -n12328398 -n12629305 -n11907689 -n11940006 -n12546962 -n11925898 -n11947629 -n11948864 -n11948264 -n12368451 -n12369309 -n12368028 -n12307240 -n12307076 -n12483427 -n12483625 -n12482893 -n12483841 -n12173664 -n12173912 -n12171316 -n12174521 -n12171098 -n12177844 -n12174311 -n12178896 -n12179122 -n12676534 -n12676703 -n12675876 -n12920204 -n12921868 -n12621410 -n12622297 -n12245319 -n12244650 -n12244819 -n12521394 -n12530818 -n12849952 -n12850336 -n12850168 -n12495146 -n12570972 -n12196129 -n13107694 -n12202936 -n13111881 -n13103877 -n12409231 -n12765115 -n12265600 -n12409470 -n12713866 -n12281241 -n11709205 -n12189429 -n12562785 -n12284821 -n12401335 -n12570394 -n11759224 -n12286988 -n12491826 -n12527738 -n12696492 -n12325234 -n12198286 -n12330891 -n11650558 -n12405714 -n12284262 -n12714755 -n13109733 -n12262553 -n12506341 -n12303462 -n12260799 -n12302071 -n12492106 -n11762433 -n12582231 -n12774299 -n13108481 -n12267411 -n11756092 -n12662772 -n13108662 -n12528549 -n12690653 -n12180885 -n13108545 -n13108323 -n12334293 -n12670758 -n12286826 -n12724942 -n12155009 -n12570703 -n12523475 -n12154773 -n12915811 -n12268246 -n13108131 -n12806732 -n12524188 -n11758799 -n12496427 -n12568186 -n12495895 -n12196527 -n12196336 -n12196694 -n12203529 -n12204175 -n12282933 -n12282527 -n12283542 -n12282737 -n12282235 -n12402051 -n12402840 -n12401684 -n12402348 -n12402596 -n11759853 -n11759404 -n12406715 -n12406488 -n12407890 -n12406902 -n12330469 -n12345899 -n11709674 -n12329473 -n12200143 -n11712282 -n12752205 -n13110915 -n12513933 -n12189987 -n12731401 -n12717224 -n12717072 -n12946849 -n12756457 -n12201580 -n11703669 -n12491017 -n12190410 -n12242409 -n07754894 -n12818346 -n12658308 -n12658118 -n12494794 -n12317296 -n12651821 -n11711764 -n11710136 -n11711537 -n11710393 -n12755225 -n12753573 -n12754648 -n12754781 -n12755727 -n12754981 -n12755387 -n12753007 -n12753245 -n12754003 -n12759273 -n12318378 -n12288823 -n12319204 -n12319414 -n12732491 -n12733647 -n12732756 -n12732009 -n12733870 -n12732966 -n12733218 -n12948495 -n12948251 -n12948053 -n12947313 -n12757303 -n12757458 -n11704093 -n11705171 -n12707781 -n12399132 -n12400720 -n12345280 -n11695599 -n12771192 -n12704343 -n12638218 -n12644902 -n12190869 -n12373100 -n12300840 -n12743352 -n12651611 -n12629666 -n12636224 -n12648045 -n12399384 -n12301180 -n12744387 -n12640839 -n12745386 -n12633638 -n12771390 -n12761284 -n12400489 -n12333530 -n12333771 -n12333053 -n12641413 -n12332030 -n12711984 -n12709901 -n12708293 -n12713063 -n12711596 -n12709103 -n12709688 -n12710415 -n12710295 -n12710693 -n12708654 -n12708941 -n12643313 -n12638753 -n12646740 -n12645174 -n12650379 -n12634429 -n12633994 -n12634211 -n12635532 -n12635955 -n12635744 -n12643473 -n12649065 -n12641931 -n12642200 -n12650556 -n12649539 -n12649317 -n12646605 -n12647560 -n12648888 -n12263987 -n12263038 -n12306089 -n12305986 -n12305293 -n12304703 -n12305475 -n12262018 -n12261808 -n12261571 -n12595699 -n12587132 -n12583126 -n12596709 -n12591351 -n12596849 -n12582665 -n12596148 -n12595964 -n12582846 -n12587803 -n12591017 -n12588320 -n12588780 -n12585629 -n12597134 -n12598027 -n12597466 -n12583401 -n12593994 -n12590232 -n11757653 -n11756669 -n11757851 -n11664418 -n13108841 -n11647703 -n11628793 -n11658331 -n11623105 -n11630017 -n11628456 -n11658544 -n11643835 -n11624531 -n11661372 -n11645914 -n11630489 -n11640132 -n11608250 -n11620673 -n11618861 -n11627168 -n11623815 -n11624192 -n11623967 -n11635152 -n11634736 -n11635433 -n11636204 -n11644462 -n11644226 -n11644046 -n11626585 -n11625632 -n11625003 -n11626826 -n11625804 -n11626152 -n11626409 -n11646694 -n11646167 -n11632167 -n11631854 -n11632619 -n11616662 -n11611561 -n11611356 -n11617631 -n11612575 -n11611758 -n11614713 -n11615387 -n11612018 -n11611087 -n11612923 -n11616486 -n11618290 -n11612349 -n11611233 -n11617090 -n11614250 -n11618525 -n11615026 -n11617272 -n11614039 -n11613459 -n11615967 -n11614420 -n11621029 -n11622184 -n11622591 -n11621281 -n11622368 -n11621950 -n11621547 -n11621727 -n11619455 -n11619227 -n11627512 -n11628087 -n11627908 -n12691661 -n12691428 -n12316572 -n12334891 -n12340755 -n12316444 -n12336727 -n12338796 -n12338454 -n12336973 -n12336092 -n12336224 -n12337617 -n12725521 -n12727101 -n12729521 -n12726670 -n12729315 -n12729729 -n12731029 -n12270741 -n12271643 -n12278650 -n12279458 -n12269241 -n12275489 -n12273114 -n12276872 -n12278371 -n12272883 -n12269652 -n12273768 -n12277800 -n12271933 -n12279772 -n12270946 -n12269406 -n12275675 -n12276628 -n12275131 -n12274358 -n12272239 -n12277578 -n12501202 -n12814643 -n12493208 -n12807773 -n12807409 -n12807251 -n11758122 -n12915568 -n12656369 -n12656685 -n12547215 -n12547503 -n11944196 -n11984144 -n11805544 -n11874081 -n11965218 -n12392549 -n11956348 -n11945514 -n11944954 -n11998888 -n11953884 -n11954345 -n11955153 -n11954161 -n12421137 -n12421467 -n12411461 -n12451915 -n12425281 -n12459629 -n12421683 -n12422129 -n12421917 -n12411922 -n12418221 -n12416073 -n12413165 -n12414932 -n12412606 -n12412355 -n12414035 -n12413880 -n12453186 -n12452836 -n12450344 -n12426248 -n12429352 -n12460697 -n12449526 -n12473840 -n12458550 -n12449296 -n12472024 -n12457091 -n12465557 -n12461466 -n12454159 -n12431434 -n12451240 -n12451399 -n12450840 -n12428076 -n12428747 -n12427566 -n12427184 -n12426623 -n12427757 -n12461109 -n12460957 -n12454705 -n12454949 -n12435777 -n12435649 -n11819509 -n11819912 -n11842204 -n11852028 -n11851258 -n11847169 -n11853813 -n11848479 -n11844892 -n11851839 -n11845557 -n11849871 -n11849983 -n11851578 -n11854479 -n11844371 -n11853356 -n11845793 -n11845913 -n11784126 -n11783920 -n12832315 -n11723770 -n11724109 -n12766869 -n12455950 -n11723227 -n12757816 -n11773987 -n12766595 -n01324610 -n02153109 -n01323599 -n01314781 -n01321579 -n01317541 -n01318894 -n01314663 -n02311060 -n01317916 -n01321230 -n01314388 -n02075612 -n02152740 -n01466257 -n01316949 -n01905661 -n01320872 -n01319467 -n01316422 -n02157206 -n10300303 -n02152881 -n01324431 -n01321854 -n01321770 -n01956344 -n01613615 -n01318279 -n02376542 -n02122948 -n01888045 -n01322343 -n01887896 -n02412440 -n01322221 -n01322604 -n01323261 -n01322685 -n02395694 -n01504344 -n01504179 -n01318381 -n02122580 -n01317813 -n02469472 -n02309337 -n02311617 -n02264232 -n02299157 -n02310585 -n02299505 -n02302620 -n02295390 -n02310717 -n02288268 -n02297442 -n02300797 -n02285801 -n02307325 -n02376791 -n02377063 -n01323355 -n01469103 -n01468712 -n01471682 -n01473806 -n01627424 -n01861778 -n09828216 -n01459791 -n02156871 -n01661091 -n01503061 -n02512053 -n01477525 -n02528163 -n02512938 -n01482071 -n02638596 -n01457852 -n01455778 -n01456756 -n02552171 -n01428580 -n02549989 -n02640857 -n02641379 -n02639087 -n02639605 -n02640242 -n02554730 -n02618827 -n02549248 -n02603317 -n01451426 -n02548247 -n02642107 -n02657368 -n02603540 -n02652668 -n02560110 -n02556846 -n02555863 -n02581957 -n02564270 -n02623445 -n02565573 -n02610664 -n02590702 -n02588286 -n02620167 -n02573704 -n02576223 -n02606384 -n02605316 -n02619550 -n02561108 -n02619165 -n02610066 -n02562315 -n02586543 -n02593019 -n02594250 -n02616851 -n02585872 -n02607862 -n02557182 -n02557318 -n02557749 -n02624167 -n02628062 -n02631475 -n02630281 -n02631041 -n02629230 -n02626762 -n02625258 -n02625612 -n02624807 -n02626265 -n02625851 -n02627292 -n02627532 -n02576575 -n02579928 -n02580336 -n02576906 -n02579303 -n02578771 -n02578928 -n02580679 -n02580830 -n02607201 -n02607470 -n02607072 -n02605703 -n02606052 -n02605936 -n02561381 -n02561661 -n02561514 -n02564720 -n02563648 -n02563182 -n02563792 -n02562796 -n02565072 -n02565324 -n02599052 -n02596381 -n02597608 -n02596067 -n02595702 -n02598573 -n02598878 -n02642644 -n02649546 -n02643112 -n02643566 -n02643836 -n02644113 -n02658531 -n02657694 -n02660208 -n02654745 -n02654425 -n02656670 -n02655020 -n02655523 -n02653145 -n02656032 -n02655848 -n02541687 -n02542432 -n02524202 -n02533834 -n02543565 -n02517442 -n01438208 -n02526121 -n02529772 -n02518324 -n02520147 -n02519686 -n02519862 -n02583567 -n01444339 -n01446589 -n01438581 -n01439121 -n01448951 -n02584449 -n02584145 -n02583890 -n01446760 -n01447331 -n01448594 -n01448291 -n01439514 -n01442972 -n01440764 -n01443831 -n01443537 -n01443243 -n01449712 -n01449374 -n02527622 -n02527057 -n02527271 -n02532602 -n02533209 -n02566834 -n02537085 -n02534734 -n02514041 -n02568959 -n02568087 -n02570164 -n02569484 -n02537716 -n02538216 -n02537525 -n02537319 -n02538010 -n02536456 -n02535537 -n02535258 -n02536864 -n02535759 -n01482330 -n01495701 -n01487506 -n01495493 -n01486838 -n01488918 -n01492357 -n01494475 -n01483522 -n01488038 -n01489501 -n01491006 -n01489709 -n01489920 -n01490112 -n01491361 -n01490670 -n01493146 -n01492569 -n01484850 -n01484097 -n01483830 -n01498041 -n01496331 -n01499396 -n01500476 -n01500091 -n01501160 -n01498989 -n01629276 -n01639765 -n01629962 -n01630284 -n01629819 -n01637615 -n01632047 -n01631663 -n01630670 -n01630901 -n01632458 -n01632777 -n01632601 -n01645776 -n01640846 -n01644900 -n01643896 -n01650167 -n01644373 -n01646648 -n01646902 -n01646292 -n01646802 -n01646388 -n01647640 -n01646555 -n01642539 -n01641206 -n01641577 -n01641391 -n01642257 -n01641739 -n01650690 -n01652026 -n01886756 -n01871265 -n01871875 -n01874434 -n01862399 -n02082791 -n01887474 -n01889074 -n02372584 -n01888411 -n02453611 -n02430559 -n01887623 -n02469914 -n02075296 -n02139199 -n02062017 -n02323449 -n02372952 -n01888181 -n02329401 -n01887787 -n02453108 -n01888264 -n02461830 -n02370806 -n01891633 -n01893825 -n02454794 -n02456962 -n02454379 -n02460009 -n02458135 -n02457945 -n02457408 -n02460451 -n02461128 -n02470238 -n02501583 -n02472293 -n02470325 -n02496913 -n02484322 -n02475669 -n02474777 -n02475078 -n02470899 -n02483092 -n02480153 -n02483708 -n02483362 -n02481823 -n02480495 -n02480855 -n02482650 -n02482474 -n02481103 -n02481366 -n02481500 -n02500267 -n02497673 -n02499316 -n02499808 -n02499022 -n02484473 -n02489589 -n02486410 -n02485536 -n02489166 -n02488702 -n02486261 -n02487347 -n02484975 -n02488291 -n02486657 -n02486908 -n02487847 -n02487547 -n02493793 -n02490219 -n02494079 -n02493509 -n02492035 -n02492660 -n02491107 -n02490811 -n02507649 -n02120997 -n02134971 -n02083346 -n02441326 -n02131653 -n02509515 -n02508213 -n02509815 -n02508021 -n02509197 -n02510455 -n02127808 -n02121620 -n02128925 -n02129604 -n02128385 -n02130308 -n02129165 -n02128757 -n02129923 -n02129837 -n01323068 -n02129463 -n01322898 -n02121808 -n02124623 -n02122878 -n02123159 -n02123045 -n02123242 -n02124484 -n02124075 -n02124313 -n02122298 -n02123478 -n02123394 -n02123917 -n02123597 -n02122510 -n02122725 -n02122430 -n02126640 -n02125494 -n02127052 -n02125311 -n02125081 -n02126139 -n02126787 -n02125010 -n02127292 -n02127482 -n02127678 -n02127381 -n02138441 -n02137015 -n02137549 -n02138647 -n02138777 -n02084071 -n02115335 -n02114100 -n02083672 -n02115096 -n02118333 -n02117135 -n02110958 -n02112826 -n02111500 -n02112706 -n02113335 -n02084861 -n02111129 -n02112497 -n02110341 -n02084732 -n02111626 -n02085374 -n02087122 -n02103406 -n02110806 -n02113978 -n02111277 -n02085272 -n02113186 -n02113023 -n02113799 -n02113624 -n02113712 -n02112018 -n02112350 -n02112137 -n02111889 -n02086346 -n02086240 -n02087046 -n02085936 -n02085782 -n02085620 -n02086079 -n02086753 -n02086646 -n02086910 -n02092468 -n02087394 -n02089468 -n02098550 -n02087551 -n02089232 -n02096437 -n02096756 -n02095412 -n02096051 -n02098286 -n02093859 -n02094114 -n02093754 -n02094433 -n02095314 -n02093647 -n02097474 -n02097658 -n02098413 -n02097298 -n02096177 -n02096585 -n02095050 -n02096294 -n02093056 -n02094258 -n02093991 -n02094562 -n02098105 -n02097209 -n02097130 -n02097047 -n02095570 -n02095727 -n02095889 -n02093256 -n02093428 -n02094721 -n02094931 -n02098906 -n02099997 -n02098806 -n02100399 -n02101108 -n02099029 -n02100583 -n02100236 -n02101006 -n02100735 -n02100877 -n02102318 -n02102605 -n02101861 -n02101388 -n02101556 -n02102480 -n02102973 -n02102040 -n02102177 -n02099267 -n02099601 -n02099429 -n02099849 -n02099712 -n02091635 -n02088466 -n02090475 -n02088238 -n02091244 -n02091467 -n02088839 -n02091831 -n02088094 -n02089078 -n02088632 -n02092002 -n02090379 -n02089555 -n02088364 -n02092339 -n02090827 -n02090622 -n02090721 -n02089973 -n02089867 -n02091134 -n02091032 -n02109047 -n02103841 -n02109961 -n02108551 -n02109811 -n02109525 -n02108915 -n02106854 -n02108672 -n02107420 -n02108422 -n02104523 -n02108089 -n02108254 -n02104029 -n02104280 -n02106966 -n02104365 -n02107142 -n02107312 -n02110627 -n02110185 -n02110063 -n02107574 -n02108000 -n02107683 -n02107908 -n02104882 -n02105412 -n02105855 -n02105505 -n02106166 -n02106030 -n02106550 -n02105641 -n02106662 -n02105251 -n02106382 -n02105056 -n02105162 -n02116738 -n02115641 -n02115913 -n02114855 -n01322508 -n02114712 -n02114548 -n02114367 -n02119022 -n02119477 -n02119789 -n02120079 -n02120505 -n02119634 -n02117900 -n02117512 -n02442845 -n02443484 -n02446206 -n02450295 -n02445394 -n02444819 -n02441942 -n02443114 -n02449350 -n02445715 -n02447366 -n02443346 -n02445004 -n02445171 -n02134084 -n02133161 -n01322983 -n02133704 -n02132136 -n02134418 -n02132580 -n02132788 -n02141306 -n02140049 -n02139671 -n02146371 -n02145424 -n02147591 -n02147947 -n02062430 -n02073250 -n02075927 -n02062744 -n02066707 -n02063224 -n02068974 -n02068541 -n02070430 -n02069412 -n02069701 -n02071636 -n02071294 -n02072798 -n02070174 -n02069974 -n02066245 -n02064338 -n02064816 -n02065407 -n02065026 -n02073831 -n02074367 -n02081571 -n02076196 -n02079389 -n02076779 -n02080415 -n02079851 -n02080146 -n02077658 -n02077152 -n02077923 -n02078574 -n02078738 -n02079005 -n02328429 -n02323902 -n02324045 -n02326432 -n02325722 -n02325366 -n02324587 -n02324850 -n02324514 -n02328150 -n02324431 -n02327842 -n02326862 -n02327028 -n02367492 -n02331046 -n02365480 -n02343320 -n02341974 -n02346627 -n02366959 -n02339376 -n02363005 -n02342885 -n02359324 -n02355227 -n02361337 -n02359556 -n02364520 -n02343772 -n02330245 -n02338145 -n02353861 -n02333546 -n02333909 -n02360282 -n02358091 -n02359915 -n02355477 -n02358890 -n02358390 -n02356381 -n02357111 -n02356977 -n02357401 -n02356798 -n02361706 -n02361587 -n02364840 -n02364673 -n02332755 -n02332156 -n02503517 -n02504458 -n02504013 -n02394477 -n02373336 -n02399000 -n02437136 -n02395003 -n02437616 -n02438580 -n02397744 -n02398521 -n02397529 -n02429456 -n02430045 -n02401031 -n02439033 -n02439398 -n02434190 -n02433925 -n02433318 -n02432983 -n02431337 -n02432511 -n02430830 -n02431122 -n02434954 -n02432291 -n02431785 -n02431976 -n02433546 -n02432704 -n02414578 -n02410509 -n02411206 -n02407959 -n02402010 -n02419796 -n02411705 -n02418064 -n02416519 -n02416104 -n02415435 -n02415253 -n02415577 -n02415829 -n02410702 -n02410900 -n02408817 -n02408429 -n02409508 -n02404573 -n02402175 -n02404906 -n02402425 -n02405302 -n02410011 -n02404186 -n02403003 -n02403325 -n02403231 -n02403740 -n02403454 -n02406174 -n02404432 -n02406647 -n02407625 -n02407071 -n02405929 -n02407276 -n02407390 -n02406533 -n02424305 -n02421136 -n02420509 -n02427724 -n02426813 -n02426481 -n02421792 -n02421449 -n02424695 -n02420828 -n02422391 -n02422699 -n02424486 -n02425887 -n02422106 -n02424085 -n02428508 -n02428349 -n02423022 -n02424909 -n02425228 -n02423218 -n02423589 -n02413131 -n02413050 -n02411999 -n02412210 -n02412080 -n02418465 -n02419336 -n02419634 -n02416964 -n02416820 -n02417914 -n02417387 -n02417070 -n02416880 -n02417534 -n02437482 -n02437312 -n02396427 -n02397096 -n02396014 -n02395406 -n02438173 -n02438272 -n02391994 -n02393580 -n02374149 -n02393940 -n02392434 -n02393161 -n02392824 -n02374451 -n02391049 -n02389346 -n02388917 -n02377603 -n02382948 -n02389128 -n02381460 -n02389261 -n02382204 -n02375302 -n02376918 -n02387722 -n02388832 -n02381609 -n02377703 -n02388735 -n02386014 -n02380464 -n02386310 -n02377480 -n02380335 -n02382437 -n02389026 -n02385214 -n02383231 -n02388276 -n02377291 -n02377181 -n02377388 -n02379430 -n02378969 -n02378541 -n02381364 -n02379329 -n02381004 -n02381261 -n02379908 -n02379183 -n02386141 -n02386224 -n02382338 -n02387254 -n02386496 -n02386853 -n02387093 -n02386968 -n02387346 -n02382039 -n02380745 -n02380583 -n02382750 -n02382635 -n02382850 -n02391234 -n02391373 -n02391508 -n02390015 -n02389779 -n02389559 -n01872401 -n01873310 -n01872772 -n01877134 -n01882714 -n01883070 -n01875313 -n01874928 -n01883513 -n01881171 -n01877606 -n01877812 -n01878929 -n01879509 -n01884834 -n01885498 -n01662622 -n01661818 -n01662784 -n01669372 -n01669191 -n01666228 -n01667778 -n01672032 -n01669654 -n01663401 -n01665932 -n01668665 -n01670092 -n01667114 -n01668892 -n01664990 -n01664065 -n01663782 -n01665541 -n01664369 -n01664674 -n01664492 -n01670802 -n01671125 -n01670535 -n01671479 -n01696633 -n01726692 -n01673282 -n01674464 -n01699831 -n01698434 -n01697178 -n01698640 -n01699040 -n01697611 -n01697457 -n01740551 -n01752165 -n01751748 -n01745125 -n01741562 -n01727646 -n01753488 -n01752736 -n01752585 -n01753032 -n01753959 -n01754533 -n01754370 -n01754876 -n01757901 -n01757677 -n01755581 -n01757115 -n01755740 -n01756089 -n01756508 -n01756291 -n01756733 -n01757343 -n01747885 -n01749939 -n01751472 -n01747589 -n01749582 -n01746359 -n01745484 -n01748264 -n01748906 -n01741943 -n01743605 -n01742821 -n01742172 -n01743086 -n01744100 -n01743936 -n01744401 -n01730960 -n01735189 -n01733757 -n01729322 -n01732244 -n01731545 -n01737021 -n01729977 -n01730812 -n01730563 -n01728572 -n01728920 -n01739381 -n01734418 -n01740131 -n01735577 -n01735439 -n01734104 -n01733957 -n01732614 -n01732789 -n01737875 -n01737472 -n01737728 -n01730185 -n01730307 -n01734808 -n01734637 -n01675722 -n01693783 -n01694709 -n01684133 -n01692333 -n01695060 -n01685808 -n01676755 -n01687665 -n01674990 -n01694178 -n01692864 -n01689411 -n01681940 -n01681653 -n01678343 -n01682714 -n01682435 -n01681328 -n01680264 -n01679626 -n01677366 -n01677747 -n01679962 -n01680655 -n01680478 -n01687978 -n01689081 -n01688243 -n01693334 -n01693175 -n01690149 -n01689811 -n01700470 -n01713764 -n01701859 -n01704323 -n01515303 -n01844917 -n01524359 -n01514668 -n01833805 -n01838038 -n01825930 -n01844551 -n01604330 -n01834918 -n01822602 -n01514752 -n01517565 -n01789386 -n01844231 -n01816887 -n01517966 -n01503976 -n01514859 -n02000954 -n01858441 -n02016358 -n02021795 -n01845132 -n02008041 -n02014237 -n02021050 -n02018795 -n02005790 -n02002075 -n02013177 -n02012849 -n02013706 -n02014524 -n02007558 -n02014941 -n02006656 -n02005399 -n02022684 -n02008497 -n02010453 -n02009229 -n02011281 -n02008643 -n02008796 -n02011460 -n02010728 -n02011016 -n02009750 -n02009508 -n02009380 -n02009912 -n02010272 -n02012185 -n02011805 -n02006063 -n02006364 -n02003204 -n02002724 -n02002556 -n02004131 -n02003839 -n02004492 -n02004855 -n02017725 -n02015357 -n02016066 -n02015554 -n02018027 -n02018368 -n02018207 -n02006985 -n02007284 -n02023341 -n02034129 -n02034295 -n02036053 -n02040266 -n02037110 -n02034661 -n02031585 -n02031934 -n02030996 -n02036711 -n02026059 -n02033779 -n02038993 -n02033561 -n02037464 -n02024479 -n02025239 -n02023992 -n02024763 -n02025043 -n02023855 -n02034971 -n02035210 -n02032222 -n02032355 -n02032480 -n02033041 -n02030287 -n02027897 -n02030837 -n02029087 -n02029378 -n02028035 -n02027075 -n02028900 -n02027492 -n02029706 -n02027357 -n02028727 -n02030035 -n02026948 -n02028175 -n02028342 -n02028451 -n02037869 -n02038466 -n01858845 -n01858906 -n01860002 -n01858281 -n01859190 -n01858780 -n01859325 -n01860187 -n01859496 -n01859689 -n01859852 -n02016956 -n02017213 -n02016816 -n02040505 -n02057731 -n02050004 -n02045369 -n02049088 -n02051474 -n02055658 -n02047614 -n02041085 -n02044178 -n02043808 -n02043333 -n02041246 -n02043063 -n02042472 -n02041678 -n02042180 -n02041875 -n02042759 -n02042046 -n02044778 -n02044517 -n02059162 -n02058221 -n02058594 -n02060411 -n02060889 -n02060133 -n02050442 -n02050313 -n02051059 -n02050586 -n02050809 -n02045864 -n02046759 -n02045596 -n02047260 -n02046939 -n02047411 -n02047045 -n02052775 -n02054036 -n02054502 -n02051845 -n02053083 -n02054711 -n02055107 -n02052204 -n02052365 -n02053425 -n02053584 -n02055803 -n02056728 -n02057035 -n02056570 -n02057330 -n02056228 -n02048115 -n02048353 -n02047975 -n01845477 -n01855672 -n01846331 -n01856890 -n01857851 -n01857079 -n01856380 -n01857512 -n01857325 -n01856072 -n01856553 -n01856155 -n01857632 -n01847253 -n01851375 -n01849676 -n01852329 -n01850192 -n01847978 -n01852400 -n01848840 -n01849157 -n01847806 -n01849466 -n01848123 -n01850553 -n01847089 -n01851895 -n01849863 -n01852142 -n01847000 -n01852671 -n01848976 -n01847407 -n01848648 -n01852861 -n01851207 -n01851038 -n01850373 -n01850873 -n01847170 -n01851573 -n01851731 -n01848555 -n01848323 -n01848453 -n01853195 -n01853870 -n01854415 -n01853498 -n01853666 -n01854838 -n01855032 -n01855476 -n01855188 -n01854700 -n01584225 -n01546506 -n01546921 -n01525720 -n01546039 -n01539573 -n01585121 -n01585715 -n01584695 -n01586374 -n01584853 -n01586020 -n01552813 -n01551711 -n01555004 -n01554448 -n01547832 -n01548301 -n01549886 -n01549430 -n01550172 -n01549641 -n01555305 -n01549053 -n01548865 -n01548492 -n01563128 -n01589718 -n01578575 -n01576695 -n01528654 -n01591697 -n01594004 -n01557185 -n01527347 -n01597022 -n01598588 -n01527617 -n01576076 -n01555809 -n01587834 -n01602630 -n01597336 -n01538955 -n01529672 -n01600657 -n01601694 -n01527194 -n01586941 -n01588002 -n01527917 -n01587526 -n01601068 -n01603600 -n01602832 -n01571904 -n01575745 -n01566645 -n01594372 -n01589286 -n01526521 -n01582856 -n01528396 -n01528845 -n01556182 -n01542786 -n01590583 -n01564914 -n01567133 -n01563746 -n01564394 -n01563449 -n01565078 -n01570676 -n01570839 -n01570267 -n01567678 -n01569060 -n01568892 -n01568294 -n01569971 -n01569262 -n01567879 -n01568720 -n01569423 -n01563945 -n01564217 -n01566207 -n01565599 -n01565930 -n01564773 -n01579410 -n01581984 -n01579578 -n01582398 -n01580077 -n01579260 -n01579028 -n01582220 -n01579149 -n01580870 -n01581166 -n01577035 -n01578180 -n01577659 -n01593028 -n01592084 -n01592694 -n01592387 -n01592540 -n01592257 -n01562265 -n01558993 -n01559477 -n01558461 -n01558307 -n01558149 -n01560105 -n01558594 -n01557962 -n01558765 -n01561732 -n01562014 -n01560280 -n01562451 -n01561452 -n01560419 -n01560636 -n01559804 -n01560793 -n01560935 -n01598988 -n01599556 -n01600085 -n01599269 -n01599159 -n01597906 -n01598074 -n01597737 -n01533651 -n01534155 -n01540233 -n01531178 -n01534762 -n01533893 -n01537134 -n01531344 -n01541386 -n01531512 -n01533481 -n01541922 -n01533000 -n01544704 -n01530575 -n01532325 -n01532511 -n01531811 -n01534582 -n01532829 -n01530439 -n01533339 -n01531971 -n01534433 -n01541102 -n01540566 -n01540832 -n01536644 -n01535469 -n01536334 -n01536186 -n01535690 -n01536780 -n01536035 -n01537544 -n01538059 -n01538630 -n01537895 -n01538200 -n01603812 -n01603953 -n01573898 -n01573074 -n01572328 -n01572782 -n01574045 -n01573240 -n01573360 -n01572654 -n01572489 -n01574560 -n01575117 -n01574390 -n01575401 -n01595450 -n01595168 -n01595624 -n01594787 -n01594968 -n01595974 -n01596273 -n01583209 -n01583495 -n01543632 -n01544389 -n01591123 -n01591005 -n01591301 -n01539925 -n01540090 -n01834540 -n01834177 -n01843065 -n01838598 -n01842235 -n01843719 -n01843383 -n01839598 -n01839330 -n01839086 -n01841102 -n01841679 -n01840775 -n01839750 -n01841441 -n01841288 -n01827403 -n01826364 -n01830915 -n01830042 -n01829413 -n01826680 -n01829869 -n01828970 -n01828556 -n01827793 -n01828096 -n01616318 -n01605630 -n01618503 -n01613294 -n01621127 -n01616764 -n01618922 -n01617766 -n01617443 -n01618082 -n01617095 -n01620414 -n01619310 -n01620735 -n01619536 -n01619835 -n01620135 -n01609751 -n01606522 -n01607812 -n01608265 -n01610955 -n01610552 -n01606809 -n01616086 -n01608432 -n01607600 -n01607962 -n01606672 -n01609956 -n01610226 -n01613177 -n01611800 -n01611472 -n01612628 -n01612476 -n01612275 -n01611969 -n01612122 -n01609391 -n01609062 -n01608814 -n01613807 -n01614343 -n01615121 -n01614925 -n01614038 -n01614556 -n01615703 -n01615458 -n01622959 -n01621635 -n01623880 -n01623425 -n01622352 -n01623615 -n01622120 -n01625562 -n01623706 -n01624115 -n01624537 -n01622483 -n01623110 -n01624833 -n01622779 -n01837072 -n01835276 -n01825278 -n01823013 -n01824575 -n01824035 -n01521399 -n01521756 -n01518878 -n01519873 -n01519563 -n01789740 -n01810700 -n01801876 -n01791463 -n01791107 -n02153203 -n01794344 -n01791954 -n01794158 -n01809106 -n01791625 -n01792429 -n01792158 -n01793435 -n01792042 -n01793715 -n01792640 -n01793249 -n01792955 -n01815601 -n01811909 -n01814370 -n01812337 -n01813088 -n01812662 -n01814921 -n01814755 -n01813532 -n01813385 -n01813948 -n01814217 -n01802721 -n01810268 -n01795088 -n01803078 -n01806567 -n01807496 -n01807105 -n01803362 -n01804163 -n01805801 -n01806297 -n01806364 -n01806143 -n01806467 -n01804478 -n01806847 -n01804653 -n01808140 -n01807828 -n01797307 -n01798484 -n01797020 -n01797886 -n01797601 -n01796729 -n01795545 -n01796340 -n01819734 -n01821203 -n01819115 -n01817346 -n01818832 -n01817953 -n01818515 -n01818299 -n01820052 -n01820348 -n01817263 -n01821869 -n01822300 -n01819313 -n01819465 -n01821076 -n01820546 -n01317089 -n01317294 -n01918744 -n01922303 -n01940736 -n02316707 -n01909422 -n01767661 -n01906749 -n01930112 -n01934440 -n01924916 -n01938454 -n01935395 -n01955084 -n01955933 -n01968315 -n01942177 -n01960459 -n01963317 -n01956481 -n01963571 -n01959985 -n01965889 -n01961985 -n01957335 -n01958038 -n01959492 -n01964441 -n01964271 -n01965529 -n01969726 -n01968897 -n01972541 -n01970164 -n01970667 -n01951274 -n01953361 -n01943899 -n01945845 -n01943087 -n01953762 -n01950731 -n01945685 -n01944390 -n01949085 -n01947396 -n01946630 -n01944812 -n01945143 -n01944955 -n02317335 -n02321170 -n02319555 -n02319095 -n02321529 -n02317781 -n01909906 -n01914163 -n01913166 -n01910747 -n01915700 -n01914609 -n01915811 -n01916925 -n01916187 -n01916481 -n01917882 -n01917289 -n01784675 -n01974773 -n01768244 -n01786646 -n01769347 -n01787835 -n02309242 -n02159955 -n01785667 -n01994910 -n01976868 -n01990007 -n01975687 -n01976146 -n01990800 -n01992773 -n01991520 -n01991028 -n01982650 -n01986806 -n01986214 -n01987545 -n01976957 -n01985128 -n01984245 -n01984695 -n01983481 -n01981276 -n01979874 -n01978455 -n01978287 -n01980166 -n01982068 -n01770393 -n01770081 -n01776192 -n01772222 -n01776313 -n01779629 -n01779148 -n01772664 -n01775370 -n01774750 -n01775062 -n01773797 -n01774384 -n01773157 -n01773549 -n02226183 -n02236896 -n02263378 -n02232951 -n02163297 -n02262449 -n02246011 -n02188699 -n02272871 -n02273392 -n02231052 -n02161457 -n02236355 -n02312427 -n02231487 -n02162561 -n02164464 -n02241569 -n02262803 -n02206270 -n02274024 -n02312640 -n02268148 -n02270623 -n02207805 -n02226429 -n02229544 -n02228341 -n02226970 -n02241426 -n02240517 -n02266050 -n02264885 -n02264363 -n02236044 -n02236241 -n02233338 -n02234355 -n02234848 -n02233943 -n02251775 -n02256656 -n02258198 -n02257284 -n02250822 -n02259212 -n02252226 -n02200198 -n02205219 -n02203152 -n02196344 -n02190166 -n02198859 -n02196119 -n02201000 -n02202006 -n02195819 -n02195526 -n02192513 -n02191773 -n02190790 -n02192252 -n02191979 -n02169974 -n02168245 -n02167151 -n02169023 -n02165456 -n02171453 -n02180875 -n02183096 -n02169497 -n02176261 -n02176439 -n02165105 -n02177972 -n02168699 -n02166567 -n02166826 -n02171869 -n02175916 -n02175569 -n02172870 -n02173373 -n02174001 -n02172182 -n02172518 -n02174659 -n02243562 -n02244797 -n02212062 -n02218371 -n02219486 -n02206856 -n02216211 -n02215770 -n02212602 -n02213107 -n02212958 -n02213543 -n02213239 -n02213788 -n02220804 -n02221083 -n02221414 -n02209354 -n02208280 -n02211627 -n02210427 -n02211444 -n02209624 -n02208498 -n02208848 -n02274259 -n02283201 -n02281787 -n02274822 -n02281406 -n02277742 -n02279972 -n02280649 -n02282257 -n02282903 -n02282385 -n02275773 -n02278210 -n02276258 -n02276902 -n02279257 -n02277094 -n02276078 -n02275560 -n02277268 -n02276355 -n02276749 -n02278024 -n02281015 -n02281136 -n02305929 -n02301452 -n02295064 -n02298541 -n02284611 -n02287004 -n02291572 -n02305085 -n02301935 -n02304432 -n02303284 -n02302969 -n02292692 -n02291748 -n02268443 -n02268853 -n01321123 -n02376679 -n01323493 -n01338685 -n01387065 -n01339083 -n01339336 -n01339801 -n01339471 -n01397114 -n01389507 -n01397871 -n01410457 -n01407798 -n01424420 -n01392380 -n01395254 -n01396048 -n11542137 -n11544015 -n11542640 -n09626238 -n09856671 -n09605289 -n09622049 -n09971273 -n09882716 -n09621232 -n09902954 -n09620794 -n09727440 -n09624168 -n09752519 -n10378026 -n10500217 -n10514429 -n09610405 -n09617867 -n10355449 -n09618957 -n10002760 -n10384496 -n09637339 -n09613191 -n09836160 -n10274815 -n09890749 -n10112591 -n10260706 -n09606527 -n09767197 -n10709529 -n09976429 -n09918554 -n10588074 -n10565667 -n09990415 -n10120330 -n09616922 -n09622302 -n09630641 -n09796809 -n09614684 -n10635788 -n09645091 -n10405694 -n09676884 -n09638875 -n09874428 -n09627906 -n09628382 -n10522759 -n10247880 -n09624980 -n10529231 -n10024362 -n09614315 -n09612848 -n09632518 -n10147935 -n09871867 -n09620078 -n09634494 -n10077593 -n10040945 -n09623038 -n10560106 -n10289039 -n10422405 -n09774783 -n10042845 -n09831962 -n10726031 -n09923673 -n09610660 -n09626031 -n10401331 -n09621545 -n10362319 -n10665698 -n09906449 -n09939313 -n10439373 -n09607630 -n09631463 -n10451450 -n10541229 -n09793141 -n10633450 -n10530959 -n09629752 -n10560637 -n10431625 -n09619168 -n09763784 -n09636339 -n10235549 -n09845401 -n10513823 -n10610465 -n09951274 -n09816771 -n10401829 -n10307234 -n10505613 -n10148035 -n09874725 -n09944022 -n10015485 -n10728624 -n10308168 -n10200781 -n10480253 -n10376523 -n09903153 -n10748620 -n10581890 -n10045713 -n10165109 -n10694258 -n10509063 -n10559996 -n10366966 -n10305802 -n10421470 -n10164492 -n10477713 -n10020890 -n10679174 -n10632576 -n10189278 -n09894445 -n10504206 -n10559288 -n09917593 -n09833441 -n10384392 -n10060352 -n09840217 -n09777012 -n10309896 -n09905185 -n10686885 -n10209731 -n10093818 -n10754189 -n10411551 -n10577284 -n10285313 -n10333439 -n10624074 -n10287213 -n09871229 -n10078719 -n09843443 -n10173771 -n10192839 -n10419785 -n10406266 -n10288964 -n10804287 -n10665587 -n10153414 -n10406765 -n10611613 -n09805324 -n09824361 -n10316360 -n10707233 -n10696508 -n09858165 -n10175248 -n09979321 -n10692482 -n10396106 -n10427764 -n10385566 -n10439851 -n09820263 -n10533013 -n09854421 -n10304914 -n10575463 -n09915651 -n10453184 -n10101634 -n10701180 -n09835230 -n10746931 -n10542888 -n10604491 -n09764381 -n09929298 -n10019406 -n09785659 -n10618342 -n10782471 -n10701644 -n10105733 -n10638922 -n09842047 -n10315561 -n09835506 -n10153594 -n09830194 -n10263411 -n10157128 -n10498816 -n10689306 -n10604380 -n10634849 -n09923561 -n09764598 -n10086568 -n10007684 -n09841696 -n10321340 -n10092488 -n10386984 -n10387196 -n10205457 -n10578021 -n10098710 -n09836519 -n09836786 -n09836343 -n09877951 -n10300154 -n10095769 -n10435988 -n09930257 -n10387324 -n10098862 -n10642596 -n10331167 -n09946814 -n10299250 -n09896170 -n10415638 -n10091450 -n10069296 -n09989502 -n10226413 -n10493685 -n09765278 -n09930876 -n10340312 -n09990777 -n09834699 -n10737103 -n10649197 -n10701962 -n10415037 -n10151760 -n10229883 -n10732010 -n10603851 -n10599806 -n10369317 -n09903501 -n10755080 -n10098245 -n10382825 -n10536416 -n10036929 -n10624310 -n09842528 -n10085869 -n09991867 -n10078131 -n10627252 -n10682953 -n10237196 -n09789566 -n10182190 -n09899671 -n10150071 -n10091651 -n10806113 -n10249459 -n10317500 -n09822830 -n10448983 -n09862621 -n10540114 -n10009276 -n10333838 -n10730728 -n10721321 -n09659188 -n09650729 -n09652149 -n09659039 -n09729530 -n09641002 -n09725653 -n09846469 -n09750770 -n10486166 -n10169147 -n09684901 -n09683757 -n09682291 -n10364198 -n10518602 -n10341573 -n10672371 -n10332861 -n10112129 -n10602470 -n10727256 -n10508141 -n10652605 -n09881265 -n09933098 -n09812338 -n09920283 -n10078806 -n10339966 -n10667477 -n10566072 -n10469874 -n10624540 -n09809925 -n09846755 -n09873899 -n09779790 -n10034614 -n10449664 -n10034201 -n09951616 -n10037385 -n09846894 -n10282672 -n10053808 -n09815790 -n10137825 -n10605985 -n10604979 -n09861946 -n10763383 -n09841188 -n10644598 -n10548681 -n10791221 -n10583790 -n09873473 -n10763620 -n10548537 -n10120671 -n10241300 -n10318293 -n10176679 -n09932508 -n10186216 -n10134178 -n10079399 -n09821831 -n09934337 -n10324560 -n10063461 -n09886403 -n09760609 -n10260800 -n10655594 -n09938449 -n10183931 -n09972458 -n09813219 -n10049363 -n10372373 -n10076604 -n09835348 -n09974648 -n10433164 -n09859152 -n10727171 -n10308732 -n09833536 -n10582746 -n10393909 -n10013927 -n10225219 -n10202624 -n09800964 -n10465831 -n09787534 -n10174445 -n10441962 -n10132035 -n09896685 -n09934774 -n10279018 -n10793570 -n10155849 -n10087434 -n09964202 -n09811852 -n10348526 -n10317007 -n10058777 -n10360747 -n09941964 -n10347446 -n09770359 -n09941787 -n09942970 -n09809749 -n09770179 -n10208950 -n10580772 -n10093475 -n10645017 -n09943239 -n09943541 -n10263790 -n10283170 -n10259348 -n10092978 -n10296176 -n09893191 -n10123844 -n10259780 -n10259997 -n10510245 -n10622053 -n10058585 -n10690648 -n10523341 -n10739391 -n10476467 -n10512372 -n10802507 -n10753442 -n09733793 -n09738708 -n09641757 -n09738400 -n09727826 -n09686536 -n09724533 -n09744834 -n09743792 -n09744161 -n09742101 -n09689435 -n09734450 -n09644152 -n09750282 -n09673495 -n09718811 -n09718217 -n09712696 -n09718936 -n10711766 -n09694771 -n09719794 -n09714694 -n09675922 -n09676247 -n10774440 -n09720256 -n09725229 -n09731571 -n09691729 -n09693982 -n09712448 -n09697401 -n09696585 -n09722658 -n09724656 -n09723067 -n09694664 -n09712324 -n09689958 -n09695979 -n10327987 -n09688804 -n09730204 -n09711435 -n09713108 -n09731343 -n09717233 -n09695620 -n09728285 -n09707289 -n09701833 -n09700964 -n09750891 -n09715427 -n09708750 -n09705784 -n09734185 -n09752023 -n09635534 -n09696456 -n09732170 -n09730824 -n09719309 -n09734535 -n09736945 -n09720842 -n09692915 -n09751895 -n09724785 -n09747495 -n09734639 -n09749386 -n09705124 -n09731436 -n10303814 -n10450303 -n10722575 -n10054657 -n10631309 -n10249270 -n09913455 -n10162991 -n09807754 -n09505153 -n10209082 -n10323634 -n10104064 -n10001481 -n10242328 -n10159045 -n09932098 -n10253995 -n10005934 -n10578471 -n09770949 -n10004718 -n10570019 -n10289462 -n10069645 -n10187990 -n09916348 -n10727458 -n10320863 -n10572706 -n10572889 -n10038409 -n10756148 -n09927451 -n10243664 -n10502329 -n09988493 -n10373390 -n10470779 -n09928136 -n10750031 -n10081204 -n09857200 -n10013811 -n09894143 -n10313239 -n10082997 -n10677713 -n09787765 -n10485883 -n10275395 -n09913593 -n09772930 -n09633969 -n10195593 -n09756049 -n10607478 -n09855433 -n10017272 -n10630188 -n10522035 -n10521662 -n10380672 -n10210911 -n10382710 -n10164747 -n09782397 -n10524076 -n10467395 -n10467179 -n10698368 -n09792969 -n10525617 -n10675010 -n09889941 -n10557854 -n09618760 -n09899929 -n10116702 -n10258786 -n10508710 -n09873348 -n09870208 -n10793168 -n10098517 -n10314517 -n10629939 -n10477077 -n10261624 -n10082687 -n10262445 -n10167152 -n10098624 -n10674713 -n09838621 -n10047459 -n10091564 -n10740868 -n09872066 -n10070711 -n10628644 -n10421016 -n09915434 -n10588357 -n10529965 -n10334009 -n10339717 -n09818022 -n10412055 -n10335931 -n09945745 -n10432441 -n10607291 -n10583387 -n10718131 -n10542761 -n10147121 -n10738111 -n10159533 -n10223177 -n10185793 -n10553235 -n10293332 -n10178216 -n10563403 -n10488656 -n10619642 -n10276477 -n10620758 -n10450161 -n10043643 -n10043491 -n10313724 -n10084295 -n10787470 -n10333601 -n10131151 -n09871681 -n09981939 -n10055410 -n10243137 -n10377021 -n10368528 -n10025635 -n09874862 -n10613996 -n10472129 -n10598181 -n10129825 -n09847543 -n10173410 -n10780284 -n09889065 -n09832456 -n10780632 -n10117851 -n09827363 -n10247358 -n10282482 -n10092794 -n10375314 -n09981278 -n10082043 -n09972010 -n10237069 -n09792555 -n10236946 -n10568358 -n10207169 -n10236304 -n10734394 -n10373998 -n10595164 -n10357613 -n09823502 -n10146104 -n10602985 -n10145239 -n10267865 -n09854218 -n10399491 -n10102800 -n10102369 -n10406391 -n10300500 -n10080869 -n10332385 -n09988063 -n10375402 -n10145774 -n10143172 -n10145590 -n10345015 -n10142747 -n10142391 -n10146002 -n10267311 -n10141590 -n10092643 -n09918248 -n10671613 -n10141732 -n10145340 -n10145902 -n10145480 -n09827683 -n10135129 -n10465451 -n10353016 -n13001930 -n13040629 -n12969131 -n12985420 -n13052670 -n13037406 -n13077295 -n12987056 -n12979829 -n12975804 -n12974987 -n12985773 -n13044778 -n12985857 -n13035241 -n13043926 -n12982468 -n13035707 -n13044375 -n12969425 -n13060190 -n13054073 -n13040303 -n13028611 -n12997654 -n12983048 -n13062421 -n13054560 -n12963628 -n12980840 -n12991184 -n12989938 -n12992177 -n12988158 -n13029326 -n13029760 -n13011595 -n13049953 -n12998815 -n12997919 -n13052931 -n13050397 -n13012253 -n13001041 -n13005984 -n13000891 -n13007417 -n13019835 -n13013764 -n13006894 -n13002750 -n13017102 -n13232779 -n13009429 -n13013534 -n13003522 -n13001366 -n13009085 -n13022210 -n13002925 -n13006171 -n13003712 -n13001206 -n13004423 -n13001529 -n13003254 -n13003061 -n13032115 -n13032381 -n13033577 -n13055577 -n13055949 -n13055423 -n05430628 -n05450617 -n05449959 -n05451384 -n05453657 -n09369169 -n09454412 -n09403211 -n13086908 -n09416076 -n09251407 -n05218119 -n09444100 -n09438940 -n09257949 -n09189157 -n09475044 -n11691857 -n13102775 -n13087625 -n13022709 -n11675842 -n13152742 -n13125117 -n13129165 -n11690254 -n11669335 -n13134947 -n11676500 -n11675025 -n11674332 -n11669786 -n13131028 -n13132338 -n13132656 -n12301445 -n13133613 -n13141415 -n13137409 -n12642090 -n12267677 -n12658481 -n12144313 -n12158031 -n13135832 -n12620546 -n11636835 -n13139055 -n12144580 -n07929351 -n13136556 -n12768682 -n11689483 -n13136316 -n07770571 -n07737081 -n07774842 -n07774596 -n07775050 -n07772788 -n07771212 -n07772147 -n07772274 -n07774719 -n07737745 -n07772935 -n15086247 -n11879895 -n12576323 -n12532564 -n07814634 -n07775197 -n07770763 -n11748002 -n12172364 -n12515925 -n12560282 -n12578916 -n12560621 -n12544539 -n12024690 -n13154494 -n11690455 -n12927013 -n11953610 -n13128365 -n13133932 -n13163991 -n13134059 -n13131618 -n13130726 -n11678010 -n12136392 -n11979964 -n12088223 -n12462805 -n12433081 -n09218494 -n09381242 -n09460046 -n09451237 -n09450163 -n01904182 -n13155095 -n09432283 -n11705387 -n09438844 -n11692265 -n05237755 -n09416890 -n01956764 -n01904806 -n01904886 -n05586759 -n05581932 -n01904029 -n05238282 -n05254795 -n02469248 -n05256862 -n05258051 -n01899894 -n05261404 -n05259914 -n05261310 -n05260240 -n05262185 -n05261566 -n05262534 -n05262422 -n05263183 -n05263448 -n11524662 -n11448153 -n09247410 -n11508382 -n11524451 diff --git a/build/darknet/x64/data/9k.names b/build/darknet/x64/data/9k.names deleted file mode 100644 index e81c80e79e8..00000000000 --- a/build/darknet/x64/data/9k.names +++ /dev/null @@ -1,9418 +0,0 @@ -thing -matter -object -atmospheric phenomenon -body part -body of water -head -hair -structure -vein -mouth -heel -watercourse -ocean -gas -solid -substance -food -tear gas -sky -ice -food -cheese -yogurt -produce -baked goods -cake mix -Emmenthal -Camembert -Brie -mozzarella -Stilton -double cream -edible fruit -vegetable -currant -custard apple -citrus -jackfruit -pomegranate -avocado -prickly pear -apple -carambola -fig -mangosteen -tangelo -plum -papaya -apricot -berry -elderberry -loquat -pear -litchi -peach -muscat -grape -banana -pitahaya -rambutan -kiwi -melon -breadfruit -pineapple -mango -date -papaw -durian -passion fruit -jujube -guava -dried fruit -cherry -quince -nectarine -cherimoya -soursop -lime -mandarin -kumquat -orange -lemon -citron -grapefruit -pomelo -clementine -tangerine -satsuma -sweet orange -bitter orange -navel orange -Valencia orange -crab apple -eating apple -Granny Smith -Delicious -McIntosh -Red Delicious -Golden Delicious -strawberry -mulberry -currant -lingonberry -blackberry -red currant -raspberry -cranberry -acerola -persimmon -blueberry -bilberry -muskmelon -watermelon -cantaloup -sour cherry -sweet cherry -bing cherry -mushroom -asparagus -plantain -pumpkin -cucumber -root vegetable -cruciferous vegetable -raw vegetable -solanaceous vegetable -artichoke -legume -leek -squash -greens -celery -cardoon -gumbo -pieplant -onion -fennel -taro -beet -yam -carrot -potato -baked potato -mashed potato -french fries -mustard -cabbage -kohlrabi -cauliflower -brussels sprouts -broccoli rabe -broccoli -radish -turnip -collards -bok choy -savoy cabbage -head cabbage -kale -pepper -tomato -eggplant -tomatillo -sweet pepper -hot pepper -bell pepper -pimento -green pepper -chili -tabasco -cayenne -jalapeno -cherry tomato -beefsteak tomato -bean -pea -chickpea -lentil -soy -common bean -black bean -kidney bean -fresh bean -green bean -shell bean -snap bean -haricot vert -string bean -fava bean -green soybean -green pea -snow pea -sugar snap pea -summer squash -winter squash -spaghetti squash -zucchini -yellow squash -butternut squash -acorn squash -chard -turnip greens -salad green -bean sprout -spinach -lamb's-quarter -cress -chicory -chicory escarole -radicchio -lettuce -leaf lettuce -crisphead lettuce -cos -green onion -shallot -purple onion -doughnut -bread -crouton -breadstick -soft pretzel -rye bread -dark bread -raisin bread -brown bread -cinnamon bread -quick bread -matzo -sour bread -bun -white bread -challah -loaf of bread -pretzel -English muffin -toast -nan -chapatti -garlic bread -Yorkshire pudding -banana bread -scone -Irish soda bread -biscuit -muffin -drop scone -cornbread -nut bread -buttermilk biscuit -hardtack -shortcake -corn muffin -popover -bran muffin -cornpone -hush puppy -johnnycake -hamburger bun -bagel -frankfurter bun -sweet roll -hard roll -brioche -crescent roll -honey bun -cinnamon roll -cross bun -Italian bread -baguet -French bread -meat loaf -French loaf -material -stucco -gravel -rock -leopard -soil -sand -loofa -paper -litter -toilet tissue -queen -comestible -foodstuff -fare -beverage -soul food -feed -nutriment -yolk -comfort food -egg -grain -carrot juice -soya milk -whole wheat flour -oatmeal -ingredient -dairy product -cocoa -concoction -Spam -juice -canned food -corn -rice -wild rice -barley -wheat -sweet corn -popcorn -white rice -paddy -flavorer -egg yolk -saffron -juniper berries -cayenne -sesame seed -sassafras -spice -condiment -sweetening -herb -paprika -garlic -nasturtium -mocha -cardamom -nutmeg -stick cinnamon -Chinese anise -clove -cinnamon -guacamole -chili sauce -olive -chutney -vinegar -dip -soy sauce -salsa -cranberry sauce -catsup -spread -green olive -sauce -wine vinegar -cider vinegar -hummus -miso -spaghetti sauce -chocolate sauce -Tabasco -hot sauce -veloute -pesto -dressing -bourguignon -hollandaise -carbonara -tomato sauce -green mayonnaise -mayonnaise -powdered sugar -honey -syrup -sorghum -grenadine -maple syrup -basil -lemon balm -sweet woodruff -clary sage -hyssop -comfrey -coriander -mint -chives -marjoram -borage -sage -tea -rosemary -parsley -bay leaf -thyme -tea bag -oolong -souchong -cream -milk -whipping cream -clotted cream -light cream -heavy cream -stuffing -batter -dough -filling -pastry -bread dough -puff paste -phyllo -chow -menu -dietary -diet -diet -dietary supplement -vegetarianism -vitamin pill -multivitamin -alcohol -fruit juice -fizz -near beer -cocoa -coffee -cider -tea -soft drink -fruit drink -ginger beer -drinking water -potion -smoothie -mixed drink -liquor -sake -wine -hooch -home brew -liqueur -hard cider -brew -neutral spirits -aperitif -highball -cocktail -spritzer -punch -pina colada -mimosa -julep -gin and tonic -Bloody Mary -martini -gimlet -gin and it -daiquiri -sidecar -Sazerac -margarita -cup -May wine -eggnog -fruit punch -vodka -firewater -aquavit -grog -schnapps -arrack -gin -rum -aqua vitae -tequila -bitters -geneva -brandy -ouzo -whiskey -eau de vie -Cognac -grappa -Armagnac -Calvados -Irish -bourbon -sour mash -Scotch -rye -corn whiskey -blended whiskey -blush wine -vintage -champagne -vin ordinaire -dessert wine -macon -sparkling wine -Cotes de Provence -varietal -Burgundy -fortified wine -Bordeaux -table wine -California wine -vermouth -red wine -Rhone wine -white wine -Montrachet -Beaujolais -Chablis -Madeira -sherry -malmsey -port -muscat -Saint Emilion -claret -dry vermouth -sweet vermouth -Medoc -Chianti -Pinot noir -Rioja -Merlot -Cabernet -zinfandel -Riesling -Sauvignon blanc -Muscadet -Yquem -Pinot blanc -Sauterne -Chenin blanc -Chardonnay -sack -Verdicchio -Canary wine -Pernod -Drambuie -sambuca -triple sec -absinth -maraschino -anisette -beer -lager -draft beer -ale -suds -Munich beer -Pilsner -light beer -malt -bock -Weissbier -porter -stout -bitter -pale ale -Guinness -Weizenbock -orange juice -cranberry juice -nectar -iced coffee -caffe latte -espresso -cappuccino -Irish coffee -chicory -cafe au lait -mocha -Turkish coffee -ice tea -cuppa -tonic -cola -orange soda -ginger ale -pop -root beer -Coca Cola -Pepsi -mineral water -bottled water -soda water -oil cake -bird feed -fodder -eatage -hay -alfalfa -broad bean -dainty -fast food -puree -finger food -dish -course -mother's milk -vitamin -kosher -meal -jello -gelatin -sweet -candied apple -confiture -candy -chewing gum -confectionery -maraschino -conserve -strawberry jam -apple butter -lemon curd -jam -jelly -peppermint -peanut brittle -chocolate kiss -nougat bar -candy bar -jelly bean -lollipop -candy cane -truffle -chocolate fudge -cough drop -sugar candy -Easter egg -kiss -gumdrop -candy corn -fondant -cotton candy -caramel -fudge -candy egg -chocolate egg -bubble gum -gum ball -poached egg -piece de resistance -side dish -stew -omelet -soup -sashimi -taco -French toast -cheese souffle -potpie -lamb curry -stuffed tomato -chow mein -croquette -gefilte fish -coq au vin -special -spaghetti and meatballs -eggs Benedict -schnitzel -buffalo wing -chicken casserole -rissole -paella -frittata -meatball -chili -porridge -tamale -stuffed tomato -couscous -deviled egg -beef Wellington -pasta -egg roll -enchilada -falafel -mushy peas -turnover -scrambled eggs -Spanish rice -teriyaki -barbecued spareribs -pilaf -kabob -tempura -samosa -fried egg -sandwich plate -chicken cacciatore -saute -fried rice -custard -sukiyaki -fish and chips -souffle -steak au poivre -pizza -fondue -biryani -stuffed peppers -mousse -shirred egg -Swedish meatball -jambalaya -Scotch egg -burrito -risotto -salad -boiled egg -curry -snack food -bouillabaisse -goulash -pottage -beef stew -hot pot -fish stew -hotchpotch -Irish stew -ratatouille -gazpacho -won ton -petite marmite -split-pea soup -consomme -chowder -potage -marmite -lentil soup -bisque -pea soup -pepper pot -chicken broth -chicken soup -broth -broth -gumbo -borsch -corn chowder -clam chowder -fish chowder -gruel -congee -macaroni and cheese -lasagna -cannelloni -spaghetti -creme caramel -creme brulee -pepperoni pizza -anchovy pizza -cheese pizza -Sicilian pizza -sausage pizza -chocolate fondue -cheese fondue -coleslaw -macaroni salad -tossed salad -salad nicoise -pasta salad -fruit salad -tabbouleh -green salad -chef's salad -hard-boiled egg -Easter egg -sandwich -corn chip -chip -bomber -cheeseburger -chicken sandwich -ham sandwich -Reuben -bacon-lettuce-tomato sandwich -chili dog -open-face sandwich -gyro -wrap -hamburger -club sandwich -hotdog -tortilla chip -nacho -entree -plate -dessert -appetizer -mousse -tiramisu -frozen dessert -pudding -pudding -trifle -flan -whip -dumpling -compote -chocolate mousse -pavlova -parfait -ice-cream cake -ice lolly -ice-cream sundae -ice-cream cone -ice cream -ice -banana split -frozen yogurt -frozen custard -vanilla ice cream -peach ice cream -chocolate ice cream -strawberry ice cream -plum pudding -chocolate pudding -shrimp cocktail -stuffed mushroom -cocktail -hors d'oeuvre -carrot stick -antipasto -water-soluble vitamin -fat-soluble vitamin -vitamin P -vitamin C -B-complex vitamin -vitamin B2 -inositol -vitamin B6 -choline -pantothenic acid -vitamin B12 -vitamin Bc -vitamin D -vitamin A1 -picnic -bite -supper -breakfast -refection -smorgasbord -buffet -brunch -continental breakfast -dinner -lunch -banquet -cookout -fish fry -barbecue -refreshment -nosh -land -location -land -fomite -part -geological formation -cobweb -whole -hail -swamp -cultivated land -region -region -pass -line -point -opening -bedside -soil horizon -extremity -boundary -nib -selvage -shoreline -benthos -resort area -geographical area -district -scrubland -bush -oilfield -field -tract -heronry -grassland -site -court -basketball court -fairground -plot -field -amusement park -veld -pasture -campsite -garbage heap -cemetery -flowerbed -garden -topiary -peach orchard -yard -grainfield -playground -garden -city -city district -eparchy -kasbah -waterfront -business district -col -defile -hemline -spoor -crest -topographic point -workplace -half-mast -intersection -bus stop -mecca -hole-in-the-wall -patisserie -bakery -farm -piggery -ranch -dairy -knothole -chasm -oxbow -floor -pinetum -plain -steppe -cigarette butt -pipefitting -handle -panhandle -stock -haft -ax handle -broomstick -pistol grip -arete -volcanic crater -spring -ice mass -natural depression -natural elevation -oceanfront -massif -cliff -shore -talus -ridge -range -lakefront -slope -cave -foreshore -beach -hot spring -geyser -icecap -iceberg -Alpine glacier -glacier -valley -lunar crater -landfill -sinkhole -basin -crater -bed -hole -arroyo -ravine -canyon -gorge -tidal basin -cirque -ocean floor -riverbed -streambed -burrow -pothole -tableland -hill -mountain -highland -ridge -promontory -anthill -butte -foothill -knoll -alp -ben -volcano -sandbar -dune -reef -bank -coral reef -atoll -sandbank -bluff -point -mull -crag -precipice -seashore -strand -lakeside -littoral -seaside -mountainside -descent -hillside -ski slope -escarpment -bank -downhill -ascent -brae -uphill -riverbank -waterside -cove -cavern -grotto -artifact -living thing -natural object -assembly -block -millstone -paving -creation -opening -plaything -surface -tramline -structure -instrumentality -padding -covering -fabric -bookmark -float -building material -decoration -way -strip -article -facility -excavation -commodity -sheet -fixture -blacktop -line -bullion -tessera -tile -anvil -representation -art -needlework -product -pieta -map -sketch -sonogram -photograph -waxwork -arthrogram -radiogram -photomicrograph -photostat -painting -triptych -nude -finger-painting -smocking -stitch -sewing stitch -knitting stitch -lockstitch -hemstitch -garter stitch -purl -book -work -jotter -newspaper -wicker -masterpiece -openwork -woodwork -lacquerware -cabinetwork -joinery -decolletage -gargoyle -aperture -hole -mouthpiece -outfall -plughole -manhole -keyhole -perforation -thumbhole -pogo stick -ball -pinata -teddy -jungle gym -bubble -hula-hoop -pinwheel -slide -sport kite -cockhorse -doll -foam -air bubble -spume -shaving foam -golliwog -kachina -horizontal surface -board -tabletop -side -platform -tarmacadam -floor -turntable -stage -dais -sumo ring -hurricane deck -flatbed -parquet -backgammon board -pegboard -facade -ceiling -body -floor -bridge -corner -conformation -superstructure -airdock -cross -house of cards -hull -gun enclosure -lookout -building complex -shelter -honeycomb -column -altar -arch -tower -transept -mound -fountain -obelisk -fan vaulting -arcade -loggia -coil -billboard -partition -masonry -skein -colonnade -obstruction -building -sail -projection -peristyle -door -stadium -drinking fountain -area -balcony -porch -dock -high altar -housing -supporting structure -balance -defensive structure -entablature -memorial -establishment -signboard -bodywork -fuselage -ground floor -mezzanine -loft -basement -footbridge -drawbridge -cantilever bridge -rope bridge -overpass -truss bridge -viaduct -steel arch bridge -covered bridge -gangplank -suspension bridge -trestle bridge -plant -college -winery -factory -distillery -oil refinery -refinery -rolling mill -foundry -steel mill -lumbermill -stamp mill -quartz battery -battery -harbor -Nissen hut -hovel -tent -hut -igloo -dugout -mountain tent -pup tent -pavilion -backpacking tent -fly tent -canvas tent -field tent -wall tent -circus tent -Gothic arch -round arch -pointed arch -triumphal arch -broken arch -Moorish arch -Roman arch -campanile -turret -clock tower -shot tower -church tower -minaret -pylon -silo -watchtower -trestle -pylon -steeple -fire tower -high-rise -supporting tower -control tower -bell tower -beacon -burial mound -snowbank -rampart -fraise -battlement -altarpiece -wall -gable -wainscoting -attic -pediment -bell gable -brickwork -stonework -barrier -obstacle -plug -lever -grate -safety rail -movable barrier -bannister -breakwater -grille -weir -railing -hurdle -starting gate -fence -dam -gate -door -lychgate -portcullis -turnstile -French window -car door -screen door -French door -double door -interior door -sliding door -revolving door -barn door -hatchback -storm door -wall -retaining wall -rail fence -chainlink fence -dry wall -hedge -worm fence -picket fence -stone wall -water jump -bunker -earplug -cork -tap -presbytery -hotel -tenement -abattoir -apartment building -aviary -hall -house -Roman building -rest house -outbuilding -funeral home -medical building -hotel-casino -library -casino -farm building -place of worship -restaurant -ministry -rotunda -observatory -office building -temple -signal box -government building -greenhouse -rink -planetarium -public house -bowling alley -house -ruin -architecture -skyscraper -gazebo -school -chapterhouse -theater -hall of residence -conservatory -center -resort hotel -resort -motel -dude ranch -Ritz -ski lodge -hostel -motor hotel -city hall -guildhall -lyceum -field house -oast house -courthouse -shed -garage -carport -outhouse -coach house -boathouse -woodshed -apiary -maternity hospital -dispensary -stable -chicken coop -cowbarn -barn -pantheon -church -temple -shrine -stupa -masjid -synagogue -mosque -chapel -kirk -abbey -cathedral -cathedral -minster -cafe -rotisserie -automat -brasserie -cafeteria -diner -capitol -embassy -town hall -chancellery -customhouse -Statehouse -courthouse -ice rink -ice hockey rink -alehouse -free house -solar house -bungalow -row house -cabin -duplex house -mansion -lodging house -gatehouse -log cabin -saltbox -country house -dollhouse -ranch house -boarding house -detached house -villa -chalet -residence -farmhouse -terraced house -brownstone -palace -stately home -manor -summer house -dacha -villa -chateau -manse -religious residence -glebe house -parsonage -palace -monastery -abbey -abbey -day school -conservatory -music school -opera -music hall -cinema -little theater -home theater -control center -settlement house -call center -cornice -cog -knob -bill -flange -brim -tine -eaves -tooth -pinhead -football stadium -hippodrome -dome -ballpark -bullring -amphitheater -patio -corner -baggage claim -hideaway -choir -breakfast area -quad -chancel -auditorium -court -dining area -room -assembly hall -enclosure -nave -aisle -storage space -goalmouth -food court -atrium -cloister -forecourt -toilet -sun parlor -engineering -surgery -rotunda -classroom -gallery -manor hall -cell -lounge -sauna -dressing room -billiard room -belfry -kitchen -library -storeroom -workroom -sewing room -anechoic chamber -dining room -recreation room -hospital room -reading room -booth -conference room -bedroom -clean room -living room -door -hall -reception room -boardroom -study -locker room -cocktail lounge -television room -compartment -court -poolroom -bathroom -control room -anteroom -water closet -men's room -washroom -public toilet -home room -lecture room -study hall -pantry -stockroom -vault -refectory -dining-hall -canteen -family room -rumpus room -emergency room -recovery room -operating room -telephone booth -voting booth -confessional -shower stall -master bedroom -motel room -guestroom -hotel room -dormitory -nursery -day nursery -great hall -concert hall -palace -exhibition hall -parlor -drawing room -press box -command module -cabin -pilothouse -cab -luggage compartment -cabinet -cockpit -stateroom -car -cable car -stall -drawing room -terrarium -cage -playpen -pen -vivarium -pound -lock -chicken yard -chamber -recess -birdcage -rabbit hutch -hutch -cow pen -rodeo -fold -sounding board -burial chamber -firing chamber -resonator -furnace -bomb shelter -hyperbaric chamber -repository -mausoleum -kiln -blast furnace -oast -gas oven -incinerator -mihrab -columbarium -fire -fireplace -apse -cellar -cupboard -stacks -gallery -amphitheater -organ loft -stoop -sun deck -front porch -veranda -deck -back porch -portico -marina -dry dock -block -dwelling -tennis camp -living quarters -mobile home -condominium -apartment -ward -cellblock -condominium -yurt -lodge -vacation home -hearth -fixer-upper -cliff dwelling -homestead -semi-detached house -wigwam -tepee -accommodation -first class -cabin class -bedsitting room -flatlet -chassis -support -framework -pedestal -buttress -flying buttress -abutment -ribbing -bustle -window frame -frame -gantry -honeycomb -truss -lattice -cornice -picture frame -window -climbing frame -trellis -airframe -grate -grape arbor -walker -casing -tambour -arbor -rack -mounting -sash -casement -oriel -bay window -stained-glass window -skylight -display window -rose window -porthole -transom -clerestory -dormer -dormer window -lancet window -fanlight -plate rack -barbecue -bicycle rack -luggage rack -dish rack -towel rack -passe-partout -pave -mount -stronghold -fortress -fortification -bastion -keep -kremlin -acropolis -alcazar -martello tower -fieldwork -bastion -escarpment -palisade -castle -cenotaph -megalith -Seven Wonders of the Ancient World -brass -national monument -pantheon -dolmen -menhir -place of business -institution -university -mercantile establishment -office -cabaret -health spa -plaza -country store -department store -shop -marketplace -boutique -salon -shoe shop -bookshop -package store -thriftshop -junk shop -toyshop -cleaners -bazaar -gift shop -florist -drugstore -garage -delicatessen -small stores -barbershop -stall -tobacco shop -newsstand -butcher shop -pizzeria -confectionery -convenience store -bazaar -agora -grocery store -open-air market -supermarket -hypermarket -greengrocery -souk -farmer's market -flea market -newsroom -box office -headquarters -correctional institution -orphanage -jail -penitentiary -prison -toiletry -weaponry -equipment -connection -implement -furnishing -device -ceramic -system -container -conveyance -medium -deodorant -bath oil -cream -lotion -shaving cream -hair spray -mousse -perfume -hairdressing -antiperspirant -powder -cosmetic -bath salts -hand cream -cold cream -sunscreen -lanolin -body lotion -toner -hand lotion -after-shave -potpourri -patchouli -perfumery -cologne -toilet water -pomade -brilliantine -toilet powder -talcum -depilatory -highlighter -makeup -face powder -lip-gloss -eyeshadow -mascara -lipstick -rouge -eyeliner -eyebrow pencil -armament -defense system -bomb -ammunition -naval weaponry -bazooka -artillery -launcher -cannon -field artillery -mortar -basilisk -hydrogen bomb -atom bomb -round -shotgun shell -recorder -sports equipment -photographic equipment -naval equipment -parasail -gear -satellite -game equipment -parachute -electronic equipment -apparatus -automation -material -baggage -tape recorder -cassette recorder -Dictaphone -videocassette recorder -baseball equipment -croquet mallet -clay pigeon -skate -wrestling mat -cricket equipment -basketball equipment -javelin -shuttlecock -golf equipment -spike -stick -boxing equipment -boxing glove -gymnastic apparatus -weight -baseball glove -batting cage -batting glove -base -batting helmet -baseball bat -home plate -first base -third base -second base -in-line skate -Rollerblade -roller skate -ice skate -hockey skate -speed skate -figure skate -cricket bat -wicket -golfcart -golf glove -tee -golf club -wood -iron -driver -spoon -wedge -midiron -putter -niblick -pitching wedge -sand wedge -hockey stick -polo mallet -horizontal bar -horse -uneven parallel bars -parallel bars -trampoline -balance beam -vaulting horse -pommel horse -dumbbell -barbell -enlarger -camera -clapperboard -film -light meter -box camera -flash camera -Polaroid camera -point-and-shoot camera -webcam -motion-picture camera -digital camera -portrait camera -reflex camera -X-ray film -reel -negative -regalia -kit -rig -fishing gear -stable gear -rigging -crown -crown jewels -sewing kit -first-aid kit -carpenter's kit -layette -drill rig -drilling platform -harness -snaffle -headgear -saddle blanket -halter -bridle -sputnik -space station -backboard -ball -puzzle -pool table -bowling pin -man -chip -roulette wheel -goal -volleyball net -pinball machine -soccer ball -pool ball -bowling ball -softball -field hockey ball -punching bag -billiard ball -croquet ball -cricket ball -tennis ball -golf ball -rugby ball -cue ball -medicine ball -basketball -eight ball -ping-pong ball -handball -baseball -racquetball -bocce ball -volleyball -jigsaw puzzle -crossword puzzle -chessman -white -pawn -basket -net -electronic fetal monitor -monitor -monitor -television monitor -telephone -oscilloscope -peripheral -booster -cassette player -CD player -receiver -audio system -lens -playback -television equipment -circuitry -cassette deck -central processing unit -mixer -scanner -tape player -detector -modem -equalizer -tape deck -amplifier -cellular telephone -speakerphone -desk phone -pay-phone -handset -dial telephone -radiotelephone -television receiver -radio receiver -satellite receiver -heterodyne receiver -clock radio -reproducer -hi-fi -stereo -iPod -Walkman -video iPod -ghetto blaster -camcorder -television camera -pendulum -purifier -sequencer -reformer -duplicator -heat pump -semaphore -tomograph -ultracentrifuge -generator -incubator -burner -Foucault pendulum -clock pendulum -metronome -Photostat -photocopier -Xerox -facsimile -mimeograph -positron emission tomography scanner -computerized axial tomography scanner -gas burner -blowtorch -bunsen burner -gas ring -packaging -blister pack -roofing -temporary hookup -slip ring -telephone line -ligament -junction -hot line -digital subscriber line -land line -binder -wire -chain -concertina -barbed wire -paper chain -anchor chain -fob -bicycle chain -tire chain -chatelaine -joint -contact -dovetail -welt -hinge -scarf joint -weld -seam -mortise joint -butt hinge -strap hinge -distributor point -tread -wiper -bar -tool -utensil -rubber eraser -needle -eraser -stick -brush -hook -sharpener -sports implement -leather strip -swatter -fire iron -oar -stick -cleaning implement -rod -writing implement -shovel -split rail -fret -bolt -rotor -towel rail -lever -track -handlebar -crowbar -stick -key -tappet -pedal -rocker arm -gun trigger -space bar -backspace key -shift key -telegraph key -accelerator -sustaining pedal -hand tool -jack -pestle -garden tool -plow -comb -drill -cutting implement -tamp -garden rake -rake -stamp -locking pliers -pestle -plunger -pincer -pliers -soldering iron -spade -hammer -pipe cutter -wrench -screwdriver -trowel -saw -opener -scraper -shovel -brick trowel -spatula -carpenter's hammer -gavel -mallet -maul -torque wrench -pipe wrench -adjustable wrench -open-end wrench -Allen wrench -box wrench -hacksaw -folding saw -handsaw -pruner -pruning saw -corkscrew -bottle opener -can opener -hedge trimmer -lawn mower -power mower -riding mower -power drill -electric drill -cutter -twist bit -bit -blade -knife blade -bolt cutter -cigar cutter -edge tool -scissors -knife -ax -razor -wire cutter -chisel -plane -shears -snips -pruning shears -secateurs -carving knife -Bowie knife -pocketknife -cleaver -hunting knife -case knife -parer -letter opener -switchblade -penknife -battle-ax -hatchet -shaver -straight razor -safety razor -cold chisel -wood chisel -jointer -smooth plane -spokeshave -kitchen utensil -ceramic ware -funnel -rolling pin -reamer -masher -kitchenware -squeezer -mixer -cookie cutter -cooking utensil -grater -mincer -eggbeater -whisk -blender -pan -Crock Pot -chafing dish -spatula -griddle -enamelware -steamer -cookie sheet -cooker -turner -omelet pan -stewing pan -frying pan -roaster -wok -saucepan -graniteware -cloisonne -porcelain -earthenware -stoneware -pottery -Spode -china -bone china -majolica -faience -knitting needle -crochet needle -walking stick -matchstick -club -fiddlestick -spindle -stob -staff -drumstick -mallet -cane -sword cane -bat -table-tennis racquet -truncheon -alpenstock -flagpole -crutch -electric toothbrush -toothbrush -sable -scrub brush -hairbrush -bristle brush -shaving brush -pencil sharpener -steel -cue -racket -squash racket -tennis racket -badminton racket -thong -strap -cheekpiece -rein -noseband -leading rein -scull -paddle -besom -scouring pad -dustmop -squeegee -broom -swab -rotating shaft -wand -shaft -piston rod -kickstand -axle -pole -fishing rod -connecting rod -tie rod -driveshaft -crankshaft -transmission shaft -spindle -camshaft -boom -stilt -ski pole -clothes tree -caber -spar -mast -mast -bowsprit -yard -mizzenmast -royal mast -mainmast -foremast -fly rod -spinning rod -pencil -pen -highlighter -chalk -crayon -lead pencil -ballpoint -Sharpie -quill -fountain pen -felt-tip pen -furniture -office furniture -dining-room furniture -wardrobe -bedroom furniture -table -table -wall unit -lamp -dining-room table -washstand -buffet -cabinet -baby bed -bedstead -lawn furniture -credenza -bookcase -entertainment center -etagere -seat -sectional -chest of drawers -file -Rolodex -card index -vertical file -clothes closet -armoire -bed -berth -platform bed -hospital bed -bunk -trundle bed -four-poster -couch -bunk bed -twin bed -sleigh bed -single bed -hammock -Murphy bed -double bed -gaming table -gueridon -table-tennis table -counter -altar -breakfast table -stand -conference table -pedestal table -kitchen table -operating table -tea table -lectern -worktable -gateleg table -dressing table -desk -drop-leaf table -coffee table -trestle table -console table -checkout -bar -meat counter -reception desk -salad bar -snack bar -drafting table -lab bench -writing desk -secretary -davenport -dining table -dinner table -refectory table -floor lamp -table lamp -reading lamp -dresser -china cabinet -medicine chest -bassinet -crib -carrycot -cradle -chair -toilet seat -stool -sofa -ottoman -bench -lawn chair -chaise longue -rocking chair -swivel chair -throne -straight chair -ladder-back -highchair -armchair -Windsor chair -folding chair -wheelchair -motorized wheelchair -barber chair -easy chair -recliner -Morris chair -wing chair -deck chair -camp chair -music stool -taboret -footstool -settee -daybed -convertible -love seat -chesterfield -studio couch -park bench -flat bench -pew -settle -window seat -chiffonier -highboy -bird feeder -heater -lighter -signal -converter -crusher -drive -knocker -peeler -musical instrument -shoehorn -shock absorber -machine -conductor -bait -stabilizer -filter -mechanism -acoustic device -trap -charger -airfoil -router -pick -energizer -fan -hydrofoil -dental appliance -adapter -toy -support -optical device -straightener -tongs -phonograph needle -instrument -comb -remote control -exercise device -comforter -washboard -shredder -water ski -blower -ventilator -breathing device -applicator -skeleton key -guitar pick -restraint -keyboard -electrical device -appliance -fire extinguisher -corrective -reflector -alarm -electronic device -snowshoe -holding device -memory device -key -noisemaker -source of illumination -indicator -detector -breathalyzer -imprint -afterburner -horn -elastic device -ski -lifting device -solar heater -electric heater -radiator -gas heater -convector -space heater -stove -cigar lighter -match -cairn -sign -street sign -traffic light -electrical converter -catalytic converter -inverter -synchronous converter -external drive -CD-ROM drive -internal drive -stringed instrument -electronic instrument -keyboard instrument -wind instrument -bass -percussion instrument -dulcimer -chordophone -banjo -zither -samisen -guitar -bowed stringed instrument -sitar -lute -mandola -mandolin -harp -acoustic guitar -Hawaiian guitar -uke -electric guitar -viol -violin -cello -viola -viola da gamba -Stradavarius -theremin -electric organ -synthesizer -piano -clavier -organ -accordion -grand piano -upright -spinet -mechanical piano -baby grand -concert grand -harpsichord -spinet -ocarina -woodwind -brass -organ pipe -free-reed instrument -whistle -pipe -kazoo -flute -beating-reed instrument -double-reed instrument -single-reed instrument -bassoon -oboe -clarinet -sax -baritone -bugle -flugelhorn -French horn -trombone -cornet -harmonium -harmonica -concertina -chanter -panpipe -bagpipe -fipple flute -pennywhistle -drone -bass fiddle -bass horn -bass guitar -euphonium -handbell -bones -gong -vibraphone -steel drum -marimba -glockenspiel -chime -kettle -maraca -drum -cymbal -bongo -bass drum -tambourine -snare drum -tenor drum -slot machine -power shovel -press -backhoe -printer -machine tool -motor -snow thrower -cash machine -farm machine -computer -Zamboni -mill -staple gun -power tool -concrete mixer -stapler -slicer -textile machine -record player -calculator -vending machine -slot -automat -garlic press -bench press -hydraulic press -punch press -character printer -impact printer -printer -drum printer -line printer -laser printer -Linotype -thermal printer -portable -typewriter -bar printer -wire matrix printer -dot matrix printer -bubble jet printer -ink-jet printer -shaper -drill press -grinder -lathe -miller -engine -electric motor -heat engine -jet engine -automobile engine -aircraft engine -generator -steam engine -internal-combustion engine -wind turbine -gasoline engine -diesel -outboard motor -radial engine -rocket -fanjet -booster -space rocket -alternator -windmill -starter -kick starter -cultivator -haymaker -combine -thresher -harvester -disk harrow -harrow -slide rule -web site -home computer -server -digital computer -supercomputer -workstation -personal computer -portable computer -desktop computer -notebook -planner -laptop -hand-held computer -pepper mill -water mill -meat grinder -coffee mill -treadmill -windmill -electric hammer -power saw -buffer -circular saw -chain saw -table saw -saber saw -bandsaw -spinning wheel -loom -jukebox -gramophone -abacus -adding machine -hand calculator -semiconductor device -wire -cord -heat sink -cable -microprocessor -transistor -light-emitting diode -chip -filament -jumper cable -telephone wire -patchcord -telephone cord -power cord -extension cord -ethernet cable -electrical cable -printer cable -power line -fisherman's lure -fly -dry fly -wet fly -streamer fly -outrigger -vane -strainer -air filter -oil filter -sieve -tea-strainer -colander -fusee drive -android -radiator -mechanical device -rotating mechanism -rotor head -carriage -control -power steering -automaton -action -cooling system -gear -tape drive -film advance -sprinkler -propeller -anchor -golf-club head -weathervane -machine -seeder -pump -gearshift -ride -bumper -hook -ski binding -coupling -record changer -swing -windshield wiper -winder -winder -diaphragm -shutter -escapement -broadcaster -curler -splint -compressor -air compressor -carburetor -dildo -cartridge holder -trapeze -gearing -stator -airplane propeller -screw -pulley -wheel -idle pulley -lever -inclined plane -millwheel -waterwheel -roller -bicycle wheel -caster -grinding wheel -rowel -fifth wheel -wagon wheel -waterwheel -car wheel -sprocket -pinwheel -potter's wheel -gear -driving wheel -paddlewheel -roulette -spur gear -bevel gear -pinion -ramp -ax head -screw -grease-gun -gas pump -bicycle pump -sump pump -hand pump -centrifugal pump -Ferris wheel -roller coaster -carousel -universal joint -clutch -freewheel -disk clutch -bobbin -reel -shuttle -blade -gyroscope -circle -rotor -paddle -impeller -fan blade -disk -puck -brake disk -token -Frisbee -planchet -tail rotor -main rotor -valve -steering wheel -governor -joystick -regulator -switch -ball valve -butterfly valve -timer -flywheel -faucet -thermostat -aperture -mixing faucet -stopcock -toggle switch -push button -dial -horn button -mouse button -doorbell -bell push -flintlock -movement -gunlock -cooling tower -evaporative cooler -air conditioner -gearset -four-wheel drive -whistle -silencer -megaphone -hearing aid -bell -cowbell -church bell -dinner bell -spider web -mousetrap -lobster pot -web -net -landing net -fishnet -vertical stabilizer -spoiler -spoiler -rotor blade -flap -rudder -horizontal stabilizer -wing -exhaust fan -electric fan -brace -denture -backboard -stirrup -pier -pier -back -shelf -landing gear -baluster -spoke -base -step -brace -pillow block -bearing -rocker -coat hanger -harp -rest -bracket -tailstock -bookend -structural member -headstock -seat -thrust bearing -hanger -rack -harness -cantle -ladder-back -bookshelf -mantel -neck brace -knee brace -ankle brace -back brace -arm -headrest -chin rest -armrest -sconce -corbel -shelf bracket -sill -riser -upright -brace -tread -beam -windowsill -doorsill -stile -jamb -column -post -support column -caryatid -goalpost -newel post -bollard -lamppost -telephone pole -maypole -timber -rundle -tie -rafter -girder -timber -floor joist -joist -car seat -pillion -plane seat -saddle -chair -bicycle seat -bucket seat -backseat -stock saddle -English saddle -tripod -spice rack -magazine rack -music stand -camera tripod -easel -autofocus -projector -finder -laser -lens -objective -condenser -camera lens -anastigmat -contact -sunglass -eyepiece -field lens -Fresnel lens -portrait lens -closeup lens -telephoto lens -wide-angle lens -plotter -scientific instrument -measuring instrument -weapon -guillotine -drafting instrument -analyzer -navigational instrument -optical instrument -medical instrument -instrument of punishment -catapult -extractor -theodolite -riding crop -tachymeter -collider -microtome -accelerator -stroboscope -magnifier -console -telescope -microscope -astronomical telescope -equatorial -optical telescope -radio telescope -refracting telescope -field glass -reflecting telescope -Cassegrainian telescope -Newtonian telescope -Schmidt telescope -Maksutov telescope -electron microscope -field-emission microscope -light microscope -binocular microscope -hand glass -operating microscope -compound microscope -loupe -oximeter -dropper -refractometer -rangefinder -barometer -pedometer -thermometer -astrolabe -measuring stick -gauge -timepiece -aneroid barometer -caliper -potentiometer -tachometer -scale -tape -meter -hygrometer -sextant -rule -altazimuth -pyrometer -meat thermometer -water gauge -vacuum gauge -anemometer -gasoline gauge -pressure gauge -manometer -sphygmomanometer -atomic clock -clock -watch -sundial -timer -hourglass -grandfather clock -digital clock -alarm clock -wall clock -analog clock -pendulum clock -cuckoo clock -digital watch -analog watch -pocket watch -wristwatch -stopwatch -parking meter -chronograph -vernier caliper -micrometer -balance -analytical balance -electronic balance -electric meter -odometer -ammeter -speedometer -ohmmeter -water meter -voltmeter -magnetometer -tomahawk -gun -bow -bow and arrow -brass knucks -knife -sword -stun gun -projectile -antiaircraft -firearm -set gun -air gun -gas gun -paintball gun -cannon -autoloader -pistol -twenty-two -Mauser -muzzle loader -rifle -repeating firearm -semiautomatic firearm -automatic firearm -Garand rifle -Luger -semiautomatic pistol -automatic rifle -assault rifle -automatic pistol -machine gun -submachine gun -burp gun -Uzi -Kalashnikov -Tommy gun -Colt -derringer -revolver -gat -flintlock -musket -sniper rifle -Winchester -carbine -crossbow -longbow -khukuri -bayonet -machete -dagger -rapier -fencing sword -broadsword -cavalry sword -saber -epee -foil -bullet -cannonball -compass -protractor -artificial horizon -depth finder -magnetic compass -compass -binoculars -spectacles -projector -telescopic sight -goggles -sunglasses -slide projector -front projector -movie projector -overhead projector -hypodermic syringe -cardiograph -syringe -stethoscope -laryngoscope -otoscope -surgical instrument -retractor -hemostat -pillory -rattan -exercise bike -treadmill -respirator -snorkel -oxygen mask -aqualung -paintbrush -spray gun -brake -handcuff -fastener -seat belt -leash -safety belt -brake system -muzzle -chain -bolt -buckle -knot -cleat -clothespin -catch -pin -dowel -screw -slide fastener -button -seal -paper fastener -lock -thumbtack -locker -clasp -clip -carabiner -nail -toggle -nut and bolt -bowline -bow -latch -hasp -rivet -hairpin -skewer -hatpin -brochette -bobby pin -barrette -safety pin -shirt button -coat button -washer -gasket -head gasket -O ring -padlock -sash fastener -latch -combination lock -doorlock -paper clip -bulldog clip -hair slide -hydraulic brake -disk brake -drum brake -typewriter keyboard -QWERTY keyboard -computer keyboard -piano keyboard -circuit -Segway -jack -control panel -telephone jack -circuit breaker -plug -electrolytic -dashboard -transducer -solar cell -antenna -capacitor -spark plug -relay -surge suppressor -solar array -battery -Tesla coil -closed circuit -wiring -computer circuit -integrated circuit -module -printed circuit -interface -CPU board -circuit board -mosaic -electro-acoustic transducer -earphone -microphone -loudspeaker -telephone receiver -headset -condenser microphone -cardioid microphone -tweeter -bullhorn -tannoy -woofer -subwoofer -omnidirectional antenna -directional antenna -radio antenna -television antenna -dish -scanner -yagi -voltaic battery -flashlight battery -lead-acid battery -pack -prosthesis -solar dish -mirror -hand glass -car mirror -rearview mirror -outside mirror -burglar alarm -automobile horn -shofar -fire alarm -readout -scanner -tube -display -personal digital assistant -dongle -trackball -mouse -answering machine -hearing aid -beeper -triode -pentode -computer monitor -monitor -screen -digital display -liquid crystal display -flat panel display -window -dialog box -caller ID -computer screen -background -C-clamp -chuck -collet -holder -vise -candlestick -cigarette holder -candelabrum -menorah -Menorah -cache -optical disk -magnetic disk -memory -magnetic tape -recording -auxiliary storage -compact disk -videodisk -CD-ROM -CD-R -audio CD -hard disc -diskette -flash memory -random-access memory -videotape -cassette tape -tape -phonograph record -LP -seventy-eight -lamp -light -flash -lantern -candle -neon lamp -vigil light -taillight -gas lamp -oil lamp -hurricane lamp -fluorescent lamp -streetlight -spotlight -electric lamp -jack-o'-lantern -Chinese lantern -flashlight -light bulb -penlight -headlight -room light -strip lighting -fairy light -sconce -searchlight -night-light -blinker -torch -flood -fuel gauge -gnomon -dial -vernier scale -pointer -light pen -hand -sweep hand -minute hand -second hand -hour hand -spring -rubber band -coil spring -box spring -hoist -winch -elevator -crane -wheel and axle -derrick -maze -communication system -network -Global Positioning System -resonator -exhaust -mechanical system -computer system -scaffolding -reticle -walkie-talkie -radio -telecommunication system -telephone system -intercommunication system -interphone -television -satellite television -surveillance system -color television -local area network -superhighway -ethernet -wireless local area network -production line -linkage -suspension -fuel injection -planter -trophy case -wastepaper basket -dish -bread-bin -dispenser -pot -bunker -reliquary -cup -bag -cassette -Dumpster -bag -measuring cup -glass -paintball -measure -envelope -shaker -piggy bank -basket -sewing basket -savings bank -powder horn -can -wheeled vehicle -workbasket -bin -canister -mold -cargo container -videocassette -case -case -vessel -drawer -receptacle -package -watering can -box -cocotte -Petri dish -gravy boat -serving dish -tureen -sugar bowl -bowl -casserole -ramekin -butter dish -salad bowl -mixing bowl -porringer -cereal bowl -soup bowl -punch bowl -roll-on -aerosol -soap dispenser -atomizer -inhaler -demitasse -beaker -kylix -coffee cup -chalice -teacup -Dixie cup -evening bag -shoulder bag -clutch bag -reticule -backpack -sachet -beanbag -sandbag -carryall -pannier -duffel bag -book bag -tool bag -mailbag -purse -drawstring bag -envelope -saddlebag -sack -pouch -shopping bag -toilet bag -gamebag -kitbag -plastic bag -golf bag -sleeping bag -gunnysack -grocery bag -sporran -pocket -waist pack -fanny pack -hip pocket -patch pocket -flute -tumbler -water glass -bumper -liqueur glass -snifter -shot glass -beer glass -rummer -goblet -wineglass -cocktail shaker -saltshaker -pepper shaker -pannier -clothes hamper -hamper -breadbasket -shopping basket -wicker basket -milk can -beer can -soda can -pedicab -camper trailer -rolling stock -motor scooter -self-propelled vehicle -unicycle -wagon -bassinet -handcart -baby buggy -bicycle -horse-drawn vehicle -trailer -car -tricycle -armored vehicle -recreational vehicle -tracked vehicle -snowmobile -bulldozer -locomotive -streetcar -motor vehicle -tractor -forklift -armored personnel carrier -armored car -dune buggy -camper -van -shunter -diesel locomotive -electric locomotive -tank engine -traction engine -steam locomotive -diesel-electric locomotive -diesel-hydraulic locomotive -hearse -truck -amphibian -four-wheel drive -motorcycle -go-kart -car -snowplow -fire engine -van -trailer truck -transporter -garbage truck -ladder truck -tow truck -dump truck -tractor -pickup -delivery truck -moving van -passenger van -police van -bookmobile -trail bike -moped -beach wagon -loaner -Model T -electric -minivan -convertible -compact -cab -shooting brake -racer -hatchback -roadster -berlin -sport utility -sedan -jeep -limousine -cruiser -ambulance -used-car -stock car -subcompact -pace car -hot rod -sports car -coupe -covered wagon -cart -horse cart -dumpcart -jinrikisha -pony cart -oxcart -tea cart -laundry cart -serving cart -barrow -shopping cart -hand truck -bicycle-built-for-two -safety bicycle -push-bike -mountain bike -carriage -gharry -buggy -stagecoach -four-wheeler -baggage car -freight car -passenger car -cabin car -boxcar -tank car -nonsmoker -Pullman -dining car -smoker -recycling bin -ashcan -litterbin -sandbox -pig bed -briefcase -compact -dispatch case -kit -wallet -cardcase -portfolio -ditty bag -cigarette case -shoe -gun case -attache case -locket -writing desk -watch case -baggage -glasses case -hand luggage -satchel -bag -trunk -hatbox -garment bag -weekender -carpetbag -portmanteau -overnighter -valise -boiler -flagon -bowl -ladle -bottle -bottle -pot -pitcher -bathtub -mortar -bucket -drinking vessel -cream pitcher -wine bucket -pressure cooker -tub -inkwell -tin -basin -monstrance -autoclave -churn -barrel -tank -jar -censer -toilet bowl -fishbowl -scoop -soup ladle -smelling bottle -pop bottle -water bottle -jug -catsup bottle -gourd -pill bottle -carboy -flask -beer bottle -ink bottle -demijohn -whiskey bottle -cruet -wine bottle -carafe -phial -whiskey jug -water jug -hipflask -Erlenmeyer flask -thermos -canteen -vacuum flask -magnum -jeroboam -saucepot -teapot -Dutch oven -urn -stockpot -kettle -caldron -percolator -teakettle -coffeepot -coffee urn -samovar -tea urn -sitz bath -hot tub -footbath -mug -loving cup -tankard -coffee mug -toby -beer mug -bidet -birdbath -washbasin -baptismal font -beer barrel -wine cask -keg -gas tank -water heater -septic tank -aquarium -reservoir -water tower -rain barrel -canopic jar -amphora -cookie jar -beaker -urn -Mason jar -vase -crock -jampot -plate -tray -cat box -dustpan -chamberpot -salver -garbage -in-basket -hot-water bottle -ossuary -socket -ashtray -packet -bundle -deck -bale -hay bale -pack -ballot box -carton -coffin -shoebox -snuffbox -pencil box -crate -bandbox -window box -chest -strongbox -cereal box -mailbox -casket -bier -packing box -toolbox -toy box -coffer -hope chest -treasure chest -cedar chest -cash register -safe-deposit -cashbox -safe -tramway -chairlift -sidecar -public transport -semitrailer -horsebox -vehicle -ski tow -roll-on roll-off -trailer -shipping -litter -express -shuttle bus -train -bus -local -freight liner -passenger train -subway train -mail train -freight train -commuter -bullet train -trolleybus -minibus -school bus -steamroller -bumper car -rocket -military vehicle -missile -craft -sled -half track -tank -panzer -personnel carrier -Humvee -aircraft -vessel -spacecraft -hovercraft -heavier-than-air craft -stealth aircraft -lighter-than-air craft -hang glider -glider -helicopter -warplane -airplane -autogiro -bomber -amphibian -propeller plane -airliner -biplane -floatplane -jet -fighter -stealth bomber -seaplane -airbus -widebody aircraft -jumbojet -jetliner -stealth fighter -interceptor -airship -blimp -balloon -hot-air balloon -boat -trawler -yacht -ship -sailing vessel -bareboat -lifeboat -police boat -gondola -sea boat -barge -river boat -tugboat -punt -pilot boat -small boat -ferry -tender -canal boat -fireboat -motorboat -dredger -pontoon -houseboat -skiff -canoe -dinghy -racing boat -coracle -yawl -gig -jolly boat -rowing boat -kayak -outrigger canoe -dugout canoe -racing gig -racing skiff -speedboat -outboard motorboat -cabin cruiser -hydrofoil -shipwreck -wreck -passenger ship -pirate -lightship -hospital ship -steamer -cargo ship -sister ship -warship -liner -luxury liner -cargo liner -cruise ship -paddle steamer -sternwheeler -bottom -container ship -banana boat -oil tanker -submarine -guided missile cruiser -frigate -battleship -guided missile frigate -aircraft carrier -man-of-war -destroyer -attack submarine -nautilus -yawl -clipper -felucca -sloop -ketch -dhow -sailboat -bark -schooner -windjammer -trimaran -catamaran -catboat -space shuttle -space capsule -dogsled -bobsled -bobsled -stretcher -covered couch -telecommunication -vehicle -print media -broadcasting -telephone -radiotelephone -television -reception -radio -cable television -high-definition television -three-way calling -call -voice mail -press -journalism -magazine -newspaper -pulp -slick -comic book -news magazine -tabloid -daily -gazette -Fleet Street -yellow journalism -pillow -pad -sanitary napkin -beer mat -futon -carpet pad -range hood -screen -top -footwear -protective covering -cloak -wrapping -upholstery -cloth covering -mask -finger -floor cover -coating -canopy -flap -domino -folder -planking -earmuff -camouflage -shoji -cap -manhole cover -lid -radiator cap -bottlecap -nipple -clog -shoe -arctic -boot -flats -slipper -overshoe -sabot -slingback -chukka -saddle oxford -spectator pump -brogan -wing tip -walker -blucher -anklet -cleats -gaiter -Loafer -running shoe -oxford -bowling shoe -plimsoll -pump -sandal -chopine -pusher -talaria -flip-flop -espadrille -jodhpur -buskin -ski boot -hip boot -riding boot -rubber boot -Hessian boot -waders -cowboy boot -mule -bootee -cold frame -cloche -washboard -toecap -mulch -shield -bracer -screen -sheathing -bell jar -shade -shelter -splashboard -testudo -roof -faceplate -hood -sheath -cap -mask -facing -crystal -calash -armor -binder -binding -housing -blind -lining -plate -horseshoe -armor plate -breastplate -helmet -cannon -knee piece -pickelhaube -sallet -window screen -fire screen -windshield -mosquito net -lampshade -parasol -lean-to -bell cote -sentry box -birdhouse -canopy -kennel -awning -umbrella -gamp -gable roof -sunroof -mansard -dome -hip roof -tile roof -housetop -vault -slate roof -gambrel -thatch -cupola -geodesic dome -onion dome -barrel vault -ribbed vault -holster -scabbard -shoulder holster -hubcap -thimble -distributor cap -lens cap -gasmask -face mask -ski mask -catcher's mask -body armor -shield -chain mail -bulletproof vest -corselet -cuirass -cabinet -radome -boot -window blind -jalousie -curtain -shutter -Venetian blind -window shade -roller blind -theater curtain -shower curtain -bushing -brake lining -gift wrapping -envelope -cellophane -book jacket -jacket -plastic wrap -shoulder -pant leg -leg -back -cosy -bandage -bosom -slipcover -bedclothes -sleeve -blindfold -eyepatch -skirt -seat -Band Aid -swathe -cast -elastic bandage -quilt -afghan -blanket -bedspread -mattress cover -patchwork -eiderdown -crazy quilt -coverlet -quilted bedspread -raglan sleeve -long sleeve -rug -doormat -mat -scatter rug -shag rug -prayer rug -broadloom -stair-carpet -red carpet -Brussels carpet -fixative -gold plate -verdigris -paint -nail polish -gilt -couch -enamel -veneer -finger paint -enamel -encaustic -oil paint -water-base paint -latex paint -whitewash -earflap -pocket flap -lapel -tongue -revers -tent-fly -file folder -matchbook -plush -muslin -tarpaulin -velvet -batik -khaki -belting -sacking -diaper -voile -duffel -chenille -cotton flannel -toweling -crinoline -panting -chintz -felt -cotton -velveteen -satin -knit -sateen -print -flannel -webbing -gabardine -camouflage -worsted -cashmere -tartan -mohair -brocade -velour -shirttail -boucle -madras -net -paisley -yoke -percale -piece of cloth -moquette -terry -rayon -acetate rayon -cord -permanent press -chiffon -burlap -ticking -basket weave -lace -sheeting -georgette -poplin -denim -flannelette -shantung -camel's hair -nylon -drapery -gauze -organza -foulard -gingham -wool -suede cloth -taffeta -leatherette -tweed -organdy -canopy -etamine -damask -oilcloth -tapestry -broadcloth -pique -homespun -tricot -double knit -jersey -gauze -tulle -chicken wire -handkerchief -groundsheet -dustcloth -dishrag -towel -bandanna -gusset -bib -sail -patch -hand towel -paper towel -dishtowel -fore-and-aft sail -foresail -spinnaker -headsail -topsail -mainsail -balloon sail -jib -mizzen -gaff topsail -lugsail -staysail -lateen -flash -shoulder patch -narrow wale -Bedford cord -macrame -pillow lace -raft -life preserver -life buoy -Mae West -life jacket -stone -brick -lumber -bricks and mortar -tile -concrete -quoin -millstone -stele -hone -grindstone -curbstone -gravestone -firebrick -mud brick -clinker -adobe -strip -chipboard -slat -fingerboard -toothpick -hip tile -pantile -cornice -embellishment -graffito -epergne -necklet -marquetry -brass -garnish -arabesque -design -adornment -frieze -lambrequin -tattoo -mihrab -emblem -swastika -herringbone -spot -flag -banner -totem pole -crucifix -fleur-de-lis -macule -parhelion -jewelry -frill -lavaliere -peplum -bangle -cigar band -aigrette -bracelet -bling -pendant earring -necklace -ghat -path -road -passage -sidewalk -towpath -pedestrian crossing -highway -carriageway -thoroughfare -trail -divided highway -expressway -arterial road -autostrada -autobahn -street -street -piste -horse-trail -adit -conduit -passageway -tube -sluice -snorkel -waterspout -catheter -barrel -pipe -hookah -tailpipe -drain -culvert -soil pipe -tunnel -stairwell -gangway -catacomb -railroad tunnel -tape -band -inkle -adhesive tape -plaster -cellulose tape -headstall -girdle -tire -armlet -radial -car tire -tableware -riband -cutlery -glass -hollowware -platter -spoon -table knife -fork -Spork -soupspoon -teaspoon -sugar spoon -wooden spoon -iced-tea spoon -tablespoon -dessert spoon -case knife -butter knife -steak knife -tablefork -carving fork -airfield -telpherage -air terminal -airport -menagerie -storehouse -station -warehouse -granary -crib -mineshaft -ditch -irrigation ditch -furrow -consumer goods -linen -clothing -appliance -leisure wear -grey -blue -nightwear -protective garment -outerwear -neckpiece -knitwear -loungewear -apparel -collar -military uniform -headdress -pajama -garment -array -woman's clothing -overall -glove -accessory -black -footwear -attire -ready-to-wear -beachwear -man's clothing -street clothes -slip-on -shin guard -overall -pressure suit -arm guard -foul-weather gear -diving suit -apron -shoulder pad -coverall -chest protector -elbow pad -spacesuit -knee pad -gown -vestment -chasuble -academic gown -battle dress -fatigues -dress uniform -khakis -helmet -hood -turban -hat -cap -cowl -tiara -football helmet -hard hat -crash helmet -sunhat -fur hat -cowboy hat -bearskin -boater -snap-brim hat -fedora -cavalier hat -sombrero -tricorn -beaver -porkpie -bonnet -pith hat -bowler hat -millinery -cloche -pillbox -baseball cap -coonskin cap -shower cap -kepi -balaclava -fez -tam -beret -skullcap -cloth cap -ski cap -watch cap -bathing cap -mortarboard -yarmulke -beanie -head covering -scarf -romper -diaper -wraparound -robe -wet suit -legging -skirt -undergarment -separate -vest -shirt -overgarment -hose -burqa -trouser -trouser -straitjacket -fur -neckwear -sweat suit -leotard -swimsuit -hand-me-down -raglan -suit -sweater -gown -face veil -niqab -chador -mantilla -muffler -headscarf -tudung -feather boa -stole -hijab -khimar -dressing gown -kimono -abaya -bathrobe -gaiter -spat -overskirt -grass skirt -miniskirt -kilt -maxi -ballet skirt -dirndl -sarong -hoopskirt -petticoat -brassiere -foundation garment -singlet -garter belt -crinoline -underwear -body stocking -camisole -uplift -chemise -underpants -corset -panty girdle -roll-on -lingerie -long johns -BVD -undies -nightgown -bloomers -thong -bikini pants -briefs -pantie -drawers -work-shirt -kurta -jersey -dashiki -polo shirt -coat -cloak -snowsuit -surcoat -duffel coat -sheepskin coat -frock coat -lab coat -greatcoat -jacket -raincoat -capote -sack coat -fur coat -mess jacket -single-breasted jacket -bomber jacket -pea jacket -swallow-tailed coat -doublet -bolero -parka -oilskin -trench coat -mink -sable coat -poncho -toga virilis -toga -kameez -serape -tunic -shawl -caftan -short pants -pajama -sweat pants -salwar -breeches -chino -slacks -jodhpurs -pedal pusher -long trousers -jean -cords -Levi's -stretch pants -bellbottom trousers -buckskins -hot pants -Bermuda shorts -lederhosen -necktie -cravat -bolo tie -Windsor tie -bow tie -black tie -maillot -swimming trunks -bikini -double-breasted suit -pinstripe -single-breasted suit -pants suit -business suit -three-piece suit -two-piece -turtleneck -cardigan -sweatshirt -pullover -top -G-string -camisole -dress -bodice -blouse -halter -cocktail dress -sari -caftan -sundress -chemise -strapless -gown -jumper -dirndl -bridal gown -tea gown -ball gown -gauntlet -mitten -kid glove -belt -furnishing -money belt -holster -cartridge belt -hosiery -tights -sock -stocking -pantyhose -maillot -athletic sock -tabi -knee-high -argyle -nylons -Christmas stocking -formalwear -ensemble -outfit -ao dai -costume -fancy dress -costume -frock -sportswear -academic costume -disguise -hairpiece -dinner jacket -balldress -dinner dress -dress suit -Afro-wig -toupee -wig -dress hat -brace -athletic supporter -home appliance -dryer -vacuum -iron -trouser press -curling iron -white goods -sewing machine -serger -kitchen appliance -Hoover -travel iron -steam iron -dishwasher -refrigerator -washer -cooler -electric refrigerator -ice machine -deep-freeze -toaster -microwave -toaster oven -coffee maker -hot plate -waffle iron -disposal -espresso maker -stove -oven -food processor -ice maker -cookstove -electric range -gas range -Primus stove -broiler -rotisserie -Dutch oven -gas oven -hand blower -clothes dryer -spin dryer -tumble-dryer -wringer -bath towel -doily -Turkish towel -bed linen -pillow sham -sheet -tinfoil -plywood -doorplate -board -drumhead -panel -laminate -blackboard -snowboard -Sheetrock -surfboard -skateboard -sideboard -scoreboard -wainscot -headboard -chandelier -plumbing fixture -soap dish -toilet -shower -water faucet -flush toilet -potty seat -rope -cord -lasso -bungee -spun yarn -cordage -thread -bootlace -wick -lanyard -floss -woof -worsted -organism -cell -mistletoe -plant -animal -microorganism -bryophyte -person -fungus -benthos -flowering maple -vascular plant -strangler -aquatic -annual -houseplant -poisonous plant -agave -pteridophyte -spermatophyte -aquatic plant -herb -vine -woody plant -weed -cultivar -bulbous plant -succulent -American agave -maguey -maguey -sansevieria -dracaena -mother-in-law's tongue -fern ally -fern -club moss -scouring rush -ground pine -ground cedar -ground fir -flowering fern -lady fern -Boston fern -flowering fern -royal fern -tree fern -oak fern -common polypody -mountain fern -shield fern -deer fern -wood fern -American maidenhair fern -hart's-tongue -soft shield fern -holly fern -maidenhair -holly fern -water clover -sensitive fern -Christmas fern -angiopteris -soft tree fern -male fern -marginal wood fern -angiosperm -gymnosperm -barbados cherry -dicot -flower -wildflower -commelina -woodland star -nigella -black-eyed Susan -mistflower -calceolaria -toadflax -zinnia -centaury -Easter daisy -African violet -brompton stock -verbena -blue daisy -pink calla -Mexican sunflower -bloomer -achimenes -lychnis -painted daisy -treasure flower -globe amaranth -common valerian -rose moss -tidytips -common daisy -composite -ice plant -gentian -soapwort -anemone -veronica -larkspur -spring beauty -gazania -damask violet -Barberton daisy -bush violet -baby's breath -corydalis -calendula -sunflower -scabious -valerian -rue anemone -sandwort -candytuft -horn poppy -sandwort -poppy -stokes' aster -dahlia -Virginia spring beauty -petunia -orchid -hybrid petunia -African daisy -pink -African daisy -African daisy -daisy -common ageratum -oxeye daisy -columbine -calla lily -sweet alyssum -spathiphyllum -four o'clock -common marigold -cornflower -strawflower -silene -tuberose -common four-o'clock -rocket larkspur -bellwort -begonia -streptocarpus -Swan River daisy -wallflower -peony -love-in-a-mist -wallflower -cineraria -chrysanthemum -stock -sandwort -Malcolm stock -mountain sandwort -coneflower -ageratum -coneflower -sowbread -scorpionweed -cyclamen -delphinium -marigold -aster -cosmos -Mediterranean snapdragon -mullein pink -ragged robin -mayweed -tansy -dusty miller -corn chamomile -shasta daisy -everlasting -wingstem -rosinweed -oxeye daisy -strawflower -strawflower -cudweed -pearly everlasting -gentianella -agueweed -closed gentian -closed gentian -great yellow gentian -fringed gentian -marsh gentian -snowdrop anemone -wood anemone -wood anemone -germander speedwell -common speedwell -common sunflower -prairie sunflower -giant sunflower -Jerusalem artichoke -sweet scabious -field scabious -Iceland poppy -wind poppy -Iceland poppy -celandine -oriental poppy -opium poppy -celandine poppy -prickly poppy -California poppy -corn poppy -blue poppy -aerides -coelogyne -lady's slipper -Venus' slipper -cymbid -sobralia -spider orchid -spider orchid -Psychopsis papilio -liparis -butterfly orchid -butterfly orchid -butterfly orchid -oncidium -twayblade -twayblade -grass pink -brassavola -fragrant orchid -fly orchid -frog orchid -coral root -cattleya -lesser butterfly orchid -vanilla -short-spurred fragrant orchid -common spotted orchid -bog rose -ladies' tresses -odontoglossum -orchis -vanda -pansy orchid -Bletilla striata -rattlesnake plantain -marsh orchid -stanhopea -laelia -phaius -lizard orchid -caladenia -calypso -moth orchid -blue orchid -bee orchid -early spider orchid -masdevallia -bog rein orchid -European ladies' tresses -fen orchid -pogonia -fringed orchis -dendrobium -fly orchid -helleborine -helleborine -stelis -greater butterfly orchid -yellow lady's slipper -large yellow lady's slipper -common lady's-slipper -moccasin flower -butterfly orchid -male orchis -ragged orchid -purple-fringed orchid -stream orchid -Epipactis helleborine -sweet William -china pink -Japanese pink -carnation -cottage pink -maiden pink -meeting house -granny's bonnets -blue columbine -fire pink -white campion -bladder campion -red campion -wild pink -moss campion -wax begonia -hybrid tuberous begonia -rex begonia -crown daisy -corn marigold -florist's chrysanthemum -African marigold -French marigold -New England aster -bushy aster -Michaelmas daisy -Indian paintbrush -goldenrod -sand verbena -bitterroot -Indian pipe -heliopsis -meadow goldenrod -pasqueflower -fleabane -blazing star -edelweiss -coneflower -balloon flower -wild carrot -prairie gentian -desert sunflower -Arnica montana -butterweed -gaillardia -brittlebush -orange daisy -daisy fleabane -Mexican hat -long-head coneflower -cycad -welwitschia -encephalartos -dioon -macrozamia -false sago -water shamrock -water hyacinth -pistia -water lily -marsh plant -water nymph -European white lily -bog star -marsh marigold -wild calla -sedge -parnassia -skunk cabbage -skunk cabbage -cotton grass -nutgrass -common cotton grass -winter aconite -buttercup -phlox -willowherb -stapelia -skullcap -bedstraw -gumweed -kangaroo paw -common chickweed -hyssop -arum -common comfrey -borage -nasturtium -canna -loosestrife -toad lily -globe thistle -wild thyme -common fennel -bear's breech -ironweed -feverfew -monarda -physostegia -creeping bugle -vegetable -hedge nettle -plum tomato -ground cherry -flax -primrose -oxalis -kniphofia -boneset -chickweed -periwinkle -garden angelica -bugloss -Dutchman's breeches -pie plant -cow parsnip -butterbur -milk thistle -mouse-ear chickweed -yellow bells -lobelia -anise hyssop -banana -Joe-Pye weed -Joe-Pye weed -garden forget-me-not -evening primrose -spiderflower -sweet false chamomile -agrimonia -hepatica -medic -peperomia -geranium -viola -okra -bergenia -astrantia -aspidistra -thyme -common teasel -carnivorous plant -harvest-lice -nemophila -hawkweed -hawkweed -fleabane -plumbago -spiderwort -prickly poppy -common foxglove -stonecrop -garden lettuce -teasel -herb Paris -coltsfoot -basil -sainfoin -sneezeweed -cockscomb -baby blue-eyes -coleus -spurge nettle -arnica -sour dock -clover -mint -coreopsis -pimpernel -kidney vetch -foxglove -legume -reseda -forget-me-not -Virginia bluebell -pineapple -blueweed -anchusa -moss pink -common dandelion -false lupine -sage -chamomile -crucifer -chicory -broad-leaved plantain -bugle -milkweed -fireweed -spirea -inula -hemp nettle -garden nasturtium -pokeweed -moneywort -asparagus -Italian parsley -rhubarb -jewelweed -asparagus fern -sedum -yarrow -bird's foot trefoil -scarlet pimpernel -campanula -mayapple -painted nettle -pigweed -bleeding heart -achillea -snow-in-summer -gramineous plant -balsamroot -Abyssinian banana -herbage -astilbe -ginger -saxifrage -cow parsley -dill -common mullein -dead nettle -creeping buttercup -meadow buttercup -yellow bedstraw -sweet woodruff -caladium -cuckoopint -jack-in-the-pulpit -alocasia -taro -amorphophallus -bee balm -bee balm -artichoke -cardoon -tomatillo -tomatillo -English primrose -oxlip -cowslip -polyanthus -creeping oxalis -common wood sorrel -Bermuda buttercup -red-hot poker -poker plant -dwarf banana -Japanese banana -plantain -sundrops -common evening primrose -ivy geranium -cranesbill -fish geranium -rose geranium -meadow cranesbill -wild geranium -dove's foot geranium -herb robert -horned violet -field pansy -violet -dog violet -pale violet -bird's-foot violet -hedge violet -Venus's flytrap -pitcher plant -tropical pitcher plant -sundew -white clover -red clover -crimson clover -pennyroyal -water-mint -beach pea -chickpea -vetch -tufted vetch -bean -wild pea -scarlet runner -sieva bean -clary -common sage -clary sage -wild sage -purple sage -meadow clary -bok choy -mustard -cabbage -cauliflower -collard -broccoli -brussels sprout -garlic mustard -head cabbage -radish plant -bittercress -alyssum -field mustard -rape -radish -radish -lady's smock -crinkleroot -butterfly weed -swamp milkweed -tussock bellflower -Canterbury bell -clustered bellflower -peach bells -giant bamboo -grass -fescue -cordgrass -feather reed grass -reed grass -orchard grass -cereal -broom beard grass -tall oat grass -tallgrass -St. Augustine grass -pampas grass -grama -dallisgrass -zoysia -rye grass -brome -fountain grass -rye -popcorn -wheat -millet -sorghum -panic grass -goose grass -switch grass -common ginger -shellflower -meadow saxifrage -purple saxifrage -white dead nettle -henbit -ground ivy -blue pea -purple clematis -black-eyed Susan -bougainvillea -butterfly pea -butterfly pea -bindweed -kudzu -Boston ivy -squash -yellow jasmine -wax plant -morning glory -liana -Japanese wistaria -allamanda -field bindweed -common allamanda -passionflower -convolvulus -gourd -grape -Chinese gooseberry -summer squash -winter squash -pumpkin -spaghetti squash -yellow squash -acorn squash -winter crookneck -cypress vine -Japanese morning glory -moonflower -golden pothos -ceriman -jade vine -pothos -love-in-a-mist -maypop -granadilla -sweet melon -bottle gourd -net melon -winter melon -cantaloupe -Sauvignon grape -fox grape -wild indigo -shrub -tree -raspberry -lupine -abelia -banksia -bird pepper -sea holly -guelder rose -crape myrtle -castor-oil plant -spirea -hydrangea -fuchsia -redberry -saltbush -false indigo -bridal wreath -protea -Oregon grape -grevillea -gorse -rockrose -cowberry -subshrub -honeypot -California fuchsia -sumac -jasmine -impala lily -currant -axseed -mimosa -southern buckthorn -flowering quince -yucca -purple heather -waratah -mallow -strawberry tree -mock orange -honeysuckle -spurge -kalmia -bush hibiscus -weigela -Christmasberry -angel's trumpet -angel's trumpet -gooseberry -dusty miller -croton -Pyracantha -forsythia -artemisia -silversword -waratah -philadelphus -common lilac -saltwort -calliandra -wahoo -bird of paradise -cape jasmine -camellia -night jasmine -rose -mountain laurel -cotoneaster -rhododendron -frangipani -broom -desert pea -lavender -butterfly bush -deutzia -hortensia -burdock -prairie smoke -centaury -sea lavender -common mugwort -bird's foot trefoil -large periwinkle -great burdock -St John's wort -eriogonum -purple loosestrife -loosestrife -mountain avens -matilija poppy -bur marigold -wild lupine -marguerite -dusty miller -great knapweed -knapweed -creeping St John's wort -klammath weed -common St John's wort -common jasmine -winter jasmine -Adam's needle -bear grass -Joshua tree -Spanish dagger -hollyhock -rose mallow -common mallow -marsh mallow -musk mallow -hibiscus -althea -rose mallow -cotton rose -woodbine -trumpet honeysuckle -Japanese honeysuckle -poinsettia -crown of thorns -damask rose -musk rose -azalea -rosebay -swamp azalea -common broom -woodwaxen -English lavender -spike lavender -French lavender -locust tree -kowhai -bottle-tree -timber tree -linden -bonsai -snag -hackberry -pepper tree -Japanese oak -European hackberry -cork tree -birch -star anise -red silk-cotton tree -roble -common alder -fig tree -Japanese pagoda tree -albizzia -European hornbeam -cassia -coral tree -neem -white mangrove -Chinese parasol tree -bayberry -yellowwood -elm -alder -prickly ash -angiospermous tree -chestnut -cabbage bark -ash -beech -fringe tree -golden shower tree -lead tree -palm -balata -sapling -black beech -acacia -coffee -gymnospermous tree -ceibo -incense tree -lacebark -shade tree -pollard -gum tree -wild medlar -hornbeam -willow -textile screw pine -mescal bean -Brazilian rosewood -pandanus -white mangrove -oak -bean tree -plane tree -blackwood -coralwood -Kentucky coffee tree -black locust -honey locust -flame tree -flame tree -kurrajong -American basswood -silver lime -black birch -silver birch -swamp birch -downy birch -grey birch -golden fig -India-rubber tree -fig -banyan -pipal -rain tree -silk tree -smooth-leaved elm -American elm -English elm -cedar elm -myrtle -mangrove -magnolia -Queen's crape myrtle -looking-glass plant -tulip tree -maple -nut tree -redbud -baobab -poplar -tree of heaven -ailanthus -dogwood -holly -cacao -laurel -mountain ebony -kapok -sorrel tree -cacao bean -Spanish elm -rowan -mountain ash -royal poinciana -iron tree -fruit tree -sweet bay -southern magnolia -star magnolia -umbrella tree -box elder -red maple -hedge maple -Norway maple -Japanese maple -sycamore -California box elder -silver maple -sugar maple -Oregon maple -cashew -walnut -hazelnut -black walnut -English walnut -black poplar -aspen -cottonwood -white poplar -quaking aspen -Eastern cottonwood -black cottonwood -cornelian cherry -bunchberry -common European dogwood -common white dogwood -bearberry -inkberry -true laurel -cassia -citrus -mulberry -jackfruit -pomegranate -pawpaw -persimmon -carambola -plum -almond tree -durian -papaya -olive tree -longan -pear -loquat -medlar -peach -white mulberry -olive -litchi -Japanese apricot -rambutan -apple tree -Japanese persimmon -mango -breadfruit -guava -guava -jaboticaba -cherry -Surinam cherry -lime -mandarin -orange -kumquat -lemon -pomelo -grapefruit -clementine -tangerine -sweet orange -sour orange -bergamot -cherry plum -Allegheny plum -flowering almond -almond -flowering almond -crab apple -apple -wild apple -Southern crab apple -Bechtel crab -Iowa crab -sour cherry -flowering cherry -wild cherry -sweet cherry -chokecherry -Japanese flowering cherry -oriental cherry -fuji -hagberry tree -black cherry -Ozark chinkapin -American chestnut -pumpkin ash -mountain ash -manna ash -European ash -red ash -weeping beech -American beech -copper beech -bamboo palm -wine palm -fan palm -royal palm -cabbage palm -cabbage palm -sago palm -miniature fan palm -lady palm -feather palm -coconut -cabbage palm -carnauba -caranday -palmyra -cabbage palmetto -key palm -saw palmetto -palmetto -date palm -oil palm -silver wattle -wattle -huisache -ginkgo -conifer -kauri -green douglas fir -miro -cedar -cedar -douglas fir -matai -arborvitae -spruce -yew -araucaria -cypress -metasequoia -pine -fir -larch -hemlock -cedar of Lebanon -Atlas cedar -deodar -southern white cedar -incense cedar -Oregon cedar -Japanese cedar -Oriental arborvitae -American arborvitae -western red cedar -Colorado spruce -white spruce -Norway spruce -red spruce -black spruce -Sitka spruce -oriental spruce -bunya bunya -monkey puzzle -Monterey cypress -Arizona cypress -Italian cypress -Scotch pine -pond pine -pitch pine -table-mountain pine -ancient pine -stone pine -Jeffrey pine -loblolly pine -Swiss pine -spruce pine -white pine -red pine -Japanese black pine -Swiss mountain pine -black pine -Monterey pine -yellow pine -Torrey pine -shore pine -bristlecone pine -whitebark pine -western white pine -longleaf pine -ponderosa -silver fir -Fraser fir -Alpine fir -amabilis fir -lowland fir -balsam fir -European silver fir -white fir -western larch -American larch -eastern hemlock -western hemlock -mountain hemlock -gumbo-limbo -elephant tree -sweet gum -eucalyptus -sour gum -liquidambar -snow gum -mountain ash -black mallee -alpine ash -red gum -red gum -blue gum -osier -pussy willow -bay willow -weeping willow -swamp willow -purple willow -common osier -European turkey oak -red oak -cork oak -black oak -live oak -chestnut oak -bluejack oak -pin oak -post oak -shingle oak -white oak -laurel oak -northern red oak -southern red oak -southern live oak -canyon oak -coast live oak -chinquapin oak -basket oak -swamp chestnut oak -bur oak -Oregon white oak -common oak -tamarind -catalpa -carob -California sycamore -American sycamore -London plane -lightwood -black mangrove -wild raspberry -black raspberry -bluebonnet -Texas bluebonnet -thistle -cat's-ear -corn cockle -yellow rocket -fireweed -stinging nettle -horseweed -stemless carline thistle -musk thistle -cotton thistle -plume thistle -field thistle -bull thistle -Canada thistle -hippeastrum -narcissus -iridaceous plant -fritillary -liliaceous plant -star-of-Bethlehem -daffodil -jonquil -jonquil -iris -blue-eyed grass -blackberry-lily -dwarf iris -dwarf iris -beardless iris -bearded iris -Japanese iris -German iris -snake's head fritillary -crown imperial -dogtooth violet -lily -African lily -grape hyacinth -common camas -false lily of the valley -common hyacinth -camas -clintonia -lemon lily -squaw grass -scilla -tulip -alliaceous plant -fawn lily -glacier lily -yellow adder's tongue -Turk's-cap -Turk's-cap -tiger lily -tiger lily -mountain lily -Easter lily -tassel hyacinth -common grape hyacinth -Tulipa gesneriana -Darwin tulip -garlic chive -wild garlic -Hottentot fig -livingstone daisy -cactus -nopal -nopal -barrel cactus -night-blooming cereus -night-blooming cereus -night-blooming cereus -cholla -echinocactus -mammillaria -feather ball -prickly pear -crab cactus -saguaro -Christmas cactus -hedgehog cactus -golden barrel cactus -flamingo flower -anthurium -gloxinia -baneberry -red baneberry -poison ivy -gloriosa -monkshood -American holly -oleander -poison ash -herbivore -big game -thoroughbred -creepy-crawly -young -domestic animal -pet -critter -larva -feeder -male -pest -omnivore -predator -chordate -work animal -invertebrate -female -marine animal -scavenger -hexapod -mate -prey -carnivore -young mammal -orphan -spat -young bird -hatchling -foal -kitten -calf -pup -calf -lamb -baby -puppy -suckling -cub -piglet -nestling -fledgling -head -stray -feeder -tadpole -caterpillar -nymph -doodlebug -tobacco hornworm -cabbageworm -tomato hornworm -silkworm -cutworm -woolly bear -measuring worm -armyworm -silkworm -tussock caterpillar -tent caterpillar -colt -ridgeling -sire -sea squirt -ascidian -vertebrate -aquatic vertebrate -amphibian -mammal -baby -fetus -quadruped -reptile -bird -fish -lamprey -teleost fish -food fish -elasmobranch -ganoid -trumpetfish -pipefish -seahorse -spiny-finned fish -soft-finned fish -needlefish -beluga -gar -bowfin -paddlefish -sturgeon -percoid fish -dragonet -frogfish -barracuda -soldierfish -goosefish -scorpaenoid -flatfish -great barracuda -plectognath -snook -perch -perch -dolphinfish -freshwater bass -scombroid -bass -parrotfish -sea bream -grunt -flathead -bluefish -carangid fish -damselfish -butterfly fish -mudskipper -pike -goby -tautog -sunfish -snapper -snapper -sciaenid fish -wolffish -cichlid -wrasse -yellow perch -European perch -walleye -mackerel -skipjack -black marlin -sailfish -marlin -bonito -tuna -wahoo -Spanish mackerel -Spanish mackerel -cero -king mackerel -bluefin -yellowfin -jack -permit -scad -crevalle jack -kingfish -amberjack -yellowtail -horse mackerel -horse mackerel -clown anemone fish -sergeant major -anemone fish -chaetodon -rock beauty -angelfish -northern pike -pickerel -muskellunge -black bass -pumpkinseed -freshwater bream -bluegill -crappie -smallmouth -largemouth -sea trout -croaker -kingfish -mulloway -red drum -white croaker -white croaker -scorpaenid -flathead -scorpionfish -lionfish -stonefish -rockfish -plaice -flounder -halibut -cowfish -boxfish -ocean sunfish -puffer -spiny puffer -triggerfish -balloonfish -porcupinefish -tarpon -bonefish -pollack -anchovy -lizardfish -catfish -cypriniform fish -eel -clupeid fish -European catfish -flathead catfish -channel catfish -blue catfish -characin -electric eel -cyprinodont -loach -cyprinid -topminnow -piranha -cardinal tetra -tetra -killifish -striped killifish -guppy -swordtail -carp -minnow -tench -crucian carp -goldfish -gudgeon -platy -mosquitofish -conger -tuna -moray -sardine -pilchard -sea bass -trout -salmon -barracouta -grouper -striped bass -jewfish -hind -sea trout -brook trout -rainbow trout -brown trout -lake trout -chinook -Atlantic salmon -redfish -coho -landlocked salmon -shark -ray -sand tiger -angel shark -nurse shark -requiem shark -smooth dogfish -hammerhead -mackerel shark -whale shark -bull shark -blue shark -sandbar shark -blacktip shark -whitetip shark -tiger shark -lemon shark -whitetip shark -smoothhound -great white shark -mako -porbeagle -stingray -electric ray -spotted eagle ray -Atlantic manta -manta -skate -eagle ray -salamander -frog -spotted salamander -newt -European fire salamander -slender salamander -ambystomid -eft -common newt -red eft -spotted salamander -axolotl -tiger salamander -true toad -true frog -tailed frog -crapaud -tree toad -tree frog -natterjack -Eurasian green toad -bufo -American toad -agua -western toad -European toad -grass frog -wood-frog -bullfrog -leopard frog -pickerel frog -green frog -spring peeper -chorus frog -placental -tusker -monotreme -marsupial -female mammal -aardvark -livestock -insectivore -hyrax -doe -edentate -stag -bull -primate -carnivore -bat -aquatic mammal -lagomorph -rock hyrax -yearling -rodent -cow -pachyderm -buck -pangolin -ungulate -shrew -hedgehog -peba -sloth -armadillo -anteater -two-toed sloth -two-toed sloth -three-toed sloth -ant bear -tamandua -simian -tarsier -homo -ape -lemur -monkey -Homo sapiens sapiens -Homo sapiens -Neandertal man -anthropoid ape -lesser ape -great ape -siamang -gibbon -chimpanzee -orangutan -gorilla -pygmy chimpanzee -central chimpanzee -western lowland gorilla -mountain gorilla -silverback -indri -Madagascar cat -potto -galago -slow loris -Old World monkey -New World monkey -baboon -vervet -proboscis monkey -colobus -patas -macaque -guenon -langur -chacma -mandrill -Barbary ape -rhesus -spider monkey -marmoset -squirrel monkey -titi -capuchin -howler monkey -tamarin -pygmy marmoset -procyonid -feline -viverrine -canine -musteline mammal -bear -coati -common raccoon -lesser panda -raccoon -kinkajou -giant panda -big cat -cat -jaguar -tiger -leopard -cheetah -lion -snow leopard -tigress -Bengal tiger -tiger cub -lioness -lion cub -domestic cat -wildcat -tabby -tiger cat -tabby -tortoiseshell -Manx -Egyptian cat -Abyssinian -kitty -Angora -Persian cat -Burmese cat -Siamese cat -alley cat -tom -mouser -margay -ocelot -lynx -cougar -European wildcat -serval -manul -sand cat -common lynx -bobcat -caracal -Canada lynx -meerkat -genet -mongoose -slender-tailed meerkat -suricate -dog -wild dog -wolf -bitch -jackal -fox -hyena -pug -corgi -Great Pyrenees -Brabancon griffon -poodle -cur -Leonberg -griffon -dalmatian -pooch -spitz -toy dog -hunting dog -working dog -basenji -Mexican hairless -Newfoundland -lapdog -Cardigan -Pembroke -standard poodle -toy poodle -miniature poodle -Pomeranian -keeshond -chow -Samoyed -toy spaniel -Shih-Tzu -toy terrier -Maltese dog -Japanese spaniel -Chihuahua -Pekinese -King Charles spaniel -Blenheim spaniel -papillon -terrier -Rhodesian ridgeback -sausage dog -sporting dog -hound -dachshund -Dandie Dinmont -schnauzer -wirehair -Airedale -West Highland white terrier -Kerry blue terrier -Norfolk terrier -Border terrier -Yorkshire terrier -wire-haired fox terrier -Bedlington terrier -Tibetan terrier -silky terrier -Lhasa -Scotch terrier -cairn -Boston bull -fox terrier -Australian terrier -bullterrier -Norwich terrier -Irish terrier -rat terrier -soft-coated wheaten terrier -standard schnauzer -giant schnauzer -miniature schnauzer -Lakeland terrier -Welsh terrier -Sealyham terrier -Staffordshire bullterrier -American Staffordshire terrier -Manchester terrier -toy Manchester -water dog -pointer -bird dog -setter -spaniel -retriever -vizsla -German short-haired pointer -Gordon setter -English setter -Irish setter -cocker spaniel -water spaniel -springer spaniel -Brittany spaniel -clumber -Sussex spaniel -Irish water spaniel -English springer -Welsh springer spaniel -flat-coated retriever -golden retriever -curly-coated retriever -Chesapeake Bay retriever -Labrador retriever -otterhound -bloodhound -wolfhound -basset -Ibizan hound -Norwegian elkhound -coonhound -Saluki -Afghan hound -black-and-tan coonhound -bluetick -Scottish deerhound -redbone -foxhound -beagle -Weimaraner -greyhound -borzoi -Irish wolfhound -English foxhound -Walker hound -whippet -Italian greyhound -Great Dane -watchdog -Eskimo dog -Tibetan mastiff -sled dog -Saint Bernard -French bulldog -police dog -bulldog -Sennenhunde -bull mastiff -shepherd dog -boxer -mastiff -kuvasz -housedog -pinscher -schipperke -Doberman -miniature pinscher -affenpinscher -Siberian husky -malamute -Greater Swiss Mountain dog -EntleBucher -Bernese mountain dog -Appenzeller -Belgian sheepdog -kelpie -Shetland sheepdog -komondor -Border collie -collie -Rottweiler -Old English sheepdog -German shepherd -briard -Bouvier des Flandres -groenendael -malinois -African hunting dog -dingo -dhole -coyote -wolf pup -red wolf -white wolf -timber wolf -red fox -red fox -kit fox -Arctic fox -grey fox -kit fox -spotted hyena -striped hyena -mink -black-footed ferret -striped skunk -pine marten -sea otter -otter -weasel -polecat -glutton -skunk -badger -ferret -river otter -Eurasian otter -ice bear -American black bear -bear cub -Asiatic black bear -brown bear -sloth bear -grizzly -Alaskan brown bear -carnivorous bat -flying fox -fruit bat -brown bat -vespertilian bat -pallid bat -pipistrelle -cetacean -sea cow -pinniped mammal -whale -toothed whale -baleen whale -dolphin -bottle-nosed whale -porpoise -common dolphin -bottlenose dolphin -pilot whale -killer whale -white whale -Pacific bottlenose dolphin -Atlantic bottlenose dolphin -grey whale -rorqual -blue whale -lesser rorqual -finback -manatee -dugong -walrus -seal -earless seal -eared seal -elephant seal -harbor seal -harp seal -fur seal -fur seal -sea lion -California sea lion -Australian sea lion -Steller sea lion -pika -leporid -rabbit -hare -eastern cottontail -wood rabbit -bunny -European rabbit -lapin -Angora -rabbit ears -snowshoe hare -European hare -jackrabbit -chinchilla -rat -capybara -golden hamster -water vole -porcupine -coypu -vole -beaver -hamster -prairie dog -squirrel -marmot -blacktail prairie dog -cavy -gerbil -mouse -muskrat -gopher -brown rat -black rat -chipmunk -ground squirrel -eastern chipmunk -tree squirrel -rock squirrel -mantled ground squirrel -eastern grey squirrel -red squirrel -black squirrel -American red squirrel -fox squirrel -hoary marmot -groundhog -aperea -guinea pig -field mouse -house mouse -elephant -African elephant -Indian elephant -even-toed ungulate -odd-toed ungulate -ruminant -camel -swine -llama -vicuna -collared peccary -hippopotamus -peccary -pronghorn -deer -bovid -giraffe -okapi -woodland caribou -caribou -fallow deer -elk -hart -mule deer -fawn -red deer -muntjac -Virginia deer -wapiti -Japanese deer -roe deer -black-tailed deer -wild sheep -bison -musk ox -Old World buffalo -bovine -antelope -sheep -goat antelope -goat -aoudad -mountain sheep -Dall sheep -bighorn -mouflon -American bison -wisent -carabao -water buffalo -Cape buffalo -Brahman -ox -zebu -cattle -yak -gaur -beef -ox -bull -bullock -heifer -cow -dairy cattle -longhorn -Charolais -Hereford -Durham -Aberdeen Angus -Galloway -Friesian -Brown Swiss -kudu -addax -blackbuck -waterbuck -eland -steenbok -dik-dik -gnu -harnessed antelope -gerenuk -sassaby -impala -greater kudu -sable antelope -hartebeest -bongo -gemsbok -oryx -gazelle -nyala -bushbuck -Thomson's gazelle -springbok antelope -domestic sheep -black sheep -ewe -wether -ram -mountain goat -chamois -takin -nanny -kid -ibex -Angora -domestic goat -billy -wild goat -Bactrian camel -Arabian camel -wild boar -warthog -boar -hog -guanaco -alpaca -rhinoceros -tapir -equine -Malayan tapir -Indian rhinoceros -black rhinoceros -white rhinoceros -horse -zebra -ass -bay -broodmare -racehorse -palomino -wild horse -pinto -hack -roan -male horse -post horse -liver chestnut -tarpan -saddle horse -chestnut -harness horse -polo pony -workhorse -mare -pony -pony -sorrel -yearling -thoroughbred -trotting horse -stud -stallion -gelding -Tennessee walker -hack -cavalry horse -grey -Morgan -buckskin -dun -Arabian -quarter horse -cob -hackney -plow horse -farm horse -draft horse -carthorse -Percheron -Clydesdale -shire -cayuse -bronco -mustang -Welsh pony -Shetland pony -Exmoor -common zebra -mountain zebra -grevy's zebra -jennet -burro -domestic ass -echidna -platypus -echidna -kangaroo -koala -wombat -common opossum -opossum -dasyurid marsupial -phalanger -giant kangaroo -wallaby -rock wallaby -tree wallaby -Tasmanian devil -numbat -chelonian -diapsid -turtle -Western box turtle -box turtle -common snapping turtle -terrapin -soft-shelled turtle -painted turtle -sea turtle -snapping turtle -slider -tortoise -mud turtle -cooter -hawksbill turtle -loggerhead -green turtle -leatherback turtle -ridley -Pacific ridley -Atlantic ridley -giant tortoise -gopher tortoise -European tortoise -desert tortoise -crocodilian reptile -snake -tuatara -lizard -dinosaur -alligator -crocodile -American alligator -caiman -Asian crocodile -African crocodile -blind snake -viper -sea snake -elapid -constrictor -colubrid snake -horned viper -asp -adder -puff adder -pit viper -water moccasin -copperhead -rattlesnake -ground rattler -massasauga -diamondback -Mojave rattlesnake -timber rattlesnake -prairie rattlesnake -Western diamondback -sidewinder -rock rattlesnake -speckled rattlesnake -cobra -green mamba -taipan -copperhead -mamba -coral snake -coral snake -Indian cobra -hamadryad -boa -python -rosy boa -boa constrictor -anaconda -reticulated python -carpet snake -rock python -blacksnake -garter snake -bull snake -hognose snake -rat snake -whip-snake -water snake -green snake -racer -green snake -thunder snake -ringneck snake -vine snake -king snake -night snake -ribbon snake -common garter snake -pine snake -gopher snake -corn snake -black rat snake -grass snake -common water snake -water moccasin -smooth green snake -rough green snake -milk snake -common kingsnake -banded gecko -chameleon -monitor -skink -Gila monster -Komodo dragon -whiptail -iguanid -agamid -gecko -African chameleon -lacertid lizard -anguid lizard -horned lizard -tree lizard -chuckwalla -American chameleon -basilisk -side-blotched lizard -spiny lizard -collared lizard -common iguana -marine iguana -leopard lizard -western fence lizard -fence lizard -agama -mountain devil -frilled lizard -green lizard -sand lizard -blindworm -alligator lizard -ornithischian -tyrannosaur -stegosaur -triceratops -bird of passage -aquatic bird -passerine -cock -hummingbird -piciform bird -coraciiform bird -quetzal -bird of prey -caprimulgiform bird -cuculiform bird -gamecock -ratite -gallinaceous bird -trogon -parrot -carinate -dickeybird -hen -wading bird -swan -gallinule -seabird -waterfowl -heron -crested cariama -trumpeter -bustard -ibis -stork -whooping crane -crane -limpkin -chunga -flamingo -rail -spoonbill -shoebill -shorebird -great blue heron -night heron -little blue heron -boatbill -great white heron -egret -bittern -black-crowned night heron -yellow-crowned night heron -great white heron -little egret -snowy egret -American egret -cattle egret -least bittern -American bittern -wood ibis -sacred ibis -marabou -black stork -white stork -saddlebill -jabiru -policeman bird -wood ibis -notornis -weka -spotted crake -crake -coot -Old World coot -American coot -common spoonbill -roseate spoonbill -plover -godwit -Hudsonian godwit -stilt -stone curlew -oystercatcher -stilt -American woodcock -snipe -woodcock -avocet -sandpiper -European curlew -pratincole -curlew -phalarope -golden plover -ruddy turnstone -killdeer -lapwing -turnstone -piping plover -black-necked stilt -black-winged stilt -whole snipe -Wilson's snipe -great snipe -dowitcher -tattler -greenshank -willet -curlew sandpiper -sanderling -redshank -spotted sandpiper -knot -red-backed sandpiper -upland sandpiper -least sandpiper -pectoral sandpiper -ruff -European sandpiper -yellowlegs -greater yellowlegs -lesser yellowlegs -red phalarope -Wilson's phalarope -pen -cygnet -trumpeter -coscoroba -mute swan -cob -whooper -black swan -tundra swan -whistling swan -Bewick's swan -purple gallinule -European gallinule -moorhen -coastal diving bird -pelagic bird -grebe -auk -loon -pelecaniform seabird -sphenisciform seabird -puffin -larid -jaeger -skimmer -sea swallow -gull -tern -ivory gull -mew -laughing gull -black-backed gull -kittiwake -herring gull -skua -parasitic jaeger -petrel -albatross -wandering albatross -shearwater -storm petrel -fulmar -red-necked grebe -great crested grebe -pied-billed grebe -black-necked grebe -dabchick -razorbill -guillemot -auklet -murre -black guillemot -common murre -pigeon guillemot -frigate bird -cormorant -snakebird -pelican -gannet -water turkey -tropic bird -white pelican -Old world white pelican -solan -booby -penguin -emperor penguin -jackass penguin -king penguin -rock hopper -Adelie -horned puffin -tufted puffin -Atlantic puffin -anseriform bird -goose -duck -blue goose -barnacle goose -snow goose -Chinese goose -common brant goose -brant -gosling -greylag -gander -honker -diving duck -scaup -shelduck -wood drake -bufflehead -black duck -mandarin duck -American widgeon -pintail -mallard -sheldrake -teal -Barrow's goldeneye -quack-quack -wild duck -ruddy duck -wood duck -drake -muscovy duck -shoveler -dabbling duck -widgeon -sea duck -redhead -pochard -goldeneye -canvasback -duckling -greater scaup -lesser scaup -garganey -greenwing -bluewing -eider -old squaw -merganser -scoter -common scoter -American merganser -red-breasted merganser -hooded merganser -smew -goosander -wren -broadbill -tyrannid -oscine -scrubbird -sparrow -marsh wren -rock wren -winter wren -cactus wren -house wren -Carolina wren -ovenbird -manakin -pitta -woodhewer -New World flycatcher -kingbird -phoebe -pewee -vermillion flycatcher -western wood pewee -scissortail -grey kingbird -eastern kingbird -Arkansas kingbird -warbler -brown creeper -corvine bird -starling -pipit -titmouse -fairy bluebird -thrush -hedge sparrow -wood swallow -shrike -lark -golden oriole -Old World flycatcher -thrasher -vireo -tanager -honeycreeper -finch -bowerbird -water ouzel -accentor -mockingbird -brown thrasher -skylark -catbird -satin bowerbird -waxwing -red-eyed vireo -New World oriole -Old World oriole -babbler -swallow -creeper -songbird -Australian magpie -wagtail -meadow pipit -spotted flycatcher -weaver -nuthatch -greater whitethroat -New World warbler -kinglet -Old World warbler -gnatcatcher -lesser whitethroat -yellowthroat -common yellowthroat -ovenbird -parula warbler -Blackburn -yellow warbler -American redstart -yellow-breasted chat -Audubon's warbler -Wilson's warbler -Cape May warbler -myrtle warbler -goldcrest -ruby-crowned kinglet -tailorbird -sedge warbler -wren warbler -blackcap -rook -Clark's nutcracker -jackdaw -European magpie -jay -raven -crow -magpie -American crow -blue jay -Canada jay -common starling -hill myna -myna -bushtit -chickadee -blue tit -tufted titmouse -Carolina chickadee -black-capped chickadee -robin -robin -hermit thrush -redwing -fieldfare -song thrush -nightingale -blackbird -missel thrush -ring ouzel -wheatear -bluebird -thrush nightingale -bluethroat -redstart -bulbul -Old World chat -wood thrush -stonechat -whinchat -butcherbird -loggerhead shrike -bush shrike -northern shrike -European shrike -western tanager -summer tanager -scarlet tanager -serin -bullfinch -grosbeak -goldfinch -New World sparrow -crossbill -bunting -linnet -cardinal -siskin -common canary -towhee -purple finch -honeycreeper -brambling -New World goldfinch -pine siskin -redpoll -dark-eyed junco -house finch -chaffinch -canary -redpoll -junco -pine grosbeak -evening grosbeak -hawfinch -song sparrow -white-throated sparrow -tree sparrow -field sparrow -white-crowned sparrow -swamp sparrow -chipping sparrow -indigo bunting -reed bunting -snow bunting -ortolan -yellowhammer -cedar waxwing -Bohemian waxwing -bobolink -meadowlark -northern oriole -orchard oriole -New World blackbird -eastern meadowlark -western meadowlark -Bullock's oriole -Baltimore oriole -purple grackle -cowbird -grackle -red-winged blackbird -white-bellied swallow -tree swallow -martin -barn swallow -cliff swallow -house martin -bank martin -butcherbird -currawong -Java sparrow -zebra finch -red-breasted nuthatch -European nuthatch -white-breasted nuthatch -English sparrow -tree sparrow -thornbill -Archilochus colubris -jacamar -woodpecker -barbet -toucanet -toucan -flicker -downy woodpecker -green woodpecker -sapsucker -wryneck -redheaded woodpecker -yellow-shafted flicker -red-breasted sapsucker -yellow-bellied sapsucker -kingfisher -roller -motmot -Euopean hoopoe -hornbill -European roller -hoopoe -bee eater -kookaburra -Eurasian kingfisher -belted kingfisher -vulture -hawk -secretary bird -eagle -owl -Old World vulture -New World vulture -Egyptian vulture -bearded vulture -black vulture -griffon vulture -black vulture -buzzard -king vulture -condor -Andean condor -California condor -harrier -goshawk -red-shouldered hawk -honey buzzard -falcon -harrier eagle -Cooper's hawk -osprey -kite -rough-legged hawk -buzzard -sparrow hawk -marsh harrier -marsh hawk -carancha -gyrfalcon -peregrine -caracara -hobby -pigeon hawk -kestrel -sparrow hawk -white-tailed kite -swallow-tailed kite -black kite -eaglet -golden eagle -sea eagle -bald eagle -harpy -tawny eagle -fishing eagle -ern -tawny owl -owlet -spotted owl -screech owl -horned owl -screech owl -little owl -barn owl -scops owl -Old World scops owl -hawk owl -great horned owl -barred owl -long-eared owl -great grey owl -frogmouth -goatsucker -touraco -cuckoo -coucal -roadrunner -rhea -rhea -ostrich -emu -cassowary -domestic fowl -columbiform bird -brush turkey -red jungle fowl -jungle fowl -game bird -turkey cock -bantam -turkey -guinea fowl -chicken -cockerel -cock -Rhode Island red -chick -Orpington -hen -pullet -brood hen -sandgrouse -pigeon -domestic pigeon -dove -wood pigeon -rock dove -homing pigeon -roller -Streptopelia turtur -turtledove -Australian turtledove -mourning dove -phasianid -tinamou -grouse -pheasant -quail -partridge -tragopan -ring-necked pheasant -golden pheasant -peafowl -peahen -blue peafowl -peacock -green peafowl -bobwhite -California quail -northern bobwhite -red-legged partridge -Hungarian partridge -spruce grouse -prairie chicken -capercaillie -ruffed grouse -sage grouse -moorhen -black grouse -ptarmigan -cockateel -parakeet -cockatoo -poll -kea -African grey -macaw -amazon -lovebird -lory -popinjay -budgerigar -ring-necked parakeet -sulphur-crested cockatoo -pink cockatoo -rainbow lorikeet -lorikeet -beast of burden -draft animal -ctenophore -worm -mollusk -echinoderm -coelenterate -arthropod -sponge -nematode -annelid -flatworm -medicinal leech -earthworm -chiton -bivalve -cephalopod -gastropod -oyster -ark shell -clam -mussel -cockle -scallop -pearl oyster -soft-shell clam -quahog -giant clam -freshwater mussel -edible mussel -zebra mussel -octopod -chambered nautilus -cuttlefish -octopus -paper nautilus -sea hare -cowrie -conch -seasnail -ormer -tiger cowrie -sea slug -slug -snail -common limpet -whelk -nerita -edible snail -brown snail -garden snail -starfish -feather star -sand dollar -sea urchin -sea cucumber -brittle star -polyp -anthozoan -Portuguese man-of-war -jellyfish -sea pen -sea anemone -coral -stony coral -gorgonian -sea fan -mushroom coral -brain coral -centipede -crustacean -trilobite -millipede -arachnid -horseshoe crab -instar -insect -house centipede -daphnia -brachyuran -mantis shrimp -malacostracan crustacean -decapod crustacean -isopod -amphipod -pill bug -woodlouse -lobster -shrimp -hermit crab -prawn -crab -crayfish -Norway lobster -spiny lobster -American lobster -king crab -blue crab -rock crab -Dungeness crab -fiddler crab -European spider crab -scorpion -harvestman -acarine -spider -tick -mite -wood tick -orb-weaving spider -European wolf spider -tarantula -wolf spider -garden spider -black widow -black and gold garden spider -barn spider -orthopterous insect -hemipterous insect -neuropteron -dictyopterous insect -collembolan -mayfly -homopterous insect -dipterous insect -earwig -common European earwig -phasmid -pollinator -bug -pupa -walking stick -scorpion fly -beetle -heteropterous insect -stonefly -hymenopterous insect -lepidopterous insect -chrysalis -odonate -silverfish -worker bee -grasshopper -cricket -katydid -locust -true bug -bedbug -dobson -green lacewing -lacewing -mantis -praying mantis -cockroach -American cockroach -German cockroach -oriental cockroach -plant louse -cicada -meadow spittlebug -seventeen-year locust -mealybug -leafhopper -aphid -mosquito -crane fly -midge -fruit fly -fly -horse tick -robber fly -Asian tiger mosquito -common mosquito -bee fly -horsefly -flesh fly -blowfly -housefly -greenbottle -bluebottle -Colorado potato beetle -firefly -ground beetle -sawyer -ladybug -lamellicorn beetle -rove beetle -Asian longhorned beetle -leaf beetle -elaterid beetle -click beetle -tiger beetle -weevil -long-horned beetle -Hippodamia convergens -vedalia -scarabaeid beetle -stag beetle -rose chafer -June beetle -Japanese beetle -rhinoceros beetle -dung beetle -scarab -cockchafer -water strider -wheel bug -wasp -ichneumon fly -ant -bee -cicada killer -digger wasp -vespid -hornet -paper wasp -common wasp -giant hornet -yellow jacket -carpenter ant -fire ant -wood ant -carpenter bee -honeybee -mason bee -andrena -leaf-cutting bee -bumblebee -Africanized bee -black bee -butterfly -moth -lycaenid -nymphalid -sulphur butterfly -ringlet -monarch -cabbage butterfly -blue -hairstreak -copper -tortoiseshell -fritillary -admiral -banded purple -peacock -red-spotted purple -painted beauty -mourning cloak -viceroy -red admiral -white admiral -comma -small white -large white -cinnabar -saturniid -noctuid moth -hawkmoth -tea tortrix -geometrid -tineid -atlas moth -emperor -polyphemus moth -cecropia -luna moth -carpet moth -clothes moth -dragonfly -damselfly -hen -filly -dam -herpes -protoctist -herpes simplex -herpes zoster -cytomegalovirus -herpes varicella zoster -alga -protozoan -seagrass -pond scum -green algae -plasmodium -ameba -ciliate -paramecium -sphagnum -hepatica -liverwort -peer -birth -adult -juvenile -countrywoman -businessperson -native -celebrant -native -Filipino -male -Gemini -onlooker -queen -referee -commoner -expert -newcomer -face -demonstrator -orphan -Black woman -contestant -bullfighter -lowerclassman -candidate -friend -life -anomaly -actor -thrower -creature -child -sheep -scuba diver -dancer -garbage man -entertainer -lover -unfortunate -anti -defender -sphinx -Indian -patient -Slav -White -brick -recipient -religious person -rescuer -Latin -money handler -rich person -domestic partner -creator -consumer -worker -groom -boy scout -inhabitant -African -fan -eager beaver -leader -schoolmate -man -philatelist -advocate -eccentric -bad person -transvestite -citizen -communicator -nonworker -parrot -intellectual -nonsmoker -student -chameleon -combatant -platinum blond -appointee -unpleasant person -politician -ruler -ancient -spectator -right-hander -traveler -scientist -picker -female -acquaintance -Black -relative -beard -redhead -sleeper -computer user -associate -participant -member -raiser -groom -bride -commissioner -director -tribesman -board member -important person -professional -oldster -celebrity -very important person -serjeant-at-law -educator -health professional -teacher -reading teacher -schoolmaster -nurse -medical practitioner -pharmacist -head nurse -probationer -doctor -surgeon -specialist -house physician -cardiologist -radiologist -schoolchild -child -bairn -orphan -entrepreneur -baron -agent -merchant -certified public accountant -syndic -insurance broker -fishmonger -vintner -peddler -seller -male child -mother's boy -son -man -cub -farm boy -bat boy -Herr -hunk -Peter Pan -patriarch -adonis -young buck -stud -guy -patriarch -sleuth -archer -authority -military attache -therapist -technician -black belt -high priest -critic -taster -panelist -physical therapist -osteopath -player -athlete -rival -billiard player -medalist -seeded player -chess master -pool player -football player -tennis player -ball hawk -vaulter -runner -skater -acrobat -climber -diver -alpinist -soccer player -winger -tennis pro -forward -sport -basketball player -miler -ballplayer -gymnast -back -lineman -halfback -quarterback -tailback -skateboarder -speedskater -circus acrobat -aerialist -fielder -designated hitter -base runner -minor leaguer -first baseman -outfielder -right fielder -infielder -semifinalist -foe -matador -picador -banderillero -buddy -mate -flatmate -pitcher -closer -right-handed pitcher -folk dancer -square dancer -morris dancer -compere -master of ceremonies -caricaturist -performer -fire-eater -executant -dancer -juggler -puppeteer -actor -clown -musician -dancing-master -ballet dancer -understudy -starlet -tenor saxophonist -percussionist -guitarist -keyboardist -trumpeter -sitar player -singer -oboist -cellist -violist -flutist -organist -rock star -drummer -songster -bass -fiance -darling -fancier -soul mate -sweetheart -kisser -amputee -homeless -casualty -guard -fireman -zoo keeper -lawman -military policeman -attorney general -policeman -bobby -Mountie -detective -motorcycle cop -trooper -traffic cop -Kiliwa -Biloxi -Chickasaw -Kickapoo -Arab -white man -Omani -Bedouin -Yemeni -protegee -heiress -swami -Buddhist -Muslim -novitiate -religious -Muslimah -Sufi -mother -monk -Sister -treasurer -ratepayer -state treasurer -bursar -cobbler -artist -choreographer -farmer -musician -stylist -sculptor -press photographer -songwriter -arranger -beekeeper -breeder -agriculturist -drinker -policyholder -drinker -concert-goer -drunkard -beer drinker -maid -employee -assistant -gondolier -skilled worker -skidder -boatman -waiter -bartender -staff member -salesperson -workman -settler -breadwinner -waitress -salesman -gardener -laborer -mill-hand -hired hand -coal miner -horse wrangler -goat herder -farmhand -attendant -cog -model -escort -caddie -companion -lifeguard -steward -color guard -honor guard -cover girl -artist's model -electrician -official -falconer -balloonist -craftsman -pilot -blacksmith -trawler -mender -baker -serviceman -painter -diplomat -judge -incumbent -appointee -presbyter -ambassador -high commissioner -plenipotentiary -glassblower -carpenter -coiffeur -machinist -wright -hairdresser -fighter pilot -copilot -artilleryman -Navy SEAL -military officer -enlisted person -noncommissioned officer -commanding officer -naval commander -adjutant general -commander in chief -commissioned officer -army officer -adjutant -inspector general -sergeant -first sergeant -staff sergeant -commissioned military officer -commissioned naval officer -line officer -major -lieutenant -first lieutenant -marshal -captain -general -lieutenant colonel -lieutenant commander -rear admiral -soldier -enlisted man -tanker -reservist -Unknown Soldier -private -recruit -yard bird -villager -Tahitian -American -Asian -American -Polynesian -European -New Zealander -North Carolinian -Minnesotan -Nebraskan -Floridian -Afghan -Tibetan -Mongol -Papuan -Indian -Jordanian -Japanese -Malay -Korean -Timorese -Bornean -Lao -Iraqi -Gujarati -Punjabi -West Indian -Latin American -North American -South American -Bahamian -Barbadian -Haitian -Central American -Canadian -Mexican -Nicaraguan -Mexican-American -Bolivian -Guyanese -Albanian -Byelorussian -Monegasque -Frank -Scandinavian -Laconian -Netherlander -Slovene -Sabine -Bulgarian -Romanian -Lithuanian -Englishwoman -Britisher -Yugoslav -Dubliner -Parisian -Eritrean -Tanzanian -Zulu -Black African -Cameroonian -Sudanese -Senegalese -Kenyan -Togolese -Ugandan -Liberian -Herero -Zimbabwean -Nigerian -Gambian -Tuareg -Guinean -Ethiopian -South African -mayor -politician -trainer -employer -Speaker -lawgiver -cheerleader -head -aristocrat -spiritual leader -instigator -mistress -boss -demagogue -Labourite -animal trainer -pitching coach -legislator -deputy -senator -administrator -department head -secretary -manageress -executive -hotelier -chief executive officer -Treasury -minister -Secretary of State -Secretary of the Interior -duchess -viscount -clergyman -lama -rabbi -Dalai Lama -officiant -priest -cleric -vicar -Father -bishop -diocesan -cardinal -metropolitan -federalist -supporter -ambassador -protectionist -loyalist -cheerleader -adulteress -wrongdoer -hypocrite -abettor -skinhead -biographer -disk jockey -speaker -representative -reporter -orator -interlocutor -organ-grinder -head of state -alderman -resident commissioner -President of the United States -president -television reporter -anchor -retiree -sunbather -camper -scholar -exponent -casuist -futurist -licentiate -reader -brawler -boxer -wrestler -flyweight -middleweight -sparring partner -prizefighter -light heavyweight -featherweight -lightweight -heavyweight -flyweight -sumo wrestler -bantamweight -egotist -fire-eater -upstart -bragger -exhibitionist -sovereign -Pharaoh -Cheops -sheik -rider -motorcyclist -musher -astronaut -pedestrian -mover -commuter -pilgrim -skin-diver -settler -tourist -runner -gringo -unicyclist -hang glider -jockey -horseman -saunterer -marcher -hitter -scrambler -psycholinguist -social scientist -lumper -sociologist -political scientist -economist -econometrician -microeconomist -female child -woman -mother's daughter -girl wonder -Boy Scout -Cub Scout -enchantress -lady -old woman -nymph -donna -bridesmaid -smasher -primigravida -signorina -girl -beldam -heroine -widow -call girl -baggage -wife -gal -baby -lass -maid -first lady -old lady -crown princess -father-in-law -cousin -kinswoman -ancestor -kinsman -second cousin -in-law -kin -twin -offspring -sibling -niece -aunt -great-niece -sister -great-aunt -little sister -big sister -parent -forefather -forebear -patriarch -mater -father -mother -dad -old man -great grandparent -grandparent -great grandmother -nan -grandma -grandfather -great-nephew -little brother -grandchild -firstborn -child -successor -granddaughter -great grandchild -great grandson -great granddaughter -baby -godson -premature baby -neonate -shiitake -common stinkhorn -earthball -truffle -hen-of-the-woods -gyromitra -mildew -lichen -white fungus -true slime mold -slime mold -club fungus -earthstar -coral fungus -false morel -puffball -pythium -helvella -giant puffball -Scleroderma citrinum -jelly fungus -agaric -stinkhorn -discomycete -basidiomycete -Phytophthora infestans -Jew's-ear -bolete -powdery mildew -downy mildew -reindeer moss -beard lichen -Iceland moss -lecanora -Sarcoscypha coccinea -Aleuria aurantia -gill fungus -polypore -agaric -mushroom -Polyporus squamosus -bracket fungus -Entoloma lividum -mushroom -inky cap -mushroom -oyster mushroom -deer mushroom -parasol mushroom -fairy-ring mushroom -royal agaric -blewits -honey mushroom -Pholiota squarrosa -lepiota -blushing mushroom -horse mushroom -nameko -winter mushroom -false deathcap -shaggymane -destroying angel -toadstool -chanterelle -meadow mushroom -death cap -fly agaric -morel -common morel -black morel -Boletus edulis -Boletus luridus -Boletus chrysenteron -somatic cell -histiocyte -leukocyte -lymphocyte -neutrophil -nest -tangle -radiator -plant part -rock -comet -cadaver -star -snowdrift -covering -aerie -wasp's nest -lip -tendril -plant organ -mycelium -reproductive structure -leaf -root -stalk -hypanthium -flower -fruit -pistil -rosebud -inflorescence -floret -umbel -flower cluster -panicle -olive -ear -buckthorn berry -berry -wild cherry -acorn -rowanberry -mealie -gourd -seed -hip -juniper berry -pod -corn -coffee bean -nut -buckeye -oilseed -bean -edible seed -edible nut -pine nut -macadamia nut -pistachio -hazelnut -walnut -cashew -chestnut -pecan -peanut -coconut -linseed -rapeseed -broad bean -soy -cumin -sunflower seed -pumpkin seed -legume -okra -chickpea -pea -cowpea -garden pea -lentil -dandelion green -frond -petal -cassava -chicory -tuber -spadix -branchlet -bulb -petiole -scape -cornstalk -rattan -Jerusalem artichoke -yam -squill -onion -belay -outcrop -tor -supernova -sun -shell -bracteole -shell -cassia bark -snowcap -perianth -body covering -roof -seashell -scallop shell -oyster shell -exoskeleton -cuticle -plastron -skin -hair -scapular -hairdo -forelock -encolure -facial hair -pigtail -thatch -pompadour -mustache -beard -mustachio -soup-strainer -stubble -soul patch -weather -dust storm -cloud -snow -wave diff --git a/build/darknet/x64/data/9k.tree b/build/darknet/x64/data/9k.tree deleted file mode 100644 index deb61e2a021..00000000000 --- a/build/darknet/x64/data/9k.tree +++ /dev/null @@ -1,9418 +0,0 @@ -n00002452 -1 -n00020827 -1 -n00002684 -1 -n11425580 -1 -n05220461 0 -n09225146 0 -n05538625 4 -n01900150 4 -n05225602 4 -n05418717 8 -n05302499 8 -n05578095 8 -n09475179 5 -n09376198 5 -n14877585 1 -n15046900 1 -n00019613 1 -n00021265 1 -n15067877 14 -n09436708 14 -n14915184 15 -n07555863 15 -n07850329 21 -n07849336 21 -n07705711 21 -n07622061 21 -n07594066 21 -n07854982 22 -n07852833 22 -n07852614 22 -n07854184 22 -n07852229 22 -n07851443 22 -n07705931 24 -n07707451 24 -n07752966 33 -n07760859 33 -n07747055 33 -n07754684 33 -n07768694 33 -n07764847 33 -n07768858 33 -n07739125 33 -n07746551 33 -n07753113 33 -n07763987 33 -n07748574 33 -n07751451 33 -n07762244 33 -n07750872 33 -n07742704 33 -n07765208 33 -n07763792 33 -n07767847 33 -n07766173 33 -n07751004 33 -n07760153 33 -n07758680 33 -n07753592 33 -n07751280 33 -n07769731 33 -n07763629 33 -n07755411 33 -n07754451 33 -n07753275 33 -n07764155 33 -n07765073 33 -n07762114 33 -n07762913 33 -n07753743 33 -n07765999 33 -n07765361 33 -n07752377 33 -n07757132 33 -n07769584 33 -n07751148 33 -n07761141 36 -n07761309 36 -n07749731 37 -n07747951 37 -n07749446 37 -n07747607 37 -n07749582 37 -n07750449 37 -n07749969 37 -n07750146 37 -n07748157 79 -n07748416 79 -n07748276 79 -n07748912 81 -n07748753 81 -n07749192 89 -n07749312 89 -n07739344 42 -n07739506 42 -n07742313 94 -n07740220 94 -n07740954 94 -n07740461 96 -n07740342 96 -n07745940 50 -n07767171 50 -n07744246 50 -n07744057 50 -n07744811 50 -n07744682 50 -n07745466 50 -n07743902 50 -n07746334 50 -n07746186 50 -n07743544 50 -n07743224 50 -n07755707 62 -n07756951 62 -n07755929 62 -n07757990 73 -n07757312 73 -n07757511 73 -n07734744 34 -n07719213 34 -n07768423 34 -n07735510 34 -n07718472 34 -n07710283 34 -n07713395 34 -n07708398 34 -n07710007 34 -n07718747 34 -n07708798 34 -n07723039 34 -n07715561 34 -n07709333 34 -n07730406 34 -n07730033 34 -n07733394 34 -n07713267 34 -n07722217 34 -n07817871 34 -n07736813 123 -n07719839 123 -n07712267 123 -n07730207 123 -n07710616 123 -n07710952 142 -n07711569 142 -n07711080 142 -n07713763 124 -n07713895 124 -n07733567 124 -n07715103 124 -n07715221 124 -n07715407 124 -n07714990 124 -n07735687 124 -n07735803 124 -n07714188 147 -n07714448 147 -n07714895 147 -n07714571 147 -n07714078 147 -n07720442 126 -n07734017 126 -n07713074 126 -n07734555 126 -n07720615 160 -n07721325 160 -n07720875 164 -n07721195 164 -n07721018 164 -n07721456 165 -n07722052 165 -n07721942 169 -n07721678 169 -n07734292 161 -n07734183 161 -n07724943 128 -n07725376 128 -n07726095 128 -n07725255 128 -n07729485 175 -n07726796 175 -n07727458 180 -n07727048 180 -n07727578 180 -n07727868 183 -n07728804 183 -n07728053 184 -n07728585 184 -n07728181 184 -n07729384 185 -n07729828 185 -n07725531 176 -n07725789 191 -n07725888 191 -n07715721 130 -n07717070 130 -n07716906 194 -n07716358 194 -n07716034 194 -n07717556 195 -n07717410 195 -n07720277 131 -n07736256 131 -n07723330 131 -n07719616 131 -n07736692 131 -n07733712 131 -n07732747 203 -n07730855 203 -n07731587 203 -n07731006 203 -n07723559 203 -n07724654 211 -n07724269 211 -n07724492 211 -n07722485 136 -n07723177 136 -n07722888 136 -n07639069 25 -n07679356 25 -n07682197 219 -n07680517 219 -n07695878 219 -n07685730 219 -n07682316 219 -n07684517 219 -n07680761 219 -n07681691 219 -n07684600 219 -n07684164 219 -n07686720 219 -n07680932 219 -n07687211 219 -n07681450 219 -n07683786 219 -n07695742 219 -n07682477 219 -n07686873 219 -n07684289 219 -n07683490 219 -n07682808 219 -n07690585 228 -n07684938 228 -n07690892 228 -n07685399 228 -n07693972 228 -n07690273 228 -n07691091 228 -n07687789 228 -n07685218 228 -n07694516 245 -n07694839 245 -n07694659 245 -n07690511 246 -n07690739 246 -n07690431 246 -n07688624 248 -n07688898 248 -n07689003 248 -n07690152 231 -n07693725 231 -n07690019 231 -n07692614 231 -n07691758 231 -n07691539 231 -n07691650 231 -n07693223 262 -n07693048 262 -n07691237 262 -n07687626 232 -n07687381 232 -n07687469 232 -n07871810 234 -n07684084 234 -n14580897 16 -n15062057 16 -n14698884 274 -n14696793 274 -n14765422 274 -n14844693 274 -n15019030 274 -n12167075 274 -n14974264 274 -n14858292 274 -n15075141 282 -n04033425 282 -n07556637 17 -n07566340 17 -n07560652 17 -n07881800 17 -n07938313 17 -n07800091 17 -n07570720 17 -n01464844 17 -n07556406 17 -n07840804 287 -n07802417 287 -n07925608 287 -n07844867 287 -n07569644 287 -n07568502 287 -n07809096 287 -n07843775 287 -n07755089 287 -n07882497 287 -n07573347 287 -n07923748 287 -n07572957 287 -n07731952 296 -n07804323 296 -n07804771 296 -n07803093 296 -n07803545 296 -n07732168 308 -n07732636 308 -n07804657 309 -n07804900 309 -n07809368 301 -n07841345 301 -n07827284 317 -n07827130 317 -n07822518 317 -n07827410 317 -n07816052 317 -n07812184 317 -n07810907 317 -n07858595 317 -n07811416 317 -n07824702 317 -n07818277 317 -n07819769 317 -n07920989 317 -n07822323 317 -n07815424 324 -n07814390 324 -n07826930 324 -n07814487 324 -n07814203 324 -n07583066 325 -n07822845 325 -n07767344 325 -n07823105 325 -n07828987 325 -n07582609 325 -n07825972 325 -n07823460 325 -n07823698 325 -n07822197 325 -n07856270 325 -n07767709 325 -n07829412 325 -n07829331 342 -n07829248 342 -n07857731 348 -n07857170 348 -n07838233 350 -n07836838 350 -n07826091 350 -n07830593 350 -n07840027 350 -n07832416 350 -n07832902 350 -n07835921 350 -n07835457 350 -n07831146 355 -n07831267 355 -n07834618 361 -n07834507 361 -n07595914 326 -n07858978 326 -n07859583 326 -n07860103 370 -n07860331 370 -n07860447 370 -n07816164 327 -n07818689 327 -n07821260 327 -n07820683 327 -n07816575 327 -n07817160 327 -n07817315 327 -n07819166 327 -n07817024 327 -n07818995 327 -n07816398 327 -n07820497 327 -n07932841 327 -n07820145 327 -n07819896 327 -n07816296 327 -n07821758 327 -n07933154 386 -n07935379 386 -n07935043 386 -n07847198 302 -n07844042 302 -n07848196 394 -n07847453 394 -n07847917 394 -n07847827 394 -n07678729 304 -n07860805 304 -n07860988 304 -n07883031 304 -n07623136 402 -n07861158 402 -n07627931 404 -n07628068 404 -n07565161 288 -n07565083 288 -n07561590 288 -n07561112 288 -n07560903 288 -n07562495 411 -n07564971 411 -n07938149 413 -n07938007 413 -n07884567 289 -n07924033 289 -n07919310 289 -n07891189 289 -n07922764 289 -n07929519 289 -n07921455 289 -n07933274 289 -n07927197 289 -n07925966 289 -n07891309 289 -n07936263 289 -n07883251 289 -n07914271 289 -n07911371 417 -n07901587 417 -n07891433 417 -n07891726 417 -n07886176 417 -n07886057 417 -n07907943 417 -n07921615 417 -n07886572 417 -n07902121 417 -n07886463 417 -n07912211 431 -n07911677 431 -n07914777 431 -n07930554 431 -n07930433 431 -n07930315 431 -n07915491 442 -n07915094 442 -n07913393 443 -n07916041 443 -n07914995 443 -n07916183 443 -n07914413 443 -n07917392 443 -n07917133 443 -n07915918 443 -n07930864 445 -n07931870 445 -n07932039 445 -n07930062 445 -n07906111 432 -n07907037 432 -n07902799 432 -n07904865 432 -n07905474 432 -n07902937 432 -n07904395 432 -n07905038 432 -n07902336 432 -n07905979 432 -n07903101 432 -n07904760 432 -n07903208 432 -n07904934 432 -n07906284 432 -n07902443 474 -n07903841 474 -n07903962 474 -n07903731 474 -n07903643 474 -n07907161 476 -n07906718 476 -n07907831 476 -n07907548 476 -n07907429 476 -n07906877 476 -n07906572 476 -n07893253 434 -n07892418 434 -n07893642 434 -n07899003 434 -n07896287 434 -n07896661 434 -n07893528 434 -n07896165 434 -n07900225 434 -n07893891 434 -n07900406 434 -n07895237 434 -n07898745 434 -n07896060 434 -n07899108 434 -n07892512 434 -n07897750 434 -n07892813 434 -n07894703 498 -n07894102 498 -n07894551 498 -n07900616 499 -n07900958 499 -n07900734 499 -n07900825 499 -n07901457 499 -n07898117 500 -n07895435 500 -n07899434 503 -n07899292 503 -n07894298 504 -n07895595 504 -n07894965 504 -n07897865 504 -n07895839 504 -n07895710 504 -n07898333 504 -n07897438 506 -n07895962 506 -n07896893 506 -n07899899 506 -n07895100 506 -n07898443 506 -n07899533 506 -n07894799 506 -n07897975 506 -n07899660 506 -n07894451 506 -n07910656 437 -n07909593 437 -n07911249 437 -n07910048 437 -n07908411 437 -n07910379 437 -n07908647 437 -n07886849 439 -n07887634 544 -n07887099 544 -n07889510 544 -n07887192 544 -n07887304 545 -n07888229 545 -n07887967 545 -n07889274 545 -n07887461 545 -n07888465 547 -n07890226 547 -n07890352 547 -n07889814 547 -n07890068 547 -n07890540 547 -n07888816 547 -n07924834 418 -n07924443 418 -n07924276 418 -n07920540 422 -n07920222 422 -n07920052 422 -n07920349 422 -n07919441 422 -n07731284 422 -n07919572 422 -n07920872 422 -n07921239 422 -n07934282 424 -n07933799 424 -n07929172 425 -n07927931 425 -n07928488 425 -n07928367 425 -n07927512 425 -n07928887 425 -n07928696 576 -n07928790 576 -n07936745 428 -n07935737 428 -n07936548 428 -n07801508 291 -n07805594 291 -n07800740 291 -n07801091 588 -n07802026 588 -n07801779 588 -n07801892 588 -n07557165 292 -n07560193 292 -n07651025 292 -n07560331 292 -n07557434 292 -n07556970 292 -n05399243 292 -n15089258 292 -n07560542 292 -n07573696 292 -n07613815 593 -n07643981 593 -n07596684 593 -n07600696 605 -n07597145 605 -n07597365 605 -n07599998 605 -n07596967 605 -n07620689 605 -n07642471 607 -n07643200 612 -n07642742 612 -n07643026 612 -n07642933 612 -n07643306 612 -n07606538 608 -n07599911 608 -n07607138 608 -n07608429 608 -n07598256 608 -n07606669 608 -n07607605 608 -n07601572 608 -n07609632 608 -n07605597 608 -n07607967 608 -n07609215 608 -n07841907 608 -n07606764 608 -n07605944 608 -n07601686 608 -n07605380 608 -n07605040 608 -n07601809 608 -n07605474 608 -n07842130 630 -n07842044 630 -n07600285 609 -n07600177 609 -n07842202 597 -n07579688 597 -n07580053 597 -n07588947 597 -n07842753 597 -n07583197 597 -n07879350 597 -n07880751 597 -n07868200 597 -n07863802 597 -n07875152 597 -n07824191 597 -n07878785 597 -n07865484 597 -n07866015 597 -n07868955 597 -n07861557 597 -n07580253 597 -n07877187 597 -n07866868 597 -n07880458 597 -n07648913 597 -n07580470 597 -n07866277 597 -n07591961 597 -n07868508 597 -n07871436 597 -n07864934 597 -n07874780 597 -n07879659 597 -n07878926 597 -n07937461 597 -n07842433 597 -n07862611 597 -n07863374 597 -n07866723 597 -n07867021 597 -n07867164 597 -n07726525 597 -n07624466 597 -n07842308 597 -n07877299 597 -n07880080 597 -n07862348 597 -n07873464 597 -n07869775 597 -n07879953 597 -n07625061 597 -n07843636 597 -n07696403 597 -n07580592 597 -n07655263 597 -n07868340 597 -n07619004 597 -n07879174 597 -n07867324 597 -n07843464 597 -n07877961 597 -n07873807 597 -n07867421 597 -n07654298 597 -n07878647 597 -n07611839 597 -n07842605 597 -n07871720 597 -n07869611 597 -n07876651 597 -n07880968 597 -n07875436 597 -n07806221 597 -n07841495 597 -n07823951 597 -n07712382 597 -n07591586 645 -n07590320 645 -n07587111 645 -n07592481 645 -n07590611 645 -n07591473 645 -n07590502 645 -n07591049 645 -n07592768 645 -n07585758 647 -n07588193 647 -n07586894 647 -n07588299 647 -n07584110 647 -n07587441 647 -n07587023 647 -n07586099 647 -n07588574 647 -n07584332 647 -n07586604 647 -n07586718 647 -n07585107 647 -n07585557 647 -n07585208 647 -n07584593 647 -n07585906 647 -n07584423 647 -n07587618 729 -n07587700 729 -n07588111 729 -n07704054 670 -n07704205 670 -n07871234 676 -n07870167 676 -n07863547 676 -n07700003 676 -n07619208 695 -n07619409 695 -n07874159 700 -n07874343 700 -n07874259 700 -n07874441 700 -n07874063 700 -n07867751 701 -n07867616 701 -n07808587 711 -n07807834 711 -n07806633 711 -n07807171 711 -n07807710 711 -n07807922 711 -n07808904 711 -n07806774 762 -n07807472 762 -n07841639 712 -n07841800 712 -n07695965 714 -n07712748 714 -n07712559 714 -n07697825 771 -n07697313 771 -n07696728 771 -n07696625 771 -n07698543 771 -n07698401 771 -n07865105 771 -n07696977 771 -n07698250 771 -n07698782 771 -n07697100 771 -n07696839 771 -n07697537 771 -n07712856 772 -n07712959 772 -n07579575 598 -n07579787 598 -n07609840 598 -n07581346 598 -n07611991 791 -n07613266 791 -n07611358 791 -n07612632 791 -n07612996 791 -n07613480 791 -n07611267 791 -n07612367 791 -n07611148 791 -n07611046 791 -n07617611 791 -n07612137 791 -n07616386 795 -n07631926 795 -n07615774 795 -n07616487 795 -n07614730 795 -n07614500 795 -n07614198 795 -n07616748 795 -n07616046 795 -n07617051 795 -n07615671 810 -n07615190 810 -n07614825 810 -n07615460 810 -n07617708 796 -n07618432 796 -n07582152 792 -n07734879 792 -n07581775 792 -n07582277 792 -n07730320 792 -n07581249 792 -n15089645 600 -n15089472 600 -n15093137 827 -n15093298 827 -n15090742 827 -n15091473 831 -n14919819 831 -n15091669 831 -n14810561 831 -n14973585 831 -n15091304 831 -n15091846 831 -n15092227 828 -n15090065 828 -n07576438 602 -n07577374 602 -n07575984 602 -n07574602 602 -n07574426 602 -n07593199 602 -n07576182 602 -n07574923 602 -n07574780 602 -n07575726 602 -n07575076 602 -n07578093 602 -n07576577 841 -n07577144 853 -n07576781 853 -n07574504 842 -n07577538 842 -n09335240 2 -n00027167 2 -n09334396 2 -n09283193 2 -n03892891 2 -n09287968 2 -n03059685 2 -n00003553 2 -n09300905 2 -n09452395 858 -n09260907 858 -n08630039 859 -n08630985 859 -n09386842 859 -n08593262 859 -n08620061 859 -n09379111 859 -n08649711 869 -n08658309 869 -n08568978 869 -n08512259 877 -n03823111 877 -n04170933 878 -n09433839 878 -n08578517 870 -n08640739 870 -n08574314 870 -n08552138 870 -n08645104 884 -n08505018 884 -n08659861 884 -n08659446 884 -n08673395 884 -n08583455 890 -n08598301 890 -n08651247 890 -n03120491 890 -n02802544 890 -n08614632 890 -n08674739 890 -n08569998 890 -n08494231 890 -n08677424 892 -n08616050 892 -n08518171 893 -n08573842 893 -n08521623 893 -n03368352 897 -n03417345 897 -n04454908 906 -n03902482 906 -n04610879 898 -n08579352 898 -n03963645 909 -n03417749 909 -n08524735 885 -n08537837 885 -n08551296 885 -n08628141 914 -n08633683 914 -n08539072 914 -n09249034 871 -n09263912 871 -n08583292 872 -n09443281 872 -n08547544 872 -n08664443 873 -n04602044 873 -n08580944 873 -n03581125 924 -n08517676 924 -n08598568 924 -n08584914 924 -n03899933 925 -n02776631 925 -n03322099 925 -n03935234 933 -n04052442 933 -n03159535 933 -n15102894 874 -n09242389 874 -n09382099 860 -n09282208 860 -n09392402 860 -n09393605 860 -n09445289 860 -n03030880 862 -n03946162 862 -n03485997 862 -n03882960 946 -n04322026 946 -n03474896 946 -n02764398 946 -n02907082 946 -n03948830 946 -n09205509 863 -n09472413 863 -n09443453 863 -n09309292 863 -n09366017 863 -n09366317 863 -n09376786 863 -n09348460 863 -n09246464 863 -n09433442 863 -n09454153 863 -n09409752 863 -n09403734 863 -n09331251 863 -n09437454 863 -n09238926 863 -n09283866 863 -n09217230 863 -n09305898 955 -n09288635 955 -n09308743 956 -n09308572 956 -n09194227 956 -n09289331 956 -n09468604 957 -n09344324 957 -n09335809 957 -n09435739 957 -n09215437 957 -n09259219 957 -n09217638 957 -n09304750 957 -n09206896 977 -n09405787 977 -n09233446 986 -n09290444 986 -n09457979 981 -n09245515 981 -n09376526 983 -n09415671 983 -n09448690 983 -n09230041 984 -n09398076 984 -n09453008 958 -n09303008 958 -n09359803 958 -n09302616 958 -n09409512 958 -n09399592 958 -n09199101 997 -n09230202 997 -n09283405 997 -n09326662 997 -n09193705 998 -n09218641 998 -n09472597 998 -n09421951 1000 -n09270735 1000 -n09406793 1000 -n09213434 1000 -n09256479 1011 -n09210862 1011 -n09421799 1012 -n09224725 1012 -n09396465 1001 -n09362945 1001 -n09259025 961 -n09398677 961 -n09428293 962 -n09447666 962 -n09332890 962 -n08596076 1021 -n09428628 1021 -n09361517 967 -n09265620 967 -n09303528 967 -n09436444 967 -n09274152 967 -n09213565 967 -n09269472 967 -n09206985 967 -n09228055 967 -n09466678 967 -n09415584 1031 -n09475925 1031 -n09257843 968 -n09239302 968 -n09294877 968 -n00021939 865 -n00004258 865 -n00019128 865 -n02749953 865 -n02852523 1041 -n03767112 1041 -n14977504 1041 -n03129123 1041 -n03848729 1041 -n03964744 1041 -n04362025 1041 -n04469003 1041 -n04341686 1041 -n03575240 1041 -n03873064 1041 -n03122748 1041 -n03309808 1041 -n02871147 1041 -n03364340 1041 -n14786479 1041 -n03169390 1041 -n04564698 1041 -n04339291 1041 -n00022903 1041 -n03315023 1041 -n03302121 1041 -n03076708 1041 -n04188643 1041 -n03354613 1041 -n14976871 1041 -n03670849 1041 -n02917521 1045 -n04414909 1045 -n04435180 1045 -n02725872 1045 -n04076846 1048 -n02743547 1048 -n03816849 1048 -n04007894 1048 -n03934656 1076 -n03720163 1076 -n04227144 1076 -n04260364 1076 -n03925226 1076 -n04564581 1076 -n02744844 1084 -n04042358 1084 -n03927091 1084 -n03927539 1084 -n03876519 1077 -n04485423 1077 -n03835197 1090 -n03342127 1090 -n04246271 1078 -n04321238 1078 -n04180314 1095 -n03625783 1095 -n03684611 1096 -n03514693 1096 -n03421485 1097 -n04026180 1097 -n02870526 1079 -n04599396 1079 -n06415688 1079 -n03822171 1079 -n04582205 1103 -n03727605 1103 -n03849679 1103 -n04598792 1103 -n03631922 1103 -n02933649 1109 -n03600722 1109 -n03169176 1049 -n03418618 1049 -n02727016 1049 -n03526198 1049 -n03794798 1049 -n03859608 1049 -n03968581 1116 -n03717447 1116 -n03614782 1116 -n03915900 1116 -n04431025 1116 -n03974070 1050 -n02779435 1050 -n03941231 1050 -n04399382 1050 -n03603442 1050 -n09229709 1050 -n03548402 1050 -n03944138 1050 -n04238128 1050 -n04284869 1050 -n03061211 1050 -n03219135 1050 -n09282724 1129 -n09191635 1129 -n09443641 1136 -n04186268 1136 -n03447358 1135 -n03607029 1135 -n03536348 1051 -n02857023 1051 -n04381860 1051 -n04213626 1051 -n03961939 1142 -n04394630 1142 -n03365592 1142 -n04501550 1146 -n04296562 1146 -n03159640 1146 -n04354182 1146 -n03549732 1146 -n03360300 1148 -n03892178 1148 -n02768973 1143 -n03906224 1143 -n03313333 1145 -n02990373 1145 -n02861886 1053 -n03365991 1053 -n02898711 1053 -n03109693 1053 -n13898207 1053 -n04358874 1053 -n02687821 1053 -n03135532 1053 -n03545756 1053 -n03548626 1053 -n03469175 1053 -n03688943 1053 -n02914991 1053 -n04191595 1053 -n09218315 1053 -n03074380 1053 -n02699494 1053 -n02733524 1053 -n04460130 1053 -n04471148 1053 -n03792048 1053 -n03388043 1053 -n03837869 1053 -n03321954 1053 -n02733213 1053 -n03687137 1053 -n03065424 1053 -n02839110 1053 -n03894379 1053 -n03725717 1053 -n04226464 1053 -n03071160 1053 -n03839993 1053 -n02913152 1053 -n04128413 1053 -n04008947 1053 -n03917198 1053 -n03222318 1053 -n04295881 1053 -n03241335 1053 -n02735688 1053 -n02777734 1053 -n03984381 1053 -n03216828 1053 -n03517899 1053 -n03546340 1053 -n04361095 1053 -n13897996 1053 -n03171356 1053 -n03290195 1053 -n03743902 1053 -n03297735 1053 -n04217882 1053 -n02863426 1160 -n03408054 1160 -n03463381 1161 -n03758089 1161 -n03686130 1161 -n02800497 1161 -n03379828 1162 -n03233744 1162 -n02953197 1162 -n04108822 1162 -n03865557 1162 -n04492749 1162 -n04532670 1162 -n04311004 1162 -n03122073 1162 -n03415486 1162 -n04366367 1162 -n04479939 1162 -n03956922 1172 -n03069752 1172 -n04592465 1231 -n03316406 1231 -n03212811 1231 -n03844673 1231 -n04068441 1231 -n04103094 1234 -n03387653 1234 -n04311595 1234 -n03697007 1234 -n04300358 1234 -n04032603 1242 -n02810782 1242 -n03492250 1173 -n03826186 1173 -n03547054 1173 -n04411264 1173 -n03550153 1173 -n03560430 1173 -n03254189 1173 -n03792972 1248 -n04025508 1248 -n03900979 1248 -n02769963 1248 -n03374473 1248 -n02954163 1248 -n03334291 1257 -n04549028 1257 -n03035252 1257 -n03448956 1177 -n04113765 1177 -n03975035 1177 -n04486054 1177 -n02905152 1177 -n03784896 1262 -n04104384 1262 -n02946127 1178 -n04501947 1178 -n03047052 1178 -n04206790 1178 -n03029197 1178 -n03767745 1178 -n04028581 1178 -n04220250 1178 -n04556948 1178 -n04479823 1178 -n04028764 1178 -n04312432 1178 -n03347617 1178 -n03519387 1178 -n04361260 1178 -n03098959 1178 -n02826886 1178 -n02814860 1178 -n02922292 1180 -n04251701 1180 -n04051825 1180 -n03390786 1288 -n02811936 1288 -n02699770 1188 -n04546855 1188 -n03409393 1292 -n04544325 1292 -n02755823 1292 -n03904657 1293 -n02825961 1293 -n02898369 1189 -n04326799 1189 -n02796623 1192 -n03839795 1192 -n03967942 1192 -n03659686 1192 -n03454707 1300 -n04127395 1300 -n03795580 1300 -n02788148 1300 -n02894605 1300 -n03459775 1300 -n04571566 1300 -n04047401 1300 -n03549589 1300 -n04304680 1300 -n03327234 1300 -n03160309 1300 -n03427296 1306 -n03221720 1306 -n03698815 1316 -n03985881 1316 -n04501370 1316 -n03395514 1317 -n02963821 1317 -n04153025 1317 -n03394649 1317 -n03226880 1317 -n03579538 1317 -n04239074 1317 -n04086446 1317 -n02793842 1317 -n03498662 1317 -n04329834 1317 -n04547592 1314 -n04082710 1314 -n04046974 1314 -n03000134 1314 -n03252637 1314 -n03511175 1314 -n04604644 1314 -n03930313 1314 -n04326547 1314 -n04560882 1301 -n02920369 1301 -n03262072 1302 -n03108853 1302 -n04390977 1302 -n03999160 1193 -n03542333 1193 -n04409384 1193 -n02666943 1193 -n02726681 1193 -n02763604 1193 -n03478756 1193 -n03545150 1193 -n04104500 1193 -n04081699 1193 -n03859280 1193 -n03402941 1193 -n03739518 1193 -n03542605 1193 -n03661043 1193 -n02977936 1193 -n03322570 1193 -n03953416 1193 -n04081281 1193 -n03770316 1193 -n04112654 1193 -n03839671 1193 -n03842012 1193 -n04407686 1193 -n04217546 1193 -n03449564 1193 -n03457902 1193 -n04093625 1193 -n03956157 1193 -n04018399 1193 -n02882190 1193 -n03544360 1193 -n04118635 1193 -n02734725 1193 -n04233124 1193 -n03430418 1193 -n04146050 1193 -n03007444 1193 -n04417809 1193 -n03479397 1193 -n03092166 1193 -n02993546 1193 -n04080705 1347 -n08640531 1347 -n03788498 1347 -n08560295 1347 -n04095109 1347 -n04229737 1347 -n03541696 1347 -n03790755 1347 -n03036022 1352 -n03466839 1352 -n03698723 1352 -n03333610 1353 -n03837698 1353 -n03121298 1353 -n04187547 1356 -n03416489 1356 -n02968074 1356 -n03860404 1356 -n03055857 1356 -n02859443 1402 -n04598318 1402 -n02727426 1402 -n03730334 1358 -n03210552 1358 -n04294879 1362 -n03016389 1362 -n03123809 1362 -n02793495 1362 -n03884778 1363 -n03028079 1363 -n04407435 1363 -n04210390 1363 -n04346328 1363 -n03724756 1363 -n04374735 1363 -n03788195 1363 -n03007130 1363 -n03618982 1417 -n02667576 1417 -n02984061 1417 -n02984203 1417 -n03772077 1417 -n02935658 1364 -n04111414 1364 -n02760099 1364 -n02892499 1364 -n02935891 1364 -n03199647 1364 -n02956699 1371 -n03282295 1371 -n04461437 1371 -n03005033 1371 -n03152303 1371 -n04305210 1371 -n03121431 1371 -n03558176 1373 -n03557360 1373 -n02696165 1375 -n03393017 1375 -n04258438 1377 -n02919792 1377 -n04115256 1377 -n02932400 1377 -n03257210 1377 -n03719053 1377 -n03685820 1377 -n03428090 1377 -n03686924 1377 -n04131368 1377 -n03118969 1377 -n03219483 1377 -n04052658 1377 -n02857477 1377 -n03180865 1377 -n04535524 1377 -n03002816 1377 -n04079244 1377 -n03322836 1377 -n04413969 1449 -n02907873 1449 -n03878066 1452 -n04305323 1452 -n03718458 1452 -n04354026 1457 -n03158186 1457 -n04535370 1457 -n03010915 1457 -n03718935 1464 -n04073948 1464 -n03439348 1464 -n03892557 1464 -n03877845 1464 -n03781244 1476 -n02667379 1476 -n02667478 1476 -n03165616 1382 -n03092314 1382 -n03801671 1382 -n03849814 1384 -n03801533 1384 -n03032252 1384 -n03678729 1384 -n03529860 1384 -n03097362 1387 -n04177931 1387 -n02940385 1387 -n03111041 1195 -n03064935 1195 -n03626115 1195 -n02838728 1195 -n03356858 1195 -n02902079 1195 -n04439585 1195 -n03263076 1195 -n04453037 1195 -n03942920 1195 -n03379204 1198 -n03522003 1198 -n03220692 1198 -n02782778 1198 -n02918112 1198 -n02704949 1198 -n03899768 1200 -n03109881 1200 -n02775178 1200 -n03517647 1200 -n03024064 1200 -n02894158 1200 -n04030518 1200 -n03004824 1200 -n02758134 1200 -n03120198 1200 -n03200231 1200 -n04105893 1200 -n02750070 1200 -n03285912 1200 -n03813078 1200 -n02694045 1200 -n04328946 1200 -n03443005 1200 -n03378005 1519 -n02754656 1519 -n03047941 1519 -n03382292 1519 -n04446276 1521 -n04356925 1521 -n03288500 1521 -n04363991 1521 -n04112579 1521 -n03038685 1521 -n03412058 1521 -n03718581 1521 -n02991302 1521 -n03691817 1521 -n04139395 1521 -n03238131 1521 -n02839592 1521 -n02824319 1521 -n03619890 1521 -n03660909 1521 -n04329477 1521 -n04602762 1521 -n04180229 1521 -n02710324 1521 -n03200701 1521 -n04065464 1521 -n03541091 1521 -n04058096 1521 -n02873839 1521 -n03089879 1521 -n02821627 1521 -n03040376 1521 -n03679712 1521 -n03222176 1521 -n03478907 1521 -n04061793 1521 -n02857644 1521 -n04345028 1521 -n03683708 1521 -n03062122 1521 -n04406239 1521 -n03079741 1521 -n03120778 1521 -n03982331 1521 -n02807731 1521 -n03098688 1521 -n02715513 1521 -n04558478 1532 -n03746486 1532 -n04555291 1532 -n04018667 1532 -n03529175 1537 -n03653740 1537 -n04345201 1537 -n03885535 1548 -n04324387 1548 -n04523831 1548 -n04067818 1552 -n03200539 1552 -n02952585 1553 -n03319745 1553 -n04119478 1553 -n03283221 1554 -n04064862 1554 -n03850245 1554 -n04401680 1556 -n04541987 1556 -n03090172 1556 -n04209613 1556 -n03727465 1558 -n03788601 1558 -n03465718 1558 -n03542860 1558 -n03225108 1558 -n03836062 1558 -n03165466 1558 -n03457008 1562 -n03086580 1562 -n03878211 1562 -n03303831 1562 -n03891538 1563 -n03235042 1563 -n04000592 1569 -n03075946 1569 -n02932019 1569 -n03939677 1569 -n02931148 1569 -n03696065 1569 -n02933462 1569 -n03061505 1569 -n04305572 1569 -n02960352 1569 -n02934451 1569 -n04299370 1569 -n03235180 1569 -n04414199 1523 -n02936714 1523 -n03964495 1523 -n03907227 1523 -n04539203 1523 -n03993703 1523 -n03683079 1523 -n03016737 1523 -n03003730 1523 -n04061969 1523 -n02843276 1624 -n04037220 1624 -n03550289 1624 -n03124590 1626 -n04100519 1626 -n03376159 1626 -n04262161 1631 -n02921884 1631 -n03348868 1631 -n04080454 1631 -n03404449 1631 -n02868638 1631 -n03555006 1631 -n04076713 1640 -n03732114 1640 -n03617095 1643 -n02849885 1643 -n03837606 1643 -n03425325 1643 -n03566193 1643 -n03762434 1632 -n03073694 1632 -n03343560 1632 -n03346455 1632 -n02731398 1632 -n02991847 1526 -n03148324 1526 -n04295571 1526 -n03411544 1201 -n02705201 1661 -n03854722 1661 -n04327204 1202 -n04355267 1202 -n03399677 1202 -n04527648 1202 -n03168107 1202 -n02770211 1202 -n03986704 1202 -n03721590 1203 -n03251533 1203 -n02853016 1205 -n03259505 1205 -n04409625 1205 -n03679384 1205 -n03776460 1205 -n03088389 1205 -n02726305 1205 -n04549919 1673 -n02992032 1673 -n03088580 1674 -n04613696 1674 -n03685307 1674 -n04517408 1674 -n03507241 1674 -n03354207 1674 -n03042490 1674 -n03529629 1674 -n04172107 1674 -n04584373 1684 -n04412416 1684 -n02672371 1676 -n03349892 1693 -n02932693 1693 -n02822064 1679 -n03361297 1679 -n03010473 1206 -n04360501 1206 -n03391770 1206 -n03903868 1699 -n02929289 1699 -n03373943 1699 -n02669295 1699 -n04087826 1700 -n02926591 1700 -n04589593 1700 -n03390983 1700 -n03416094 1700 -n03530642 1700 -n04492375 1700 -n03646916 1700 -n03111296 1700 -n03931765 1700 -n04587648 1700 -n03042697 1700 -n04478512 1700 -n02689144 1700 -n03454536 1700 -n03453443 1700 -n04545305 1700 -n02977619 1700 -n04387261 1700 -n02732827 1700 -n04038727 1700 -n03793186 1700 -n04136510 1700 -n02976350 1700 -n03855333 1715 -n02813399 1715 -n04297750 1715 -n04232800 1715 -n03211789 1715 -n04110178 1715 -n03986562 1715 -n04473108 1715 -n03041810 1715 -n03224603 1715 -n03224753 1715 -n03637898 1715 -n03320959 1715 -n03961711 1725 -n02790669 1725 -n02835829 1725 -n03696301 1725 -n03207630 1725 -n04459773 1725 -n03896526 1726 -n03900393 1726 -n03792526 1726 -n04340935 1208 -n03386011 1208 -n03385557 1208 -n02806088 1751 -n03610098 1751 -n03628511 1754 -n02676938 1754 -n02695627 1752 -n03723781 1752 -n03334382 1753 -n02805983 1753 -n03296328 1753 -n03878963 1753 -n02980441 1753 -n02993194 1210 -n03743016 1210 -n04178329 1210 -n02892201 1210 -n03810952 1210 -n03884926 1210 -n03220237 1766 -n03745571 1766 -n03953020 1211 -n03574555 1211 -n04511002 1211 -n03748162 1773 -n03841666 1773 -n02931417 1773 -n03506370 1773 -n03965456 1776 -n03119203 1776 -n03176763 1776 -n04202417 1776 -n03722288 1776 -n02879309 1783 -n04131208 1783 -n04200800 1783 -n02871525 1783 -n03871371 1783 -n04428634 1783 -n03606251 1783 -n04462240 1783 -n03039827 1783 -n02813544 1783 -n03436417 1783 -n03367410 1783 -n03249342 1783 -n03416640 1783 -n03173387 1783 -n04245508 1783 -n02791270 1783 -n04299215 1783 -n04443257 1783 -n03822656 1783 -n02927161 1783 -n03952576 1783 -n03089624 1783 -n03099274 1783 -n02813645 1784 -n08492461 1784 -n03461385 1784 -n03847823 1784 -n04358707 1811 -n03555426 1811 -n03457686 1811 -n04261281 1812 -n03322704 1812 -n08571898 1812 -n03822504 1777 -n02885882 1777 -n03504723 1777 -n03111690 1774 -n03856012 1774 -n03592245 1822 -n03911513 1822 -n04005630 1822 -n04447443 1054 -n04566257 1054 -n03294048 1054 -n03091374 1054 -n03563967 1054 -n03405265 1054 -n03183080 1054 -n02997391 1054 -n04377057 1054 -n03094503 1054 -n03100490 1054 -n06254669 1054 -n03176594 1827 -n02807523 1827 -n03128519 1827 -n03690938 1827 -n04186051 1827 -n03476991 1827 -n03794136 1827 -n03916031 1827 -n03475823 1827 -n02723165 1827 -n03994008 1827 -n03113152 1827 -n02808185 1827 -n03484487 1841 -n03067339 1841 -n04357314 1841 -n03640850 1841 -n02862916 1842 -n04450640 1842 -n03487444 1842 -n02683791 1842 -n03992325 1846 -n03898271 1846 -n03916470 1846 -n03071021 1846 -n04448070 1846 -n03980026 1847 -n02901793 1847 -n04447276 1849 -n04386792 1849 -n03177165 1850 -n03519081 1850 -n03714235 1850 -n03314780 1871 -n03676087 1871 -n03309687 1871 -n03724066 1871 -n03676483 1871 -n04112752 1871 -n03309110 1871 -n03308481 1871 -n02738031 1828 -n03171228 1828 -n02866578 1828 -n02703275 1828 -n03812924 1828 -n02813752 1880 -n02746365 1880 -n03647520 1880 -n02950256 1886 -n03332393 1886 -n03786715 1888 -n02801450 1888 -n03553248 1882 -n02753044 1882 -n04113641 1883 -n04206570 1883 -n04063373 1829 -n04285146 1829 -n03926148 1829 -n03811847 1829 -n03889726 1829 -n03430959 1829 -n04137444 1829 -n03414162 1829 -n03888257 1829 -n03278248 1829 -n02727825 1829 -n02761206 1829 -n03729951 1829 -n02774921 1829 -n04393095 1896 -n02979290 1896 -n03192543 1910 -n04533802 1910 -n02799897 1897 -n03135030 1897 -n03039259 1897 -n04225729 1897 -n04607035 1897 -n03132261 1897 -n02802721 1897 -n03594148 1897 -n04212282 1897 -n03446832 1897 -n04275661 1897 -n04318131 1897 -n02885338 1897 -n02885462 1897 -n03472232 1897 -n04571292 1897 -n02800213 1914 -n02811059 1914 -n02811204 1914 -n02797881 1914 -n02811350 1914 -n02799175 1914 -n03528901 1933 -n03349771 1933 -n04425804 1933 -n04164406 1933 -n04102037 1917 -n04102162 1917 -n04102618 1917 -n03558404 1917 -n03523987 1943 -n04273972 1943 -n03336282 1943 -n03132076 1919 -n04582869 1919 -n03445924 1923 -n03447075 1923 -n04399537 1923 -n03446070 1923 -n04597066 1952 -n03585073 1952 -n03244047 1953 -n04284341 1953 -n04569822 1954 -n03762332 1954 -n04028074 1954 -n03823216 1954 -n03950537 1957 -n04135024 1957 -n03524150 1925 -n03978686 1925 -n03535780 1928 -n03538037 1928 -n04509260 1928 -n03888605 1928 -n04469514 1928 -n02777292 1928 -n04524142 1966 -n03980478 1966 -n03255030 1929 -n02790996 1929 -n03289660 1898 -n02942699 1898 -n03037404 1898 -n03338821 1898 -n03667664 1898 -n02884994 1976 -n03358726 1976 -n03976467 1976 -n03974915 1976 -n04569063 1976 -n03789171 1976 -n03196062 1976 -n03987266 1976 -n04069434 1976 -n04609531 1978 -n04067658 1978 -n03817191 1978 -n04071263 1901 -n03619396 1901 -n04091097 1901 -n03351434 1901 -n04295081 1901 -n04091693 1901 -n03138669 1992 -n03139464 1992 -n04179824 1993 -n03349469 1993 -n02966687 1993 -n03650551 1993 -n03241093 1994 -n03240683 1994 -n03494706 1996 -n04247876 1996 -n03503718 1996 -n04124202 1996 -n03480719 2008 -n02900160 2008 -n04290615 1902 -n04266162 1902 -n02768226 1903 -n02778669 1903 -n04028315 1903 -n03982430 1903 -n02882647 1903 -n03716327 1903 -n03020416 1903 -n04113406 1903 -n03442756 1903 -n04540255 1903 -n03941417 1903 -n04254680 2015 -n03982232 2015 -n02882301 2015 -n04256891 2015 -n03333252 2015 -n04023962 2015 -n02839351 2015 -n03134739 2015 -n03131967 2015 -n04409515 2015 -n03445777 2015 -n04118538 2015 -n03145719 2015 -n03742019 2015 -n02802426 2015 -n03267113 2015 -n03942813 2015 -n03482877 2015 -n02799071 2015 -n04039742 2015 -n02861147 2015 -n04540053 2015 -n03598930 2016 -n06785654 2016 -n03014440 2019 -n04579986 2019 -n03901750 2019 -n02802215 2022 -n03820318 2022 -n03278914 1905 -n03782006 1905 -n03781787 1905 -n04405762 1905 -n04401088 1905 -n03857828 1905 -n03916720 1905 -n02872529 1905 -n02979186 1905 -n02988304 1905 -n04060647 1905 -n02757462 1905 -n03656957 1905 -n03963294 1905 -n04405540 1905 -n03034405 1905 -n02979074 1905 -n02995345 1905 -n03775388 1905 -n04142731 1905 -n04392985 1905 -n03181293 1905 -n03777754 1905 -n03293741 1905 -n04392526 1905 -n02705944 1905 -n02992529 2058 -n04270371 2058 -n03179910 2058 -n03902125 2058 -n03488438 2058 -n03187595 2058 -n04044498 2058 -n04405907 2064 -n04043733 2064 -n04137773 2064 -n03516996 2088 -n03046921 2088 -n04077430 2065 -n03517760 2092 -n04315948 2092 -n03584254 2094 -n04546340 2094 -n03584400 2094 -n03436182 2094 -n02942349 2068 -n04404997 2068 -n03909160 1906 -n04026053 1906 -n04173511 1906 -n04070003 1906 -n03257586 1906 -n03509608 1906 -n04171208 1906 -n04450243 1906 -n04506506 1906 -n03434188 1906 -n03567066 1906 -n02923129 1906 -n03386544 2101 -n03046802 2101 -n03757604 2101 -n03927299 2105 -n03924679 2105 -n04608923 2105 -n03316105 2105 -n03767459 2105 -n03987990 2108 -n03084834 2108 -n03422072 2112 -n02855390 2112 -n02921029 2123 -n03425769 2123 -n03871524 1908 -n02852360 1908 -n04105704 1908 -n04408871 1830 -n04241573 1830 -n04402057 1830 -n03664943 1830 -n03605915 1830 -n03543012 2132 -n03196990 2132 -n03639497 2132 -n02840134 2133 -n04594218 2133 -n02999410 2133 -n03086868 2139 -n02790823 2139 -n03886641 2140 -n02709637 2140 -n03374838 2140 -n02835412 2140 -n04440963 2140 -n03011018 2140 -n03600977 2134 -n03093792 2134 -n03228967 2149 -n04573281 2149 -n03521076 2149 -n04144241 2149 -n04571958 2149 -n04160372 2149 -n03787523 2149 -n02928299 2153 -n04333869 2153 -n03213826 2150 -n04476972 2150 -n04593866 2150 -n02788689 1831 -n04451818 1831 -n04516672 1831 -n04116512 1831 -n03816136 1831 -n03294833 1831 -n04317420 1831 -n02908217 1831 -n03532342 1831 -n04185071 1831 -n04285622 1831 -n03653220 1831 -n04369282 1831 -n03346135 1831 -n03837422 1831 -n04317833 1831 -n03039947 1831 -n04100174 1831 -n04608567 1831 -n04208427 1831 -n04282872 2163 -n03396074 2163 -n02865931 2163 -n04112147 2163 -n04459909 2163 -n03659292 2163 -n04463679 2163 -n03487090 2163 -n03138344 2188 -n04317976 2188 -n03613592 2188 -n04393808 2188 -n03903424 2188 -n04099003 2188 -n03470629 2188 -n04264628 2193 -n02771004 2193 -n04193377 2193 -n04400737 2193 -n02670683 2195 -n04367011 2195 -n03489162 2164 -n03588951 2164 -n03919430 2164 -n03418242 2164 -n03967562 2164 -n03075097 2164 -n03239726 2164 -n03154446 2164 -n04387706 2164 -n03417970 2164 -n04050066 2164 -n04299963 2164 -n03684224 2204 -n03919289 2204 -n03970156 2204 -n03941684 2204 -n03966976 2204 -n04258859 2204 -n04266486 2204 -n03481172 2204 -n03946076 2204 -n04606574 2204 -n04154565 2204 -n04489817 2204 -n04140064 2204 -n03848348 2204 -n04150980 2204 -n04208210 2204 -n02898269 2204 -n04269944 2204 -n02966545 2223 -n03430313 2223 -n03715386 2223 -n03731695 2223 -n04457910 2225 -n03947466 2225 -n02680754 2225 -n03848168 2225 -n02697675 2225 -n02886434 2225 -n03474779 2228 -n03376938 2228 -n03488188 2228 -n04016240 2246 -n04016576 2246 -n03109150 2229 -n02877962 2229 -n02951585 2229 -n03511333 2207 -n03649909 2207 -n03995856 2253 -n04089976 2253 -n03995372 2210 -n03240140 2210 -n03154073 2211 -n04503593 2211 -n02844307 2211 -n02848216 2211 -n03624400 2211 -n02866386 2258 -n03030557 2258 -n03265032 2258 -n04148054 2265 -n03623556 2265 -n02764044 2265 -n04057047 2265 -n04594828 2265 -n03020692 2265 -n03954731 2265 -n04186848 2266 -n04250473 2273 -n04016684 2273 -n04163530 2273 -n02973904 2267 -n02880842 2267 -n03973628 2267 -n03041632 2267 -n03549473 2267 -n02976123 2267 -n03890093 2267 -n03658185 2267 -n04373089 2279 -n03911658 2279 -n02811468 2268 -n03498962 2268 -n04185804 2269 -n04332074 2269 -n04127521 2269 -n03067212 2271 -n04597400 2271 -n03601638 2272 -n04247630 2272 -n04283585 2272 -n03621049 2165 -n02997607 2165 -n03403643 2165 -n04103206 2297 -n04059516 2297 -n03724417 2297 -n03621377 2297 -n04293119 2297 -n03775199 2297 -n03101517 2297 -n03101986 2297 -n03454885 2297 -n03767966 2297 -n03266371 2305 -n04578934 2305 -n02850732 2305 -n03880531 2307 -n03133878 2307 -n02999138 2307 -n04270147 2307 -n03459328 2307 -n03284981 2307 -n04309548 2307 -n03101796 2307 -n03101156 2307 -n04500060 2307 -n03846677 2313 -n04317325 2313 -n03400231 2313 -n04097760 2313 -n04596742 2313 -n04138977 2313 -n03453231 2318 -n03047799 2318 -n03984234 2298 -n03262519 2298 -n04326676 2298 -n03992703 2298 -n04282992 2331 -n03018209 2331 -n02869155 2331 -n03713436 2332 -n03317788 2332 -n03625646 2167 -n03133050 2167 -n04546194 2169 -n03729826 2169 -n03053474 2169 -n03332271 2169 -n04277352 2169 -n04321453 2169 -n04296261 2169 -n03250847 2169 -n03715669 2169 -n02949202 2342 -n04374315 2342 -n02806379 2344 -n04381724 2344 -n04491388 2344 -n02698634 2348 -n03355925 2348 -n03141823 2348 -n03274265 2170 -n04453156 2170 -n04122349 2170 -n04156140 2170 -n03475581 2170 -n02902687 2170 -n04185946 2170 -n03908714 2172 -n04310904 2172 -n03145522 2173 -n04039381 2173 -n04292414 2369 -n04409806 2369 -n02772700 2369 -n04426316 2174 -n04333129 2174 -n03012013 2374 -n04072551 2374 -n03831382 2374 -n03651843 2374 -n04156946 2177 -n03873416 2177 -n02831894 2179 -n04150153 2179 -n03258905 2179 -n04292921 2179 -n02906734 2179 -n04367480 2179 -n04111190 2180 -n04549629 2180 -n04182322 2180 -n03949317 2180 -n03616428 2180 -n02764779 2180 -n03976657 2180 -n03351979 2180 -n03091044 2180 -n04434531 2180 -n03244231 2387 -n03127408 2387 -n04472563 2387 -n04277493 2387 -n02946824 2387 -n02871824 2393 -n04319937 2393 -n04230603 2393 -n03051396 2393 -n02931836 2393 -n04267577 2393 -n03726993 2393 -n03726760 2407 -n02883004 2407 -n04610676 2407 -n03775847 2409 -n04115996 2409 -n03711999 2409 -n03382856 2409 -n03374372 2394 -n04279353 2394 -n03908204 2181 -n03906997 2181 -n03518943 2181 -n03003091 2181 -n03128248 2181 -n03652100 2181 -n02783161 2419 -n04185529 2419 -n04033901 2419 -n03388183 2419 -n03326948 2419 -n03405725 1832 -n03842156 2429 -n03200906 2429 -n04550184 2429 -n02821943 2429 -n04379243 2429 -n04379964 2429 -n04549122 2429 -n03636649 2429 -n03201035 2429 -n04555400 2429 -n02912065 2429 -n02933112 2429 -n02766320 2429 -n02822579 2429 -n03649797 2429 -n03129753 2429 -n02870880 2429 -n03290653 2429 -n03298716 2429 -n04161981 2429 -n04165409 2429 -n03015254 2429 -n03337140 2430 -n04104147 2452 -n02963302 2452 -n04529681 2452 -n03050546 2432 -n02739550 2432 -n02818832 2433 -n02831724 2458 -n03962852 2458 -n03540914 2458 -n02920083 2458 -n04491638 2458 -n03388549 2458 -n03115762 2458 -n02920259 2458 -n04503413 2458 -n04236809 2458 -n04222210 2458 -n03482252 2458 -n03799876 2458 -n03225988 2458 -n03414676 2434 -n03465426 2434 -n04381587 2434 -n03116530 2434 -n02699629 2434 -n02894337 2434 -n04301000 2434 -n03090000 2434 -n03904060 2434 -n03620967 2434 -n03850492 2434 -n04398951 2434 -n03653583 2434 -n04603729 2434 -n03428226 2434 -n03238586 2434 -n03179701 2434 -n03246933 2434 -n03063968 2434 -n04480033 2434 -n03092883 2434 -n03011741 2476 -n02789487 2476 -n03735963 2476 -n04061681 2476 -n04130143 2495 -n04247736 2495 -n03231368 2486 -n03630262 2486 -n04608329 2489 -n04164868 2489 -n03164722 2489 -n03201208 2435 -n03202354 2505 -n04067921 2505 -n03367059 2437 -n04380533 2437 -n04057981 2437 -n03237340 2441 -n03018349 2441 -n03742115 2441 -n02804414 2442 -n03131574 2442 -n02970534 2442 -n03125729 2442 -n03001627 2449 -n04447861 2449 -n04326896 2449 -n04256520 2449 -n03858418 2449 -n02828884 2449 -n03649674 2518 -n03002711 2518 -n04099969 2518 -n04373704 2518 -n04429376 2518 -n04331277 2518 -n03632729 2518 -n03518445 2518 -n02738535 2518 -n04590933 2518 -n03376595 2518 -n04576002 2518 -n03790953 2518 -n02791124 2518 -n03262932 2532 -n04062428 2532 -n03786621 2532 -n04593077 2532 -n03168217 2534 -n02946270 2534 -n03801880 2520 -n04382438 2520 -n03380724 2520 -n04177755 2521 -n03165096 2521 -n03100346 2521 -n03693474 2521 -n03015149 2549 -n04344873 2549 -n03891251 2523 -n03360622 2523 -n03920867 2523 -n04177820 2523 -n04590021 2523 -n03016953 2451 -n03518305 2451 -n02843553 1833 -n03508101 1833 -n03666591 1833 -n06791372 1833 -n03099945 1833 -n03141702 1833 -n03243218 1833 -n03626760 1833 -n03904909 1833 -n03800933 1833 -n04200537 1833 -n04198797 1833 -n03699975 1833 -n03088707 1833 -n02776205 1833 -n04294212 1833 -n03339643 1833 -n03738472 1833 -n02676261 1833 -n04474466 1833 -n03008976 1833 -n02688443 1833 -n04114844 1833 -n03929660 1833 -n03287351 1833 -n03320046 1833 -n03553019 1833 -n03175604 1833 -n02678897 1833 -n04461879 1833 -n04359589 1833 -n03851341 1833 -n04331639 1833 -n04450749 1833 -n03923918 1833 -n03574816 1833 -n03074855 1833 -n04074963 1833 -n03302790 1833 -n03075768 1833 -n04554406 1833 -n04210120 1833 -n04562262 1833 -n02855089 1833 -n04526964 1833 -n02895606 1833 -n02730265 1833 -n04226826 1833 -n03467796 1833 -n04081844 1833 -n03614007 1833 -n03269401 1833 -n02729965 1833 -n03345837 1833 -n03111899 1833 -n04069276 1833 -n02694426 1833 -n03277771 1833 -n04252331 1833 -n03525827 1833 -n03744840 1833 -n03613294 1833 -n03827536 1833 -n04263760 1833 -n03568117 1833 -n03180969 1833 -n02895438 1833 -n03565288 1833 -n02683558 1833 -n03537241 1833 -n03267972 1833 -n04228054 1833 -n03664675 1833 -n04258333 2561 -n03272239 2561 -n04041069 2561 -n03423479 2561 -n03099147 2561 -n04265275 2561 -n04330267 2561 -n03031422 2562 -n03728437 2562 -n07273802 2563 -n06793231 2563 -n06794110 2563 -n06874185 2563 -n03269203 2564 -n02981321 2564 -n03582959 2646 -n04375405 2646 -n03307792 2566 -n02988963 2566 -n03580518 2566 -n04338517 2569 -n03279153 2569 -n03614532 2569 -n04586932 2569 -n02803349 2569 -n03915437 2569 -n03254862 2653 -n03025886 2653 -n02787622 2653 -n04615226 2653 -n04132603 2653 -n03467517 2653 -n02880546 2653 -n04224842 2653 -n03698360 2660 -n03716887 2660 -n03716966 2660 -n03495258 2660 -n02676566 2664 -n03499907 2664 -n04506289 2664 -n03272010 2664 -n04536153 2665 -n04536866 2665 -n02992211 2665 -n04536335 2665 -n04536595 2665 -n04330998 2665 -n04419642 2654 -n03273551 2654 -n04376400 2654 -n03928116 2655 -n03039015 2655 -n03854065 2655 -n02672831 2655 -n03452741 2684 -n04515003 2684 -n04278353 2684 -n03738066 2684 -n02766792 2688 -n03086457 2688 -n03496296 2685 -n04278247 2685 -n03840681 2656 -n04598582 2656 -n02891788 2656 -n03854815 2656 -n03393324 2656 -n04579667 2656 -n03945615 2656 -n03609397 2656 -n03372029 2697 -n02817799 2697 -n03228016 2705 -n04222847 2705 -n02804610 2706 -n03838899 2706 -n03037709 2707 -n04141076 2707 -n02793089 2698 -n02912894 2698 -n03369276 2698 -n03394916 2698 -n04487394 2698 -n03110669 2698 -n03494537 2700 -n03494278 2700 -n03086670 2700 -n03006626 2702 -n03884397 2702 -n02775483 2702 -n03343354 2702 -n03912218 2702 -n03245724 2702 -n02803934 2657 -n02804252 2657 -n02804123 2657 -n03301568 2657 -n03483230 2658 -n02869249 2658 -n03447721 2658 -n04532831 2658 -n04311174 2658 -n03721384 2658 -n03440682 2658 -n03017168 2658 -n03612965 2658 -n03720891 2658 -n03249569 2658 -n03157348 2658 -n02869737 2741 -n02803666 2741 -n04387400 2741 -n04249415 2741 -n04410086 2741 -n04243941 2572 -n03996416 2572 -n03999992 2572 -n02769290 2572 -n04004475 2572 -n03702248 2572 -n03789946 2572 -n04252653 2572 -n02977058 2572 -n03322940 2572 -n03082979 2572 -n04613939 2572 -n03765561 2572 -n04303357 2572 -n03997484 2572 -n03087069 2572 -n04303497 2572 -n04237423 2572 -n04417180 2572 -n04064401 2572 -n02938886 2572 -n04525305 2748 -n04243546 2748 -n02760199 2748 -n03418915 2750 -n02829596 2750 -n03551395 2750 -n04024274 2750 -n03007591 2752 -n03563200 2752 -n04004767 2752 -n03250405 2752 -n03672827 2752 -n03643737 2752 -n03675235 2752 -n04419868 2752 -n03985069 2776 -n04505036 2776 -n02794664 2777 -n04595285 2777 -n03225777 2778 -n02909285 2788 -n03571942 2788 -n04184435 2753 -n03240892 2753 -n03460040 2753 -n03646296 2791 -n03766044 2791 -n03287733 2754 -n03273061 2754 -n03507963 2796 -n03596285 2796 -n02761557 2796 -n02687423 2796 -n03433877 2796 -n04309049 2798 -n03579982 2798 -n04591517 2804 -n03424630 2804 -n03193107 2804 -n03859000 2804 -n04040373 2804 -n04099175 2799 -n03321103 2799 -n02872333 2810 -n04265904 2810 -n02700064 2802 -n04587404 2802 -n04304375 2797 -n03616763 2797 -n03146846 2757 -n03500699 2757 -n03075634 2757 -n04428191 2757 -n03496892 2757 -n03210245 2818 -n03496612 2818 -n04238763 2758 -n06359193 2758 -n03528523 2758 -n04175147 2758 -n03196324 2758 -n04358117 2829 -n04603399 2829 -n03918480 2829 -n03985232 2832 -n03180011 2832 -n03832673 2833 -n03956785 2833 -n03642806 2833 -n03485407 2833 -n03914337 2760 -n04561422 2760 -n03736064 2760 -n03063485 2760 -n04477219 2760 -n04587559 2760 -n03272125 2762 -n03996145 2762 -n02911332 2762 -n03034663 2846 -n03000684 2846 -n04380916 2846 -n04121728 2846 -n02786837 2846 -n04279462 2766 -n03689157 2766 -n03604156 2767 -n03452267 2767 -n02666196 2768 -n02679257 2768 -n03483823 2768 -n04171831 2573 -n04594489 2573 -n03106898 2573 -n03510244 2573 -n02934168 2573 -n03760310 2860 -n04471632 2860 -n03666362 2860 -n03020034 2860 -n03336575 2861 -n03604843 2861 -n04402984 2861 -n03898129 2861 -n04401828 2861 -n03995265 2862 -n03307037 2862 -n03300443 2864 -n03268918 2864 -n04004990 2864 -n03995535 2864 -n03350602 2574 -n03373237 2880 -n03251932 2881 -n04573937 2881 -n04334365 2881 -n03861271 2575 -n04520784 2575 -n04332243 2576 -n02688273 2576 -n03843555 2576 -n04216634 2887 -n04398834 2887 -n03066849 2887 -n03407865 2577 -n02710201 2577 -n04040759 2577 -n03736970 2577 -n04110955 2577 -n04112430 2577 -n02969010 2577 -n03096960 2577 -n03996849 2577 -n02761392 2577 -n02677718 2577 -n03102859 2577 -n03431243 2577 -n04392764 2577 -n03339529 2577 -n04289027 2896 -n04011827 2896 -n02709367 2896 -n03446268 2896 -n04568069 2896 -n03700963 2896 -n04167346 2896 -n04021798 2896 -n03432129 2896 -n04088797 2896 -n02918595 2896 -n03532672 2896 -n04228215 2896 -n03119510 2896 -n04063154 2896 -n04371774 2896 -n04590746 2896 -n04586581 2896 -n04586421 2896 -n03189083 2896 -n04211528 2896 -n03296081 2896 -n02903204 2896 -n03150232 2896 -n04282494 2896 -n03082807 2896 -n02686227 2896 -n02962200 2896 -n03198500 2896 -n02973017 2896 -n04475411 2896 -n03431745 2896 -n04306592 2896 -n02692086 2909 -n04154152 2909 -n04020298 2913 -n04574999 2913 -n03559999 2913 -n03659809 2913 -n03566329 2913 -n03767203 2944 -n04563204 2944 -n04101701 2944 -n02836035 2944 -n02980036 2944 -n03460147 2944 -n04115144 2944 -n03334912 2944 -n04543772 2944 -n04563413 2944 -n02974003 2944 -n04289690 2944 -n03944341 2944 -n03992509 2944 -n03430551 2944 -n03244919 2944 -n03874293 2944 -n04113194 2944 -n04290507 2962 -n02833793 2962 -n03943115 2962 -n04051549 2947 -n02764505 2947 -n04154340 2947 -n03456299 2915 -n03425413 2915 -n02835724 2915 -n04354487 2915 -n03487886 2915 -n02995871 2915 -n03329302 2917 -n04102406 2917 -n02966193 2917 -n04510706 2921 -n03054901 2921 -n03393761 2982 -n03209359 2982 -n02860415 2926 -n04067472 2926 -n04211857 2926 -n02848523 2897 -n03473227 2897 -n03032811 2897 -n04111668 2897 -n03873699 2988 -n03563460 2988 -n03320421 2988 -n03208556 2990 -n04019541 2995 -n02890188 2995 -n04448361 2995 -n03397947 2995 -n03954393 2995 -n04385799 2991 -n03712111 2991 -n04519153 2900 -n04313503 2900 -n03450018 2900 -n03602883 2900 -n04072193 2900 -n04372370 2900 -n02783459 3003 -n02927887 3003 -n04438507 3005 -n03374649 3005 -n03325088 3007 -n04422875 3007 -n02727141 3007 -n03775636 3013 -n04327682 3013 -n04445952 3008 -n04027023 3008 -n03186818 3008 -n03537412 3019 -n03793850 3019 -n03222516 3019 -n02826589 3019 -n03363549 2903 -n03795758 2903 -n03469493 2903 -n03103396 2904 -n03301833 2904 -n02686379 2904 -n03432061 2905 -n03389611 2905 -n04579432 2578 -n04218564 2578 -n03743279 2578 -n03506560 2578 -n02824448 2578 -n03123917 3037 -n03028596 3037 -n03201529 3037 -n04275548 2579 -n03794056 2579 -n03680858 2579 -n04568557 2579 -n03819994 2579 -n03639077 3045 -n03352628 3045 -n04529962 2581 -n04283255 2581 -n04283096 2581 -n04112252 2581 -n03357716 2581 -n04117464 2581 -n03536122 2581 -n04592741 2581 -n03303217 2585 -n03271574 2585 -n02887079 2587 -n03176386 2587 -n02768114 2590 -n04320973 2590 -n03933933 2590 -n03934042 2590 -n02767433 2590 -n04190052 2590 -n03638883 2590 -n02783994 2590 -n04283378 2590 -n02797692 2590 -n04314914 2590 -n02887209 2590 -n03938401 2590 -n02817031 2590 -n04098513 2590 -n03057920 2590 -n03495570 2590 -n04081044 2590 -n02888569 2590 -n04386051 2590 -n02871005 2590 -n04341414 2590 -n03506184 2590 -n04161358 2590 -n04430475 2590 -n03490884 2590 -n04038440 2590 -n03495039 2590 -n02953455 3064 -n03632577 3064 -n02871439 3065 -n03719343 3065 -n03814639 3071 -n03622839 3071 -n02713003 3071 -n02768655 3071 -n02737660 3077 -n03505133 3077 -n03019685 3077 -n02741475 3077 -n04148579 3078 -n03105467 3078 -n04190376 3078 -n04220036 3081 -n04094720 3081 -n04515129 3081 -n02886599 3081 -n04476831 3081 -n02815950 3081 -n04590263 3103 -n03223686 3103 -n04318787 3105 -n03592773 3105 -n03073977 3105 -n03988170 3105 -n04360798 3113 -n02974348 3113 -n03443149 3114 -n03821518 3114 -n02864593 3114 -n03637181 3114 -n04402449 3114 -n03733131 3114 -n04436329 3114 -n04119751 3106 -n04433585 3106 -n04045644 3108 -n03437941 3108 -n04436185 3108 -n03366974 3108 -n03601840 3108 -n02970685 3083 -n03937931 3083 -n03955489 3083 -n04123740 3083 -n03002096 3083 -n02835915 3083 -n02910145 3083 -n02770830 3083 -n04325041 3134 -n03288886 3134 -n04485082 3086 -n04275175 3086 -n03704549 3086 -n03801760 3086 -n02943871 3141 -n03262809 3141 -n02759257 2591 -n04009801 2591 -n03340723 2591 -n03643253 2591 -n03656484 2591 -n03838298 3151 -n03087366 3151 -n02943241 3151 -n02709101 3151 -n03094159 3151 -n04355933 3151 -n03309465 3151 -n03333711 3151 -n03395859 3151 -n03987376 3154 -n03049782 3154 -n04403413 3154 -n04583212 3154 -n03967396 2595 -n04147495 2595 -n03733925 2595 -n04565375 2595 -n03467068 2595 -n03231160 2595 -n02708711 2595 -n03813176 2595 -n03852280 2595 -n03739693 2595 -n03575958 2595 -n02981911 2595 -n03308152 2595 -n04419073 2595 -n04089836 2595 -n04383015 2595 -n03070193 3166 -n03760944 3166 -n02670382 3166 -n04340521 3166 -n03709206 3166 -n03092656 3166 -n04403638 3185 -n03760671 3185 -n02751295 3187 -n03293863 3187 -n03852688 3189 -n04044716 3189 -n04070207 3191 -n03333129 3191 -n04068601 3191 -n02978478 3195 -n03822767 3195 -n04145863 3195 -n03715114 3195 -n03279508 3188 -n03332989 3188 -n03667829 3188 -n02841506 3202 -n03484931 3202 -n03850053 3202 -n03082280 3202 -n03692522 3202 -n03868643 3167 -n03247083 3167 -n04070415 3167 -n04053508 3167 -n02794156 3167 -n03904782 3167 -n04421872 3167 -n02751215 3167 -n03735637 3167 -n03429288 3167 -n04437953 3167 -n02710600 3167 -n02939866 3167 -n03991837 3167 -n04382880 3167 -n04141975 3167 -n04392113 3167 -n03753077 3167 -n03554460 3167 -n04180888 3167 -n04118776 3167 -n02699915 3167 -n04029734 3214 -n03736470 3214 -n04559730 3217 -n04518343 3217 -n02710429 3217 -n03424862 3217 -n04001499 3217 -n03718335 3236 -n04274985 3236 -n02753394 3218 -n03046257 3218 -n04555897 3218 -n04355338 3218 -n04438304 3218 -n03544143 3218 -n03452594 3240 -n03196217 3240 -n02694662 3240 -n04548280 3240 -n02708093 3240 -n03909406 3240 -n03145147 3240 -n03197337 3241 -n02708433 3241 -n03973839 3241 -n04607869 3241 -n04328186 3243 -n03891332 3243 -n03026907 3243 -n04528968 3220 -n03759661 3220 -n02777100 3223 -n02708555 3261 -n03277459 3261 -n03272810 3225 -n03841143 3225 -n02702989 3225 -n04273796 3225 -n03842986 3225 -n04561287 3225 -n04541320 3225 -n03708843 3225 -n04449966 3168 -n03467984 3168 -n02879718 3168 -n02880393 3168 -n02892948 3168 -n03624134 3168 -n04373894 3168 -n04346157 3168 -n04008634 3168 -n02715712 3273 -n03343853 3273 -n04177041 3273 -n02689274 3273 -n03423306 3273 -n03875955 3273 -n02950826 3273 -n02759963 3282 -n03948459 3282 -n04502851 3282 -n03732020 3282 -n03803116 3282 -n04090263 3282 -n04076284 3282 -n04171459 3288 -n02760429 3288 -n03416775 3295 -n03695857 3295 -n04171629 3295 -n02760855 3296 -n02749479 3296 -n02760658 3296 -n03701391 3296 -n04347519 3303 -n02923682 3304 -n04517211 3304 -n03607659 3304 -n04450133 3304 -n03073296 3289 -n03178674 3289 -n04086273 3289 -n03427202 3289 -n03363749 3292 -n03802007 3292 -n04250224 3293 -n04585980 3293 -n02961451 3293 -n03136369 3274 -n03687928 3274 -n03615790 3277 -n02812949 3277 -n03699591 3277 -n03158885 3277 -n04054361 3278 -n03327691 3278 -n02904640 3278 -n02987492 3278 -n04121511 3325 -n03292475 3325 -n03375575 3325 -n02916350 3280 -n02950943 3280 -n03080633 3170 -n04015908 3170 -n02745611 3172 -n03178000 3172 -n03706229 3172 -n03080497 3172 -n02841315 3173 -n04272054 3173 -n04009552 3173 -n04403925 3173 -n03443912 3340 -n04356056 3340 -n04238617 3341 -n03399761 3341 -n03795976 3341 -n03864692 3341 -n03555662 3174 -n02963503 3174 -n04376876 3174 -n04317175 3174 -n03643149 3174 -n03858183 3174 -n04364545 3174 -n04083800 3355 -n03514451 3355 -n03938037 3175 -n04056180 3175 -n03302671 2598 -n04477387 2598 -n04080833 2605 -n04251144 2605 -n03868863 2605 -n02731629 2605 -n03876231 2606 -n04287747 2606 -n02889646 2609 -n03484576 2609 -n03323703 2609 -n04162706 2609 -n03652932 2609 -n04125853 2609 -n02891188 2609 -n03803284 2609 -n02999936 2609 -n02865665 3370 -n02910353 3370 -n03627232 3370 -n03041114 3370 -n03051249 3370 -n02982599 3370 -n03940256 3370 -n03229244 3370 -n04153751 3370 -n04238321 3370 -n02928608 3370 -n04159354 3370 -n03887185 3370 -n03682487 3370 -n04431745 3370 -n03683606 3370 -n03038281 3370 -n03043958 3370 -n02960690 3370 -n03804744 3370 -n04445327 3370 -n03836451 3370 -n02881906 3379 -n02880189 3379 -n03644858 3382 -n03497352 3382 -n04095342 3383 -n03476313 3383 -n04227900 3383 -n03499354 3383 -n02903126 3383 -n02860640 3383 -n02796318 3383 -n04127249 3383 -n04197781 3387 -n03057541 3387 -n04554871 3388 -n03423719 3388 -n03503477 3414 -n03855604 3414 -n03874599 3390 -n04136800 3390 -n03645011 3390 -n03075370 3390 -n03223162 3390 -n03886762 3394 -n02915904 3394 -n03476684 3394 -n03551084 3374 -n03208938 3425 -n03250089 3425 -n04505470 2610 -n04036303 2610 -n03085013 2610 -n03928814 2610 -n03033362 2611 -n04168199 2611 -n03589513 2611 -n03098140 2611 -n04401949 2611 -n03034244 2611 -n03968293 2611 -n03275681 2611 -n03163222 2611 -n04470953 2611 -n04257986 2611 -n02715229 2611 -n02955247 2611 -n04269270 2611 -n04072960 2611 -n04364160 2611 -n04257790 2611 -n02810471 2611 -n04414675 2611 -n03048883 3432 -n04595855 3432 -n03084420 3432 -n03577090 3453 -n03778817 3453 -n04004210 3453 -n03578656 3453 -n03125057 3456 -n03033986 3456 -n03788047 3441 -n03274561 3441 -n03261776 3461 -n03759954 3461 -n03691459 3461 -n04402580 3462 -n03505667 3462 -n03087816 3463 -n02963692 3463 -n04502670 3464 -n02917377 3464 -n04390873 3464 -n04599124 3464 -n04349401 3464 -n03846772 3443 -n03204955 3443 -n04041747 3474 -n04404817 3474 -n03207305 3475 -n04142999 3475 -n04610274 3475 -n04540547 3449 -n03359285 3481 -n03651388 3481 -n03870980 2614 -n04013729 2614 -n04258138 2615 -n03773035 2615 -n03485198 3487 -n02965783 3487 -n04059947 3489 -n03861842 3489 -n02921756 2616 -n02761834 2616 -n04201064 2616 -n03343737 2616 -n04058594 2617 -n04143140 2617 -n04494204 2617 -n03211117 2617 -n03918737 2617 -n03221351 2617 -n04464615 2617 -n03793489 2617 -n02714751 2617 -n03506727 2617 -n02823124 2617 -n04484432 3498 -n03913343 3498 -n03085219 3499 -n03782190 3499 -n04152593 3499 -n03196598 3499 -n03676759 3499 -n03361380 3499 -n04588739 3499 -n03187268 3499 -n02940570 3499 -n03085602 3511 -n02769075 3511 -n02988066 2619 -n03027250 2619 -n03070059 2619 -n03525454 2619 -n04538552 2619 -n02948557 3523 -n03031152 3523 -n02947818 3525 -n03746005 3527 -n03746155 3527 -n02935017 2620 -n03851787 2620 -n03706653 2620 -n03744276 2620 -n03708036 2620 -n04063868 2620 -n02763306 2620 -n03079230 3531 -n04533946 3531 -n02988679 3537 -n02988486 3537 -n02757061 3537 -n03492542 3532 -n03209910 3532 -n03359436 3533 -n04052757 3533 -n04534359 3534 -n02979399 3534 -n04391838 3535 -n03924069 3535 -n03694639 3549 -n04178190 3549 -n03636248 2623 -n03665366 2623 -n03358172 3552 -n03640988 3552 -n02948072 3552 -n03818343 3552 -n04534895 3552 -n04384910 3552 -n03423877 3552 -n03844045 3552 -n03549897 3552 -n03370387 3552 -n04335886 3552 -n04286575 3552 -n03272383 3552 -n03590841 3555 -n03018712 3555 -n03359137 3566 -n03665924 3566 -n03911767 3566 -n03503997 3553 -n04107743 3553 -n04339879 3553 -n03318294 3553 -n04148703 3553 -n04160847 3553 -n03824713 3553 -n02852173 3553 -n04456115 3553 -n03365374 3553 -n03401129 2624 -n03442597 2624 -n03187037 2624 -n04529108 2624 -n03975232 2624 -n03668279 3586 -n03482523 3586 -n04371050 3588 -n03772584 3588 -n04164757 3588 -n03544238 3588 -n04288272 2630 -n04116098 2630 -n03066359 3593 -n02886321 3593 -n03525074 2632 -n04585745 2632 -n03281145 2632 -n03126707 2632 -n04575824 2632 -n03178430 2632 -n03733281 1835 -n03078287 1835 -n03820728 1835 -n03440216 1835 -n04080138 1835 -n03302938 1835 -n03738241 1835 -n03085915 1835 -n04141712 1835 -n04082886 1835 -n04545858 3604 -n04041544 3604 -n04400289 3604 -n04402746 3604 -n03578055 3604 -n03580845 3604 -n04404412 3615 -n04137897 3619 -n04365328 3619 -n03072201 3619 -n03681477 3605 -n04358491 3605 -n03300216 3623 -n04595028 3623 -n04008385 3609 -n03674440 3609 -n04366116 3609 -n03401279 3609 -n03957315 1836 -n04488202 1836 -n04555700 1836 -n03206908 1836 -n02893692 1836 -n03210683 1836 -n03991062 1836 -n02920658 1836 -n04074185 1836 -n03147509 1836 -n02774152 1836 -n02978881 1836 -n03256032 1836 -n02773037 1836 -n03733805 1836 -n03438257 1836 -n03875806 1836 -n03733644 1836 -n03291819 1836 -n04183329 1836 -n03935335 1836 -n02801938 1836 -n04179712 1836 -n04139859 1836 -n03994614 1836 -n02946921 1836 -n04576211 1836 -n04600312 1836 -n02839910 1836 -n02949542 1836 -n03779370 1836 -n02964843 1836 -n04533700 1836 -n02975212 1836 -n02974697 1836 -n04531098 1836 -n03233905 1836 -n04060904 1836 -n03871083 1836 -n04560292 1836 -n02883344 1836 -n03062336 3634 -n03920288 3634 -n03456024 3634 -n04176190 3634 -n04499062 3634 -n04350581 3634 -n02880940 3634 -n02978753 3634 -n04050933 3634 -n02927764 3634 -n04130257 3678 -n03775546 3678 -n03984759 3678 -n02997910 3678 -n04263257 3678 -n04023695 3678 -n04103769 3636 -n02682922 3636 -n04254120 3636 -n02754103 3636 -n03571280 3636 -n03174731 3640 -n02815749 3640 -n03629520 3640 -n03063073 3640 -n03002948 3640 -n04397452 3640 -n03216710 3640 -n03301940 3641 -n04207343 3641 -n03055418 3641 -n04083309 3641 -n02769748 3644 -n04122685 3644 -n02816656 3644 -n04134008 3644 -n02970408 3644 -n03883524 3644 -n03253886 3644 -n02870676 3644 -n04452528 3644 -n03709823 3644 -n04026417 3644 -n03235796 3644 -n03291963 3644 -n04124098 3644 -n04122825 3644 -n03993180 3644 -n04204081 3644 -n04446844 3644 -n03414029 3644 -n03619793 3644 -n03958227 3644 -n03445617 3644 -n04235860 3644 -n03469903 3644 -n03461288 3644 -n04284572 3719 -n03972524 3719 -n04544450 3719 -n03321563 3719 -n03521899 3730 -n03898395 3730 -n03372549 3646 -n04496872 3646 -n04559910 3646 -n02918831 3646 -n03676623 3646 -n04249882 3646 -n04206225 3646 -n02823750 3646 -n04119360 3646 -n03443371 3646 -n04592099 3646 -n03062245 3650 -n04131690 3650 -n03914438 3650 -n03883385 3652 -n03050864 3652 -n03482405 3652 -n02893608 3652 -n04204238 3652 -n04582349 3652 -n03764736 3656 -n02823510 3656 -n04255586 3656 -n03904433 3657 -n02946509 3657 -n04103364 3657 -n03791053 3657 -n04170037 3657 -n04509417 3657 -n04543158 3657 -n02804515 3657 -n03484083 3657 -n02766534 3657 -n02834778 3657 -n03538634 3657 -n04467099 3657 -n02959942 3657 -n04482393 3657 -n02740533 3762 -n04065272 3762 -n04464852 3762 -n04252077 3762 -n02916179 3762 -n03684823 3762 -n04335435 3762 -n03791235 3762 -n04465501 3762 -n03384352 3762 -n02740300 3773 -n02739889 3773 -n03256788 3774 -n02946348 3774 -n04520382 3774 -n04211219 3778 -n03193597 3778 -n03272562 3778 -n04389854 3778 -n04465358 3778 -n04310018 3778 -n03193260 3789 -n03193423 3789 -n03506880 3780 -n04490091 3780 -n02704792 3780 -n03389761 3780 -n03790512 3780 -n03444034 3780 -n02958343 3780 -n04252225 3780 -n03345487 3797 -n04520170 3797 -n04467665 3797 -n04474035 3797 -n03417042 3797 -n03632852 3797 -n04461696 3797 -n03256166 3797 -n04465666 3797 -n03930630 3797 -n03173929 3805 -n03796401 3805 -n03896419 3805 -n03977966 3805 -n02871314 3805 -n04466871 3800 -n03785016 3800 -n02814533 3802 -n03680512 3802 -n03777568 3802 -n03268790 3802 -n03770679 3802 -n03100240 3802 -n03079136 3802 -n02930766 3802 -n04201733 3802 -n04037443 3802 -n03498781 3802 -n04097373 3802 -n02831335 3802 -n04285965 3802 -n04166281 3802 -n03594945 3802 -n03670208 3802 -n03141065 3802 -n02701002 3802 -n04516354 3802 -n04322801 3802 -n04347119 3802 -n03870105 3802 -n03543394 3802 -n04285008 3802 -n03119396 3802 -n03122295 3764 -n02970849 3764 -n03538406 3848 -n03255899 3848 -n03599486 3848 -n03981924 3848 -n03868242 3848 -n04397027 3766 -n03648431 3766 -n04176068 3766 -n02797295 3766 -n04204347 3766 -n03490119 3766 -n02835271 3768 -n04126066 3768 -n04026813 3768 -n03792782 3768 -n02968473 3769 -n03435991 3864 -n02912557 3864 -n04297098 3864 -n03389889 3864 -n02775039 3771 -n03393912 3771 -n03895866 3771 -n02932523 3771 -n02885108 3870 -n04389521 3870 -n03828020 3871 -n04020912 3871 -n03200357 3871 -n04246855 3871 -n04065789 3659 -n02747177 3659 -n03678558 3659 -n04134523 3661 -n03935116 3661 -n02900705 3665 -n03078995 3665 -n03210372 3665 -n03619650 3665 -n04548362 3665 -n02962843 3665 -n03986355 3665 -n03214582 3665 -n03031012 3665 -n04200000 3665 -n03468821 3665 -n02755140 3665 -n03683995 3665 -n04608435 3665 -n04556533 3665 -n02774630 3665 -n03438863 3665 -n03487533 3899 -n04137217 3899 -n02773838 3899 -n04491769 3899 -n03498441 3899 -n03420345 3903 -n04570815 3903 -n02967294 3903 -n03986949 3903 -n03865371 3903 -n04518764 3903 -n02863750 3666 -n03355768 3666 -n02881193 3666 -n03633091 3666 -n02876657 3666 -n02877266 3666 -n03990474 3666 -n03950228 3666 -n02808440 3666 -n03786901 3666 -n02909870 3666 -n03241496 3666 -n03129001 3666 -n04591887 3666 -n04001265 3666 -n04493381 3666 -n03572321 3666 -n04438897 3666 -n02801525 3666 -n03784270 3666 -n02758960 3666 -n03029445 3666 -n02795169 3666 -n04388743 3666 -n03593526 3666 -n02993368 3666 -n04447028 3914 -n03350204 3914 -n04149083 3915 -n04263336 3915 -n04246060 3916 -n03983396 3916 -n04557648 3916 -n03603722 3916 -n02985963 3916 -n03449451 3916 -n03937543 3916 -n02962061 3916 -n03359566 3916 -n02823428 3916 -n03571625 3916 -n03174450 3916 -n04579056 3916 -n03140431 3916 -n04591713 3916 -n02960903 3916 -n03923379 3916 -n04579145 3945 -n04560804 3945 -n03521675 3950 -n03295246 3950 -n04422727 3950 -n02952374 3950 -n04518132 3950 -n03709363 3956 -n03595409 3956 -n04139140 3918 -n04398044 3918 -n03259401 3918 -n04516214 3918 -n04324297 3918 -n03612814 3918 -n02939185 3918 -n03915118 3918 -n04397768 3918 -n03063689 3918 -n03064250 3971 -n04132985 3971 -n04399158 3971 -n04225031 3920 -n03543603 3920 -n03379343 3920 -n03797390 3923 -n03693707 3923 -n04389430 3923 -n03063599 3984 -n04443766 3984 -n02824058 3984 -n02836174 3930 -n02843158 3930 -n04553703 3930 -n02788572 3930 -n02823335 3934 -n04592005 3934 -n03610418 3934 -n03426134 3935 -n04560113 3935 -n04173046 3935 -n02732072 3935 -n04078574 3935 -n04562935 4001 -n04049303 4001 -n02951703 3936 -n02705429 3936 -n03101664 3936 -n02815834 3936 -n04516116 3936 -n03725600 3936 -n04522168 3936 -n03133415 3936 -n03593122 3936 -n03960374 3668 -n04476259 3668 -n02982515 3668 -n03259009 3668 -n03004275 3668 -n04131929 3668 -n03416900 3668 -n03565830 3668 -n03543735 3668 -n03858085 3668 -n04255163 3668 -n02747802 3668 -n03871628 3669 -n02919414 3669 -n03167978 3669 -n02778456 4026 -n03500389 4026 -n03870672 4026 -n02782681 3671 -n02971356 3671 -n03064758 3671 -n04200258 3671 -n04253057 3671 -n03908618 3671 -n03127925 3671 -n02786331 3671 -n04589325 3671 -n03014705 3671 -n04340750 3671 -n02998003 3671 -n03710193 3671 -n02978055 3671 -n02836392 3671 -n03871724 3671 -n04452615 4040 -n04462011 4040 -n03064350 4040 -n03535024 4040 -n04477548 4040 -n02989099 4040 -n02977438 4041 -n04125257 4041 -n02976939 4041 -n04125021 4041 -n04469813 1837 -n03002341 1837 -n04214282 1837 -n04019101 1837 -n04172342 1837 -n03538179 1837 -n04524313 1837 -n04231693 1837 -n04103918 1837 -n04467307 1837 -n04196502 1837 -n03678362 1837 -n03306385 4060 -n04212165 4060 -n04468005 4060 -n02924116 4060 -n03680942 4060 -n03394272 4071 -n03896233 4071 -n04349306 4071 -n03711044 4071 -n03394480 4071 -n03078802 4075 -n02917067 4075 -n04487081 4072 -n03769881 4072 -n04146614 4072 -n04310157 4063 -n02918964 4063 -n04099429 4063 -n03764276 4063 -n03773504 4063 -n03125870 4063 -n04235291 4063 -n03478589 4087 -n04389033 4087 -n03886053 4087 -n03919096 4087 -n03549199 4087 -n02686568 4089 -n04530566 4089 -n04264914 4089 -n03547229 4089 -n03510583 4096 -n04308084 4096 -n03666917 4096 -n03491032 4100 -n03439814 4100 -n03512147 4100 -n04552348 4100 -n02691156 4100 -n02759387 4100 -n02867715 4107 -n02704645 4107 -n04012084 4107 -n02690373 4107 -n02842573 4107 -n03365231 4107 -n03595860 4107 -n03335030 4107 -n04308273 4107 -n04160586 4107 -n02686121 4112 -n04583620 4112 -n03604311 4115 -n03596543 4115 -n04308397 4116 -n03577672 4116 -n02692877 4102 -n02850950 4102 -n02782093 4102 -n03541923 4102 -n02858304 4097 -n04476116 4097 -n04610013 4097 -n04194289 4097 -n04128837 4097 -n02792409 4097 -n03662601 4129 -n03977592 4129 -n03447447 4129 -n04158807 4129 -n02792552 4129 -n04095210 4129 -n04495843 4129 -n04024983 4129 -n03939178 4129 -n04244997 4129 -n03329663 4129 -n04409128 4129 -n02947660 4129 -n03344393 4129 -n03790230 4129 -n03236423 4139 -n03981566 4139 -n03545470 4139 -n04229480 4144 -n02951358 4144 -n03199901 4144 -n04037964 4144 -n03105306 4144 -n04612504 4144 -n03436891 4144 -n03602081 4144 -n04115456 4144 -n03609235 4154 -n03861430 4154 -n03254374 4154 -n04038231 4156 -n04038338 4156 -n04273569 4149 -n03859170 4149 -n02932891 4149 -n03552749 4149 -n04197110 4132 -n04606251 4132 -n03896103 4132 -n03947888 4132 -n03668488 4132 -n03541269 4132 -n04309348 4132 -n02965300 4132 -n04224543 4132 -n04552696 4132 -n03673027 4173 -n03698604 4181 -n02965216 4181 -n03141327 4181 -n03874138 4177 -n04317063 4177 -n02878222 4178 -n03095699 4178 -n02784124 4178 -n03845190 4178 -n04347754 4180 -n03466493 4180 -n03397266 4180 -n02812201 4180 -n03466600 4180 -n02687172 4180 -n03718212 4180 -n03180504 4180 -n02755529 4191 -n03811295 4191 -n04612373 4133 -n03045228 4133 -n03327133 4133 -n04242408 4133 -n03612010 4133 -n03186285 4133 -n04128499 4133 -n02793199 4133 -n04147183 4133 -n04587327 4133 -n04483307 4207 -n02981792 4207 -n02982416 4207 -n04266014 4098 -n04264765 4098 -n03218198 4090 -n02860847 4090 -n02861022 4090 -n04336792 4068 -n03122202 4068 -n06271778 1838 -n06255081 1838 -n06263609 1838 -n06276697 4221 -n06272290 4221 -n06276501 4221 -n06277280 4224 -n06281040 4224 -n06277135 4224 -n06278338 4227 -n06278475 4227 -n06274760 4225 -n06272803 4225 -n06272612 4225 -n06263369 4223 -n06266417 4223 -n06595351 4235 -n06267145 4235 -n06596607 4237 -n06596727 4237 -n06596364 4237 -n06596474 4237 -n06267893 4238 -n06267564 4238 -n06267655 4238 -n06266633 4236 -n06267991 4236 -n03938244 1055 -n03872495 1055 -n04135315 4249 -n02823964 4249 -n03408444 4249 -n02967626 4249 -n04053677 1056 -n04151940 1056 -n04453910 1056 -n03380867 1056 -n04014297 1056 -n03045698 1056 -n04605726 1056 -n04513827 1056 -n03050026 1056 -n03724870 1056 -n03341153 1056 -n03366823 1056 -n03058107 1056 -n02952237 1056 -n03357376 1056 -n03221059 1056 -n03376279 1056 -n03956623 1056 -n03261603 1056 -n02944459 4255 -n04201297 4255 -n02954938 4256 -n03717622 4256 -n03661340 4256 -n04041243 4275 -n02877765 4275 -n03825788 4275 -n03047690 4257 -n04199027 4257 -n02735538 4257 -n02872752 4257 -n03361550 4257 -n04241394 4257 -n03865949 4257 -n04122578 4282 -n04239786 4282 -n03027625 4282 -n04124370 4282 -n04272389 4282 -n02904927 4282 -n04593524 4282 -n04545748 4282 -n02855701 4282 -n02713364 4282 -n03041449 4282 -n03411079 4282 -n03680355 4282 -n04120489 4282 -n03868406 4282 -n02882894 4282 -n03967270 4282 -n04022332 4282 -n04133789 4282 -n03025250 4282 -n04027706 4306 -n04386664 4306 -n03364008 4306 -n03297103 4306 -n03600475 4284 -n02925666 4284 -n04228581 4284 -n03521544 4284 -n04089666 4284 -n04116294 4284 -n03516844 4284 -n04542715 4284 -n03124043 4284 -n03798061 4286 -n02873733 4286 -n03067518 4258 -n03046133 4258 -n04554211 4258 -n04444749 4258 -n03797896 4258 -n04192858 4258 -n02888270 4258 -n04151581 4258 -n04187233 4258 -n02826068 4258 -n04181718 4258 -n04191943 4258 -n04281375 4258 -n04416005 4258 -n04105068 4258 -n03314608 4258 -n03530910 4258 -n04187061 4258 -n02955065 4258 -n03725035 4258 -n03315644 4258 -n03142679 4258 -n02937958 4258 -n02739668 4258 -n02840245 4258 -n02840619 4258 -n03546766 4258 -n02851099 4258 -n03673767 4258 -n03959701 4328 -n03539433 4352 -n02740764 4352 -n02895154 4354 -n03513376 4354 -n02950632 4354 -n03623338 4354 -n03929855 4356 -n04130907 4356 -n04589890 4330 -n03347037 4330 -n04590553 4330 -n03788365 4330 -n03637318 4333 -n03889871 4333 -n03652729 4334 -n02825657 4334 -n04172776 4334 -n02843684 4334 -n02951843 4334 -n03610524 4334 -n02763901 4371 -n04507155 4371 -n03415252 4371 -n03409591 4337 -n04357121 4337 -n03718789 4337 -n03220513 4337 -n03522100 4337 -n04435653 4337 -n03546235 4337 -n04523525 4337 -n04234887 4337 -n03413684 4337 -n04417672 4337 -n03148727 4379 -n03435593 4379 -n03847471 4379 -n02796207 4383 -n04087709 4383 -n03527444 4340 -n04141327 4340 -n04207763 4340 -n03548086 4341 -n04423845 4341 -n03213538 4341 -n03657121 4341 -n03424325 4342 -n03314378 4342 -n04229816 4400 -n02983189 4400 -n02862048 4346 -n04192698 4346 -n03000247 4403 -n02916936 4403 -n03112719 4403 -n03146219 4403 -n02933340 4349 -n04045255 4349 -n02873520 4349 -n04589190 4350 -n03592669 4350 -n03151077 4350 -n04211356 4350 -n04525584 4412 -n04590129 4412 -n04102285 4412 -n04418357 4414 -n04209239 4414 -n02925107 4351 -n02890513 4351 -n03436549 4260 -n03291741 4260 -n02992368 4260 -n07248320 4260 -n03590306 4260 -n03958752 4260 -n04207151 4262 -n03885293 4262 -n03654576 4262 -n02767665 4262 -n03114379 4262 -n02785648 4262 -n02876084 4262 -n04240752 4262 -n02820210 4262 -n04236377 4262 -n02851939 4262 -n03309356 4262 -n04231272 4262 -n04162433 4262 -n02786058 4434 -n04369025 4434 -n02979836 4434 -n03267821 4434 -n04033995 4437 -n02683323 4437 -n02849154 4437 -n02822220 4437 -n03731483 4437 -n03898633 4447 -n03266749 4447 -n03128427 4447 -n03123553 4450 -n04034262 4450 -n04046400 4438 -n03688405 4438 -n04118021 4265 -n03223299 4265 -n03727837 4265 -n04144539 4459 -n04183217 4459 -n03998194 4459 -n02904233 4459 -n04297847 4459 -n04066270 4459 -n02908773 4459 -n03353951 4266 -n03445326 4266 -n04528079 4266 -n03875218 4266 -n03805725 4266 -n03437430 4266 -n03115897 4266 -n03284743 4266 -n04525417 4266 -n03342015 4472 -n03284886 4472 -n03285578 4472 -n03844233 4472 -n04557308 4472 -n03646020 4482 -n04581102 4482 -n03261019 4268 -n03973402 4268 -n03642444 4268 -n04450994 4268 -n04084889 4268 -n04412097 4268 -n03337383 4270 -n03729308 4270 -n03970546 1057 -n03802393 1057 -n04395024 1057 -n04525038 1057 -n02809105 1057 -n03615406 1057 -n02828427 1057 -n04123567 1057 -n03188725 1057 -n04539794 1057 -n03253796 1057 -n03013850 1057 -n03115400 1057 -n04459610 1057 -n03132666 1057 -n03885194 1057 -n03019938 1057 -n03326795 1057 -n03115180 1057 -n04525191 1057 -n04138261 1057 -n03625355 1057 -n04137355 1057 -n04003856 1057 -n03356982 1057 -n04568841 1057 -n03409297 1057 -n02944579 1057 -n04605163 1057 -n02977330 1057 -n04395106 1057 -n03779128 1057 -n02904803 1057 -n04524941 1057 -n04198453 1057 -n02878425 1057 -n03703862 1057 -n03819595 1057 -n03877351 1057 -n04613015 1057 -n03914831 1057 -n03932670 1057 -n03785237 1057 -n04414476 1057 -n04056932 1057 -n02675219 1057 -n03106722 1057 -n03917814 1057 -n03016868 1057 -n02922798 1057 -n04432662 1057 -n02802990 1057 -n03631177 1057 -n04189282 1057 -n03435743 1057 -n03983612 1057 -n03175189 1057 -n03357267 1057 -n04184316 1057 -n02942460 1057 -n03836906 1057 -n03233123 1057 -n03430091 1057 -n03855214 1057 -n03386726 1057 -n03437741 1057 -n04599235 1057 -n04350458 1057 -n04383839 1057 -n03653110 1057 -n04502502 1057 -n03854421 1057 -n02952109 1057 -n03298858 1057 -n03160740 1057 -n03843438 1057 -n04393549 1057 -n02903852 1057 -n03947798 1057 -n03529444 1057 -n04482297 4514 -n03227317 4514 -n03595523 4514 -n03429914 4530 -n04496614 4530 -n03016609 4530 -n03485794 4534 -n03463666 4534 -n03258330 4534 -n03207743 4534 -n04459362 4534 -n02786198 4534 -n03471190 4534 -n02834397 4534 -n04127904 4534 -n03897943 4534 -n03490006 4583 -n03887697 4583 -n03207835 4583 -n03381776 4587 -n03383099 4587 -n04278447 4587 -n03505383 4587 -n04455652 4587 -n03712337 4587 -n02782602 4587 -n03598151 4592 -n03775747 4592 -n03410571 4592 -n03696568 4592 -n04307767 4592 -n03645577 4592 -n03358380 4588 -n04208065 4588 -n03809603 4539 -n02820556 4539 -n03703730 4545 -n03938522 4545 -n04045397 1059 -n03663531 1059 -n03662719 4612 -n03703945 4612 -n03662887 4612 -n04326084 1060 -n02897820 1060 -n14943580 1060 -n14785065 1060 -n15074568 1060 -n14820180 1060 -n04035912 1060 -n03766935 4616 -n04313628 4616 -n03530511 4616 -n03460297 4616 -n03149686 4616 -n03455488 4616 -n03344642 4617 -n03796522 4617 -n03043693 4617 -n02681392 4617 -n04339638 4618 -n15102455 4618 -n04234455 4633 -n03341297 4633 -n04453390 4633 -n14908027 4620 -n14976759 4620 -n03111177 1061 -n03282401 1061 -n03451798 1061 -n03292603 1061 -n03815149 1061 -n03723267 1061 -n02892304 1061 -n07621618 1061 -n02732572 1061 -n03178782 1061 -n02681518 1061 -n03397087 1061 -n03635108 1061 -n04395651 4649 -n03762602 4649 -n03282591 4649 -n06883725 4649 -n03516367 4649 -n04682462 4649 -n03354903 4655 -n02788021 4655 -n04458633 4655 -n03140292 4655 -n03362890 4655 -n05244934 4658 -n11487732 4658 -n03597469 4650 -n03397532 4650 -n03649161 4650 -n03914106 4650 -n02787435 4650 -n03030262 4650 -n02685082 4650 -n02887970 4666 -n02852043 4666 -n03909020 4666 -n03814906 4666 -n03436075 1062 -n03899328 1062 -n04096066 1062 -n03895293 1062 -n04215402 4678 -n04461570 4678 -n03904183 4678 -n03519981 4679 -n02969323 4679 -n04426618 4679 -n04466613 4679 -n03215508 4684 -n03306610 4684 -n02744323 4684 -n02762508 4689 -n02758863 4689 -n04335209 4686 -n04334599 4686 -n03948242 4687 -n03539678 4687 -n02680512 4680 -n03089014 4680 -n03895585 4680 -n04493505 4698 -n04244379 4698 -n04250850 4698 -n04562496 4698 -n02984469 4700 -n02795528 4700 -n03944672 4700 -n03533014 4700 -n04385536 4706 -n03231912 4706 -n03147280 4709 -n04257684 4709 -n04497962 4699 -n04298661 4699 -n03415749 4699 -n02981024 4712 -n04048441 4712 -n04391569 1063 -n02784218 1063 -n03572107 4717 -n02680337 4717 -n03957420 4720 -n02992795 4720 -n03506028 4718 -n03438071 4718 -n04440749 4718 -n02739427 4718 -n04040247 4725 -n02971167 4725 -n04381994 1064 -n04087432 1064 -n03153375 4729 -n03438661 4729 -n03527149 4729 -n03963198 4729 -n04284002 4731 -n04380346 4731 -n03383948 4731 -n04284438 4731 -n04263502 4735 -n04398688 4735 -n04350769 4735 -n04597913 4735 -n03557270 4735 -n04381073 4735 -n03180384 4735 -n02976249 4736 -n02928049 4736 -n04307986 4736 -n04380255 4737 -n02973805 4737 -n02687992 1065 -n04406817 1065 -n02693246 1065 -n02692232 1065 -n03745146 1065 -n04329190 1065 -n04306080 1065 -n04551055 4756 -n03452449 4756 -n03131669 4756 -n03768916 1066 -n03214253 1066 -n03587205 4762 -n03406966 4762 -n03093574 1067 -n03672352 1067 -n03051540 4765 -n02729837 4765 -n03655720 4767 -n03456186 4767 -n02855925 4767 -n03825080 4767 -n04015204 4767 -n03859495 4767 -n03815482 4767 -n03625943 4767 -n03692379 4767 -n02728440 4767 -n03068998 4767 -n03763968 4767 -n03502509 4767 -n03877472 4767 -n03419014 4767 -n02742322 4767 -n04596852 4767 -n03863108 4767 -n03441112 4767 -n02671780 4767 -n02846141 4767 -n03381126 4767 -n02756098 4767 -n04059157 4767 -n02814774 4767 -n03746330 4767 -n04335693 4767 -n04241249 4767 -n04194127 4773 -n03863262 4773 -n04001845 4773 -n02738859 4773 -n03386870 4773 -n03216402 4773 -n02730930 4773 -n04207903 4773 -n03121897 4773 -n03015478 4773 -n03268645 4773 -n04266375 4773 -n03623198 4773 -n03450516 4774 -n04532106 4810 -n03010795 4810 -n02669723 4810 -n02811719 4780 -n03324928 4780 -n03239259 4780 -n03615563 4780 -n03513137 4781 -n03531281 4781 -n04498389 4781 -n03497657 4781 -n02954340 4781 -n03124474 4781 -n04432203 4781 -n03379051 4818 -n03492922 4818 -n03127747 4818 -n04356595 4821 -n03404360 4821 -n03124170 4821 -n02817516 4821 -n02859184 4821 -n04248507 4821 -n03325941 4821 -n02987379 4821 -n04259630 4821 -n04482177 4821 -n02818135 4821 -n03984643 4821 -n02869837 4821 -n03950899 4821 -n02881757 4821 -n03766322 4821 -n03046029 4843 -n03937835 4843 -n02799323 4822 -n03103563 4822 -n04209133 4822 -n03610682 4822 -n02776825 4822 -n03331077 4822 -n04387095 4822 -n02831237 4822 -n04232153 4822 -n03049924 4822 -n04228693 4822 -n04556408 4822 -n02807133 4822 -n03787032 4822 -n04612026 4854 -n02816768 4854 -n03502331 4783 -n04143897 4783 -n04104770 4783 -n03188531 4783 -n04605572 4783 -n04097866 4783 -n04574067 4783 -n03655072 4783 -n04230808 4783 -n04508163 4783 -n04172904 4783 -n04531873 4783 -n04197391 4783 -n03863923 4783 -n03540090 4783 -n02922578 4783 -n04488530 4783 -n04489008 4783 -n04332580 4783 -n03404149 4783 -n03816005 4783 -n04370774 4783 -n03657511 4783 -n04371563 4783 -n03487642 4783 -n04046277 4783 -n04350905 4783 -n04370048 4783 -n03450734 4783 -n03314884 4862 -n03826039 4862 -n02998841 4862 -n03719743 4863 -n03797182 4863 -n03505504 4863 -n04495698 4863 -n03325584 4863 -n04325704 4863 -n03520493 4896 -n03615655 4896 -n03237992 4867 -n03617480 4867 -n02667093 4867 -n02807616 4867 -n03410938 4869 -n04269822 4869 -n03866082 4870 -n03454442 4870 -n03770439 4870 -n03617312 4870 -n03732458 4870 -n02780815 4870 -n03205669 4870 -n04136333 4870 -n03534580 4870 -n03920737 4871 -n02892767 4871 -n03387323 4871 -n04223299 4871 -n03421324 4871 -n03132776 4871 -n04508949 4871 -n02863014 4871 -n02944146 4871 -n04514241 4871 -n03013580 4871 -n04508489 4871 -n03112869 4919 -n03885788 4919 -n04103665 4919 -n03673450 4923 -n03688192 4923 -n02930214 4923 -n04509171 4932 -n03824381 4932 -n02854739 4928 -n04426427 4928 -n02837887 4928 -n02901114 4928 -n03885028 4928 -n03234164 4928 -n04602956 4874 -n03629231 4874 -n03595614 4874 -n03163381 4874 -n03978966 4874 -n03057021 4875 -n03045337 4875 -n04252560 4875 -n04363777 4948 -n03254046 4948 -n04187970 4948 -n03398228 4948 -n03630383 4948 -n03456665 4948 -n03589791 4948 -n04049405 4948 -n02957008 4948 -n04123448 4948 -n03404251 4948 -n03751269 4957 -n04222307 4957 -n02867966 4957 -n03902756 4957 -n04368496 4957 -n03228254 4957 -n02864504 4957 -n03891051 4957 -n03844815 4958 -n04479046 4958 -n03770954 4961 -n04122492 4961 -n03980874 4949 -n04445154 4949 -n04445040 4949 -n03607923 4949 -n04173907 4949 -n04497570 4949 -n04186455 4949 -n02936402 4949 -n04205318 4879 -n03877674 4879 -n04370288 4879 -n04132158 4879 -n02896442 4879 -n03019434 4879 -n04233715 4879 -n03600285 4879 -n03903733 4879 -n03688605 4879 -n03594734 4879 -n03107488 4879 -n03660124 4879 -n04337287 4879 -n02825442 4879 -n02910864 4879 -n03543112 4982 -n02831595 4982 -n03653833 4982 -n03815615 4882 -n03128085 4882 -n02865351 5001 -n04591157 5001 -n02883205 5001 -n02847631 5001 -n03710721 4885 -n04371430 4885 -n02837789 4885 -n03226538 4888 -n03943920 4888 -n04222470 4888 -n03885669 4888 -n02925519 4888 -n04427715 5014 -n04504141 5014 -n04502197 4889 -n02963159 4889 -n04370456 4889 -n04021028 4889 -n04453666 4785 -n03464053 4785 -n02944075 4785 -n03236735 4785 -n02861387 5021 -n02854926 5021 -n03480579 5021 -n03062015 5024 -n04136161 5024 -n02936570 5024 -n04355511 5024 -n03013438 5024 -n04334105 5024 -n03450230 5024 -n03604400 5024 -n03205574 5024 -n02898585 5034 -n04397645 5034 -n02781121 5034 -n03429682 4787 -n03775071 4787 -n03616979 4787 -n02827606 4788 -n03405595 4788 -n03781683 5043 -n03527565 5043 -n02972397 5043 -n03540267 4790 -n04434932 5048 -n04254777 5048 -n04323819 5048 -n03885904 5049 -n03710637 5049 -n02752496 5050 -n04378956 5050 -n03622931 5050 -n02736798 5050 -n03836976 5051 -n03026506 5051 -n03384891 4791 -n03289985 4791 -n03859958 4791 -n02726017 4791 -n03113657 4791 -n03320519 4791 -n03113835 4791 -n03398153 4791 -n04285803 4791 -n02669534 4791 -n03206718 4791 -n03476083 4791 -n03201776 5060 -n02780704 5060 -n03201638 5060 -n03239054 5060 -n02683454 5071 -n04459018 5071 -n04584207 5071 -n03237416 4794 -n02887489 4794 -n02752615 4794 -n03528263 4768 -n03251766 4768 -n04517823 5082 -n03584829 5082 -n04488857 5082 -n03150511 5082 -n04580493 5082 -n04179913 5082 -n04174101 5082 -n03620052 5082 -n03534776 5082 -n04475631 5085 -n04309833 5085 -n03207941 5088 -n04070727 5088 -n04554684 5088 -n03102654 5096 -n03273913 5096 -n03557590 5099 -n03170635 5099 -n04442312 5091 -n03761084 5091 -n04442441 5091 -n03063338 5091 -n03543254 5091 -n04542943 5091 -n03212114 5091 -n03297495 5091 -n04330340 5091 -n03862676 5091 -n03378174 5091 -n03557692 5091 -n03102371 5110 -n03273740 5110 -n03425595 5110 -n04003241 5110 -n02905036 5111 -n04111531 5111 -n03259280 5111 -n03425241 5111 -n03483316 5083 -n03050655 5083 -n04277826 5123 -n04496726 5123 -n04607242 5123 -n02808304 4766 -n03219010 4766 -n04499446 4766 -n02821030 4766 -n03938725 5130 -n04188179 5130 -n04439712 1068 -n03971218 1068 -n03223553 1068 -n02856463 1068 -n03250279 1068 -n03882058 1068 -n03635668 1068 -n02846511 1068 -n04251791 5136 -n04189816 5136 -n02731900 5136 -n04225987 5136 -n04214046 5136 -n04149813 5136 -n04543996 5138 -n03502200 5138 -n03005285 1069 -n03969259 1069 -n04254009 1069 -n04446521 5150 -n04208936 5150 -n04559451 5150 -n03371875 5152 -n03993053 5152 -n04108268 1071 -n03106110 1071 -n03644378 5157 -n02919890 5157 -n04290079 5157 -n03107046 5157 -n04426788 5158 -n02874537 5158 -n04581829 5158 -n03641569 5158 -n03367545 5163 -n04598965 5163 -n04605321 5163 -n00004475 1042 -n00006484 1042 -n12739332 5170 -n00017222 5170 -n00015388 5170 -n01326291 5170 -n11537327 5170 -n00007846 5170 -n12992868 5170 -n00005787 5170 -n12172906 5173 -n13083586 5173 -n13123431 5173 -n11536673 5173 -n11552806 5173 -n13083023 5173 -n13100156 5173 -n12476510 5181 -n11545524 5181 -n11552386 5181 -n13121544 5181 -n12205694 5181 -n13100677 5181 -n13103136 5181 -n13085113 5181 -n13084834 5181 -n13134302 5181 -n13084184 5181 -n12477163 5187 -n12477583 5187 -n12477747 5187 -n12480895 5187 -n12479537 5187 -n12481458 5187 -n11547562 5188 -n11545714 5188 -n13221529 5204 -n13220122 5204 -n13223265 5206 -n13223588 5208 -n13223710 5208 -n12953206 5205 -n13194572 5205 -n13205058 5205 -n12961879 5205 -n12953484 5205 -n13186654 5205 -n13197274 5205 -n13173882 5205 -n13229543 5205 -n13192625 5205 -n13185269 5205 -n13193642 5205 -n13207335 5205 -n13183056 5205 -n13200651 5205 -n13195341 5205 -n13206817 5205 -n13199970 5205 -n12957924 5205 -n13198914 5205 -n13199717 5205 -n13215586 5216 -n13190747 5216 -n13193856 5222 -n13194036 5222 -n11665372 5189 -n11596108 5189 -n12694486 5236 -n11666854 5236 -n11669921 5236 -n11672400 5236 -n12606438 5240 -n12799776 5240 -n11736694 5240 -n12008487 5240 -n11955896 5240 -n12879527 5240 -n12884260 5240 -n12034141 5240 -n12290748 5240 -n12026476 5240 -n12833149 5240 -n11892817 5240 -n12914923 5240 -n11969607 5240 -n11794024 5240 -n12026018 5240 -n11672269 5240 -n12830222 5240 -n11811473 5240 -n12022054 5240 -n11971406 5240 -n11826198 5240 -n12950314 5240 -n11857875 5240 -n11988596 5240 -n11939699 5240 -n11915214 5240 -n11821184 5240 -n12293723 5240 -n11814584 5240 -n11725015 5240 -n12890265 5240 -n11733312 5240 -n11859472 5240 -n11971248 5240 -n11888800 5240 -n11971927 5240 -n12898774 5240 -n11810358 5240 -n11904109 5240 -n11943407 5240 -n11978233 5240 -n12683407 5240 -n12950126 5240 -n11726707 5240 -n11813077 5240 -n11889619 5240 -n11905749 5240 -n11812910 5240 -n11900569 5240 -n12020184 5240 -n11960245 5240 -n11859737 5240 -n12909421 5240 -n12041446 5240 -n12909917 5240 -n11992806 5240 -n11807979 5240 -n11925303 5240 -n11971783 5240 -n11939491 5240 -n11918473 5240 -n11989869 5240 -n11727091 5240 -n11793779 5240 -n11891175 5240 -n11792341 5240 -n11839568 5240 -n11943660 5240 -n11947802 5240 -n12475242 5240 -n11815491 5240 -n12480456 5240 -n11839823 5240 -n11732567 5240 -n12475035 5240 -n12360108 5240 -n12833985 5240 -n11941924 5240 -n11883328 5240 -n11719286 5240 -n11736851 5240 -n11887119 5240 -n12001707 5240 -n11950345 5240 -n11892637 5240 -n11805956 5240 -n11892029 5240 -n11806219 5240 -n12008252 5240 -n11918286 5240 -n11962272 5240 -n12093600 5240 -n12836862 5240 -n12093329 5240 -n11733054 5240 -n12020507 5240 -n11931918 5240 -n11958080 5240 -n12877838 5240 -n11812094 5260 -n11811706 5260 -n11923174 5268 -n12023726 5268 -n12023407 5268 -n11923637 5268 -n11990313 5268 -n11915899 5268 -n12030908 5268 -n12015221 5268 -n11990167 5268 -n11981192 5349 -n11980318 5349 -n11972759 5349 -n11921395 5349 -n12294124 5270 -n12295796 5270 -n12294723 5270 -n12294331 5270 -n12294871 5270 -n12296432 5270 -n12295033 5270 -n11726269 5272 -n11725821 5272 -n11725973 5272 -n12891305 5273 -n12891643 5273 -n11978713 5283 -n11979527 5283 -n11978961 5283 -n11979715 5283 -n12683571 5284 -n12683791 5284 -n11901759 5291 -n11908549 5291 -n11901294 5291 -n11903671 5291 -n11901977 5291 -n11902389 5291 -n11908846 5291 -n11901597 5291 -n11905392 5291 -n11902200 5291 -n11906917 5291 -n12044467 5296 -n12052787 5296 -n12056217 5296 -n12075830 5296 -n12055516 5296 -n12083113 5296 -n12047884 5296 -n12048056 5296 -n12080820 5296 -n12070381 5296 -n12061380 5296 -n12080395 5296 -n12061614 5296 -n12074408 5296 -n12070583 5296 -n12071744 5296 -n12049282 5296 -n12047345 5296 -n12064389 5296 -n12075010 5296 -n12052447 5296 -n12053405 5296 -n12050533 5296 -n12077944 5296 -n12086539 5296 -n12064591 5296 -n12058822 5296 -n12046028 5296 -n12083591 5296 -n12073991 5296 -n12043444 5296 -n12086012 5296 -n12073554 5296 -n12046815 5296 -n12063639 5296 -n12058630 5296 -n12084890 5296 -n12070016 5296 -n12076223 5296 -n12069679 5296 -n12048399 5296 -n12049562 5296 -n12076577 5296 -n12086192 5296 -n12074867 5296 -n12075299 5296 -n12072722 5296 -n12066018 5296 -n12084555 5296 -n12070712 5296 -n12079963 5296 -n12065316 5296 -n12059314 5296 -n12085664 5296 -n12050959 5296 -n12062468 5296 -n12085267 5296 -n12078172 5296 -n12057211 5388 -n12057447 5388 -n12056758 5388 -n12056601 5388 -n12043836 5416 -n12043673 5416 -n12067193 5437 -n12066630 5437 -n12062781 5441 -n12062626 5441 -n11808299 5299 -n11808721 5299 -n11808932 5299 -n11808468 5299 -n11809594 5299 -n11809094 5299 -n11727358 5305 -n11727738 5305 -n11727540 5305 -n11816649 5313 -n11816336 5313 -n11816829 5313 -n11816121 5313 -n11815918 5313 -n11815721 5313 -n12362274 5318 -n12362668 5318 -n12361946 5318 -n11950877 5326 -n11950686 5326 -n11961100 5326 -n12020736 5338 -n12020941 5338 -n11934616 5339 -n11933546 5339 -n11934807 5339 -n12879963 5241 -n12015959 5241 -n11836722 5241 -n11860555 5241 -n12258885 5241 -n11980682 5241 -n12016567 5241 -n11737534 5241 -n11965627 5241 -n11991263 5241 -n11989393 5241 -n12006766 5241 -n12887293 5241 -n12937130 5241 -n12291959 5241 -n11972291 5241 -n11927215 5241 -n12012111 5241 -n11970586 5241 -n11963932 5241 -n11966215 5488 -n11966083 5488 -n12006930 5491 -n12007196 5491 -n11600372 5237 -n11599324 5237 -n11603246 5504 -n11602873 5504 -n11603835 5504 -n11601333 5504 -n12484784 5190 -n12610328 5190 -n11791569 5190 -n11714853 5190 -n13122364 5190 -n11715430 5513 -n11715678 5513 -n12801781 5514 -n11728099 5514 -n11786131 5514 -n12150028 5514 -n12801520 5514 -n11789066 5514 -n11792742 5514 -n12152532 5520 -n12151615 5520 -n12152722 5520 -n11733548 5191 -n11720353 5191 -n12810595 5191 -n12342299 5191 -n13238375 5191 -n12867826 5191 -n12665048 5191 -n11973341 5191 -n12312728 5191 -n11818069 5191 -n12848499 5191 -n11779300 5191 -n12822955 5191 -n12816508 5191 -n12719684 5191 -n12350758 5191 -n12095020 5191 -n11861641 5191 -n11962667 5191 -n12870891 5191 -n12939282 5191 -n12812478 5191 -n12031927 5191 -n12023108 5191 -n12858150 5191 -n12861892 5191 -n12841007 5191 -n12212361 5191 -n12869061 5191 -n12906214 5191 -n12910285 5191 -n12486574 5191 -n12090890 5191 -n12702948 5191 -n12437513 5191 -n11968931 5191 -n11817914 5191 -n11772408 5191 -n12932173 5191 -n12817694 5191 -n11910460 5191 -n12603449 5191 -n12939874 5191 -n12002428 5191 -n12015525 5191 -n11807108 5191 -n12835331 5191 -n12168565 5191 -n12840362 5191 -n12352287 5191 -n11969166 5191 -n11968704 5191 -n12821895 5191 -n12344283 5191 -n11866248 5191 -n11995092 5191 -n12622875 5191 -n11735053 5191 -n12548280 5191 -n13150894 5191 -n12685431 5191 -n12387633 5191 -n12171966 5191 -n12796022 5191 -n12934036 5191 -n12443323 5191 -n12870535 5191 -n12682668 5191 -n12778605 5191 -n12623077 5191 -n12836212 5191 -n11982115 5191 -n12003696 5191 -n12005656 5191 -n12098403 5191 -n12606545 5191 -n11902709 5191 -n12882945 5191 -n12785889 5191 -n11986511 5191 -n12682411 5191 -n12469517 5191 -n12029635 5191 -n12860365 5191 -n12552309 5191 -n11977303 5191 -n11825351 5191 -n12836337 5191 -n12844939 5191 -n12925179 5191 -n11926833 5191 -n12604228 5191 -n11752578 5191 -n12855042 5191 -n11956850 5191 -n12092262 5191 -n12506991 5191 -n12882779 5191 -n11747468 5191 -n12385429 5191 -n12822115 5191 -n12821505 5191 -n12607456 5191 -n12819728 5191 -n12817464 5191 -n12811027 5191 -n12024445 5191 -n12573474 5191 -n12864545 5191 -n11949402 5191 -n11868814 5191 -n11953038 5191 -n12599435 5191 -n12840749 5191 -n13233727 5191 -n12342498 5191 -n12795555 5191 -n11984542 5191 -n12847008 5191 -n12719944 5191 -n11855274 5191 -n12095647 5191 -n12441183 5191 -n12942572 5191 -n12602980 5191 -n12684379 5191 -n12441390 5191 -n12785724 5191 -n11916696 5191 -n12574320 5191 -n12092417 5191 -n12036939 5191 -n11700058 5191 -n12845413 5191 -n11824146 5191 -n11910271 5191 -n11916467 5191 -n11807525 5191 -n12101870 5191 -n11939180 5191 -n12353754 5191 -n12104501 5191 -n12794985 5191 -n12355760 5191 -n12793015 5191 -n12932966 5191 -n12931542 5191 -n12889713 5191 -n12849061 5191 -n11722466 5528 -n11720643 5528 -n12665857 5533 -n12665271 5533 -n11785668 5538 -n11780148 5538 -n11784497 5538 -n11782036 5538 -n11786539 5538 -n11782761 5538 -n12858871 5551 -n12858397 5551 -n11959632 5554 -n11959862 5554 -n12911673 5557 -n12911440 5557 -n12091213 5559 -n12091550 5559 -n12091377 5559 -n12091953 5559 -n12703557 5560 -n12703190 5560 -n12703383 5560 -n12437930 5561 -n12437769 5561 -n12352639 5576 -n12352844 5576 -n12352990 5576 -n12344700 5580 -n12344483 5580 -n12687957 5587 -n12685831 5587 -n12687698 5587 -n12687462 5587 -n12686274 5707 -n12686077 5707 -n12687044 5707 -n12686676 5707 -n12388989 5588 -n12388143 5588 -n12387839 5588 -n12388858 5716 -n12390099 5716 -n12389501 5716 -n12390314 5716 -n12782915 5595 -n12779603 5595 -n12781940 5595 -n12782530 5595 -n11753700 5619 -n11753355 5619 -n11753143 5619 -n12856680 5620 -n12855494 5620 -n12540250 5625 -n12515711 5625 -n12575322 5625 -n12575812 5625 -n12556307 5625 -n12539306 5625 -n12557681 5734 -n12558425 5734 -n12866162 5635 -n12865824 5635 -n12865037 5635 -n12866635 5635 -n12865562 5635 -n12866002 5635 -n11879054 5637 -n11878283 5637 -n11875691 5637 -n11876634 5637 -n11877193 5637 -n11876803 5637 -n11876432 5637 -n11870418 5637 -n11875938 5637 -n11894327 5637 -n11881742 5637 -n11870747 5637 -n11896722 5745 -n11879722 5745 -n11895092 5753 -n11894770 5753 -n11882074 5754 -n11882426 5754 -n13235503 5641 -n13234678 5641 -n12039317 5658 -n12037691 5658 -n12038406 5658 -n12038585 5658 -n12148757 5665 -n12102133 5665 -n12121610 5769 -n12139575 5769 -n12113195 5769 -n12112918 5769 -n12116429 5769 -n12141495 5769 -n12133462 5769 -n12108871 5769 -n12104238 5769 -n12141167 5769 -n12115180 5769 -n12112008 5769 -n12128071 5769 -n12146311 5769 -n12124627 5769 -n12110778 5769 -n12129134 5769 -n12134025 5775 -n12145477 5775 -n12142085 5775 -n12135898 5775 -n12137120 5790 -n12127030 5790 -n12127768 5792 -n12127460 5792 -n12356023 5670 -n12357485 5670 -n12793494 5671 -n12794135 5671 -n12849279 5675 -n12849416 5675 -n12847374 5192 -n12517642 5192 -n11731659 5192 -n12813189 5192 -n11838916 5192 -n12517445 5192 -n12513172 5192 -n12823859 5192 -n12566954 5192 -n13148208 5192 -n12158798 5192 -n12485981 5192 -n13237188 5192 -n12826516 5192 -n13120211 5192 -n12580654 5192 -n11769621 5192 -n12824053 5192 -n11769803 5192 -n12383402 5192 -n12823717 5192 -n12157769 5192 -n13144794 5192 -n12371439 5192 -n12159055 5811 -n12160490 5811 -n12158443 5811 -n12160303 5825 -n12159388 5825 -n12160857 5826 -n12161969 5826 -n12827270 5814 -n12828791 5814 -n12827537 5814 -n11788727 5815 -n11789589 5815 -n12571781 5815 -n11792029 5815 -n12384839 5820 -n12384227 5820 -n12384037 5820 -n12164363 5822 -n12166128 5822 -n12165170 5842 -n12164881 5842 -n12164656 5842 -n13146583 5823 -n13145040 5823 -n12509476 5193 -n13112664 5193 -n13104059 5193 -n12655869 5193 -n12546183 5193 -n12671651 5850 -n12215579 5850 -n12901724 5850 -n12938193 5850 -n12680864 5850 -n12329260 5850 -n12924623 5850 -n12659356 5850 -n12788201 5850 -n12343480 5850 -n13142504 5850 -n11830906 5850 -n12504783 5850 -n12659539 5850 -n12214789 5850 -n11699442 5850 -n12217453 5850 -n12574866 5850 -n12374418 5850 -n12249542 5850 -n13118707 5850 -n12215022 5850 -n12342852 5850 -n12762896 5850 -n12306717 5850 -n11769176 5850 -n12805146 5850 -n12519089 5850 -n11754893 5850 -n12772908 5850 -n12624381 5850 -n12482031 5850 -n12243109 5850 -n12223764 5850 -n12170585 5850 -n12230794 5850 -n12791329 5850 -n12674120 5850 -n12917901 5850 -n12237486 5850 -n12185859 5850 -n12681893 5850 -n12905412 5850 -n12899537 5850 -n12899752 5850 -n12806015 5850 -n12011620 5850 -n12922763 5850 -n12651229 5850 -n12303083 5850 -n11928352 5850 -n11926365 5850 -n12223569 5850 -n12791064 5850 -n12311579 5850 -n11834654 5850 -n11760785 5850 -n12749679 5850 -n12489815 5850 -n12666965 5850 -n12929403 5850 -n12902662 5850 -n12620196 5850 -n12237641 5850 -n12625383 5850 -n12244153 5850 -n11774513 5850 -n12520864 5850 -n12516828 5850 -n12849717 5850 -n12485653 5850 -n12790430 5862 -n12788854 5862 -n11924445 5874 -n12632335 5874 -n11947251 5874 -n12099342 5874 -n11931540 5874 -n12545635 5874 -n11778257 5874 -n11924849 5874 -n12367611 5874 -n12602262 5874 -n12328567 5874 -n12328398 5874 -n12629305 5874 -n11907689 5874 -n11940006 5874 -n12546962 5874 -n11925898 5874 -n11947629 5929 -n11948864 5929 -n11948264 5929 -n12368451 5935 -n12369309 5935 -n12368028 5935 -n12307240 5878 -n12307076 5878 -n12483427 5885 -n12483625 5885 -n12482893 5885 -n12483841 5885 -n12173664 5888 -n12173912 5888 -n12171316 5888 -n12174521 5888 -n12171098 5888 -n12177844 5888 -n12174311 5888 -n12178896 5961 -n12179122 5961 -n12676534 5891 -n12676703 5891 -n12675876 5891 -n12920204 5892 -n12921868 5892 -n12621410 5916 -n12622297 5916 -n12245319 5919 -n12244650 5919 -n12244819 5919 -n12521394 5921 -n12530818 5921 -n12849952 5923 -n12850336 5923 -n12850168 5923 -n12495146 5851 -n12570972 5851 -n12196129 5851 -n13107694 5851 -n12202936 5851 -n13111881 5851 -n13103877 5851 -n12409231 5851 -n12765115 5851 -n12265600 5851 -n12409470 5851 -n12713866 5851 -n12281241 5851 -n11709205 5851 -n12189429 5851 -n12562785 5851 -n12284821 5851 -n12401335 5851 -n12570394 5851 -n11759224 5851 -n12286988 5851 -n12491826 5851 -n12527738 5851 -n12696492 5851 -n12325234 5851 -n12198286 5851 -n12330891 5851 -n11650558 5851 -n12405714 5851 -n12284262 5851 -n12714755 5851 -n13109733 5851 -n12262553 5851 -n12506341 5851 -n12303462 5851 -n12260799 5851 -n12302071 5851 -n12492106 5851 -n11762433 5851 -n12582231 5851 -n12774299 5851 -n13108481 5851 -n12267411 5851 -n11756092 5851 -n12662772 5851 -n13108662 5851 -n12528549 5851 -n12690653 5851 -n12180885 5851 -n13108545 5851 -n13108323 5851 -n12334293 5851 -n12670758 5851 -n12286826 5851 -n12724942 5851 -n12155009 5851 -n12570703 5851 -n12523475 5851 -n12154773 5851 -n12915811 5851 -n12268246 5851 -n13108131 5851 -n12806732 5851 -n12524188 5851 -n11758799 5851 -n12496427 5851 -n12568186 5980 -n12495895 5980 -n12196527 5982 -n12196336 5982 -n12196694 5982 -n12203529 5984 -n12204175 5984 -n12282933 5992 -n12282527 5992 -n12283542 5992 -n12282737 5992 -n12282235 5992 -n12402051 5997 -n12402840 5997 -n12401684 5997 -n12402348 5997 -n12402596 5997 -n11759853 5999 -n11759404 5999 -n12406715 6008 -n12406488 6008 -n12407890 6008 -n12406902 6008 -n12330469 6011 -n12345899 6011 -n11709674 6011 -n12329473 6011 -n12200143 6011 -n11712282 6011 -n12752205 6011 -n13110915 6011 -n12513933 6011 -n12189987 6011 -n12731401 6011 -n12717224 6011 -n12717072 6011 -n12946849 6011 -n12756457 6011 -n12201580 6011 -n11703669 6011 -n12491017 6011 -n12190410 6011 -n12242409 6011 -n07754894 6011 -n12818346 6011 -n12658308 6011 -n12658118 6011 -n12494794 6011 -n12317296 6011 -n12651821 6011 -n11711764 6071 -n11710136 6071 -n11711537 6071 -n11710393 6071 -n12755225 6075 -n12753573 6075 -n12754648 6075 -n12754781 6075 -n12755727 6075 -n12754981 6075 -n12755387 6075 -n12753007 6075 -n12753245 6075 -n12754003 6075 -n12759273 6076 -n12318378 6076 -n12288823 6076 -n12319204 6111 -n12319414 6111 -n12732491 6079 -n12733647 6079 -n12732756 6079 -n12732009 6079 -n12733870 6079 -n12732966 6117 -n12733218 6117 -n12948495 6082 -n12948251 6082 -n12948053 6082 -n12947313 6082 -n12757303 6083 -n12757458 6083 -n11704093 6085 -n11705171 6085 -n12707781 6095 -n12399132 6095 -n12400720 6095 -n12345280 6095 -n11695599 6095 -n12771192 6095 -n12704343 6095 -n12638218 6095 -n12644902 6095 -n12190869 6095 -n12373100 6095 -n12300840 6095 -n12743352 6095 -n12651611 6095 -n12629666 6095 -n12636224 6095 -n12648045 6095 -n12399384 6095 -n12301180 6095 -n12744387 6095 -n12640839 6095 -n12745386 6095 -n12633638 6095 -n12771390 6095 -n12761284 6095 -n12400489 6095 -n12333530 6095 -n12333771 6095 -n12333053 6095 -n12641413 6095 -n12332030 6095 -n12711984 6130 -n12709901 6130 -n12708293 6130 -n12713063 6130 -n12711596 6130 -n12709103 6130 -n12709688 6130 -n12710415 6162 -n12710295 6162 -n12710693 6163 -n12708654 6163 -n12708941 6163 -n12643313 6137 -n12638753 6137 -n12646740 6138 -n12645174 6138 -n12650379 6138 -n12634429 6152 -n12633994 6152 -n12634211 6152 -n12635532 6152 -n12635955 6180 -n12635744 6180 -n12643473 6159 -n12649065 6159 -n12641931 6159 -n12642200 6159 -n12650556 6159 -n12649539 6185 -n12649317 6185 -n12646605 6185 -n12647560 6186 -n12648888 6186 -n12263987 6012 -n12263038 6012 -n12306089 6014 -n12305986 6014 -n12305293 6014 -n12304703 6014 -n12305475 6014 -n12262018 6015 -n12261808 6015 -n12261571 6015 -n12595699 6019 -n12587132 6019 -n12583126 6019 -n12596709 6019 -n12591351 6019 -n12596849 6019 -n12582665 6019 -n12596148 6019 -n12595964 6019 -n12582846 6019 -n12587803 6019 -n12591017 6019 -n12588320 6206 -n12588780 6206 -n12585629 6206 -n12597134 6206 -n12598027 6206 -n12597466 6206 -n12583401 6206 -n12593994 6213 -n12590232 6213 -n11757653 6023 -n11756669 6023 -n11757851 6023 -n11664418 6025 -n13108841 6025 -n11647703 6229 -n11628793 6229 -n11658331 6229 -n11623105 6229 -n11630017 6229 -n11628456 6229 -n11658544 6229 -n11643835 6229 -n11624531 6229 -n11661372 6229 -n11645914 6229 -n11630489 6229 -n11640132 6229 -n11608250 6229 -n11620673 6229 -n11618861 6229 -n11627168 6229 -n11623815 6233 -n11624192 6233 -n11623967 6233 -n11635152 6234 -n11634736 6234 -n11635433 6234 -n11636204 6234 -n11644462 6237 -n11644226 6237 -n11644046 6237 -n11626585 6238 -n11625632 6238 -n11625003 6238 -n11626826 6238 -n11625804 6238 -n11626152 6238 -n11626409 6238 -n11646694 6240 -n11646167 6240 -n11632167 6241 -n11631854 6241 -n11632619 6241 -n11616662 6243 -n11611561 6243 -n11611356 6243 -n11617631 6243 -n11612575 6243 -n11611758 6243 -n11614713 6243 -n11615387 6243 -n11612018 6243 -n11611087 6243 -n11612923 6243 -n11616486 6243 -n11618290 6243 -n11612349 6243 -n11611233 6243 -n11617090 6243 -n11614250 6243 -n11618525 6243 -n11615026 6243 -n11617272 6243 -n11614039 6279 -n11613459 6279 -n11615967 6285 -n11614420 6285 -n11621029 6244 -n11622184 6293 -n11622591 6293 -n11621281 6293 -n11622368 6293 -n11621950 6293 -n11621547 6293 -n11621727 6293 -n11619455 6245 -n11619227 6245 -n11627512 6246 -n11628087 6246 -n11627908 6246 -n12691661 6027 -n12691428 6027 -n12316572 6031 -n12334891 6031 -n12340755 6031 -n12316444 6031 -n12336727 6309 -n12338796 6309 -n12338454 6309 -n12336973 6309 -n12336092 6309 -n12336224 6309 -n12337617 6309 -n12725521 6034 -n12727101 6034 -n12729521 6034 -n12726670 6034 -n12729315 6034 -n12729729 6319 -n12731029 6319 -n12270741 6040 -n12271643 6040 -n12278650 6040 -n12279458 6040 -n12269241 6040 -n12275489 6040 -n12273114 6040 -n12276872 6040 -n12278371 6040 -n12272883 6040 -n12269652 6040 -n12273768 6040 -n12277800 6327 -n12271933 6327 -n12279772 6330 -n12270946 6330 -n12269406 6330 -n12275675 6331 -n12276628 6331 -n12275131 6331 -n12274358 6336 -n12272239 6336 -n12277578 6336 -n12501202 6041 -n12814643 6041 -n12493208 6041 -n12807773 6042 -n12807409 6042 -n12807251 6042 -n11758122 6043 -n12915568 6043 -n12656369 5852 -n12656685 5852 -n12547215 5853 -n12547503 5853 -n11944196 5194 -n11984144 5194 -n11805544 5194 -n11874081 5194 -n11965218 5194 -n12392549 5194 -n11956348 5194 -n11945514 6361 -n11944954 6361 -n11998888 6361 -n11953884 6361 -n11954345 6361 -n11955153 6371 -n11954161 6371 -n12421137 5196 -n12421467 5196 -n12411461 5196 -n12451915 5196 -n12425281 5196 -n12459629 5196 -n12421683 6376 -n12422129 6376 -n12421917 6376 -n12411922 6377 -n12418221 6377 -n12416073 6377 -n12413165 6384 -n12414932 6384 -n12412606 6384 -n12412355 6384 -n12414035 6384 -n12413880 6384 -n12453186 6378 -n12452836 6378 -n12450344 6379 -n12426248 6379 -n12429352 6379 -n12460697 6379 -n12449526 6379 -n12473840 6379 -n12458550 6379 -n12449296 6379 -n12472024 6379 -n12457091 6379 -n12465557 6379 -n12461466 6379 -n12454159 6379 -n12431434 6379 -n12451240 6395 -n12451399 6395 -n12450840 6395 -n12428076 6396 -n12428747 6396 -n12427566 6396 -n12427184 6396 -n12426623 6396 -n12427757 6396 -n12461109 6398 -n12460957 6398 -n12454705 6407 -n12454949 6407 -n12435777 6408 -n12435649 6408 -n11819509 5197 -n11819912 5197 -n11842204 5197 -n11852028 6426 -n11851258 6426 -n11847169 6426 -n11853813 6426 -n11848479 6426 -n11844892 6426 -n11851839 6426 -n11845557 6426 -n11849871 6426 -n11849983 6426 -n11851578 6426 -n11854479 6426 -n11844371 6426 -n11853356 6426 -n11845793 6434 -n11845913 6434 -n11784126 5185 -n11783920 5185 -n12832315 5185 -n11723770 5186 -n11724109 5186 -n12766869 5186 -n12455950 5186 -n11723227 5186 -n12757816 5186 -n11773987 5186 -n12766595 5186 -n01324610 5174 -n02153109 5174 -n01323599 5174 -n01314781 5174 -n01321579 5174 -n01317541 5174 -n01318894 5174 -n01314663 5174 -n02311060 5174 -n01317916 5174 -n01321230 5174 -n01314388 5174 -n02075612 5174 -n02152740 5174 -n01466257 5174 -n01316949 5174 -n01905661 5174 -n01320872 5174 -n01319467 5174 -n01316422 5174 -n02157206 5174 -n10300303 5174 -n02152881 5174 -n01324431 5174 -n01321854 6458 -n01321770 6458 -n01956344 6458 -n01613615 6458 -n01318279 6458 -n02376542 6478 -n02122948 6478 -n01888045 6478 -n01322343 6478 -n01887896 6478 -n02412440 6478 -n01322221 6478 -n01322604 6478 -n01323261 6478 -n01322685 6478 -n02395694 6478 -n01504344 6481 -n01504179 6481 -n01318381 6459 -n02122580 6459 -n01317813 6459 -n02469472 6462 -n02309337 6462 -n02311617 6462 -n02264232 6462 -n02299157 6500 -n02310585 6500 -n02299505 6500 -n02302620 6500 -n02295390 6500 -n02310717 6500 -n02288268 6500 -n02297442 6500 -n02300797 6500 -n02285801 6500 -n02307325 6500 -n02376791 6464 -n02377063 6464 -n01323355 6464 -n01469103 6468 -n01468712 6468 -n01471682 6468 -n01473806 6519 -n01627424 6519 -n01861778 6519 -n09828216 6519 -n01459791 6519 -n02156871 6519 -n01661091 6519 -n01503061 6519 -n02512053 6520 -n01477525 6520 -n02528163 6528 -n02512938 6528 -n01482071 6528 -n02638596 6530 -n01457852 6530 -n01455778 6530 -n01456756 6530 -n02552171 6530 -n01428580 6530 -n02549989 6530 -n02640857 6533 -n02641379 6533 -n02639087 6533 -n02639605 6533 -n02640242 6533 -n02554730 6537 -n02618827 6537 -n02549248 6537 -n02603317 6537 -n01451426 6537 -n02548247 6537 -n02642107 6537 -n02657368 6537 -n02603540 6537 -n02652668 6537 -n02560110 6545 -n02556846 6545 -n02555863 6545 -n02581957 6545 -n02564270 6545 -n02623445 6545 -n02565573 6545 -n02610664 6545 -n02590702 6545 -n02588286 6545 -n02620167 6545 -n02573704 6545 -n02576223 6545 -n02606384 6545 -n02605316 6545 -n02619550 6545 -n02561108 6545 -n02619165 6545 -n02610066 6545 -n02562315 6545 -n02586543 6545 -n02593019 6545 -n02594250 6545 -n02616851 6545 -n02585872 6545 -n02607862 6545 -n02557182 6556 -n02557318 6556 -n02557749 6556 -n02624167 6560 -n02628062 6560 -n02631475 6560 -n02630281 6560 -n02631041 6560 -n02629230 6560 -n02626762 6560 -n02625258 6584 -n02625612 6584 -n02624807 6584 -n02626265 6592 -n02625851 6592 -n02627292 6590 -n02627532 6590 -n02576575 6567 -n02579928 6567 -n02580336 6567 -n02576906 6598 -n02579303 6598 -n02578771 6598 -n02578928 6598 -n02580679 6600 -n02580830 6600 -n02607201 6568 -n02607470 6568 -n02607072 6568 -n02605703 6569 -n02606052 6569 -n02605936 6569 -n02561381 6571 -n02561661 6571 -n02561514 6571 -n02564720 6574 -n02563648 6574 -n02563182 6574 -n02563792 6574 -n02562796 6574 -n02565072 6616 -n02565324 6616 -n02599052 6577 -n02596381 6577 -n02597608 6577 -n02596067 6577 -n02595702 6577 -n02598573 6624 -n02598878 6624 -n02642644 6551 -n02649546 6551 -n02643112 6630 -n02643566 6630 -n02643836 6630 -n02644113 6630 -n02658531 6552 -n02657694 6552 -n02660208 6552 -n02654745 6554 -n02654425 6554 -n02656670 6554 -n02655020 6554 -n02655523 6554 -n02653145 6554 -n02656032 6643 -n02655848 6643 -n02541687 6538 -n02542432 6538 -n02524202 6538 -n02533834 6538 -n02543565 6538 -n02517442 6538 -n01438208 6538 -n02526121 6538 -n02529772 6538 -n02518324 6652 -n02520147 6652 -n02519686 6652 -n02519862 6652 -n02583567 6653 -n01444339 6653 -n01446589 6653 -n01438581 6653 -n01439121 6653 -n01448951 6653 -n02584449 6660 -n02584145 6660 -n02583890 6660 -n01446760 6662 -n01447331 6662 -n01448594 6662 -n01448291 6662 -n01439514 6664 -n01442972 6664 -n01440764 6664 -n01443831 6664 -n01443537 6664 -n01443243 6664 -n01449712 6665 -n01449374 6665 -n02527622 6654 -n02527057 6654 -n02527271 6654 -n02532602 6655 -n02533209 6655 -n02566834 6531 -n02537085 6531 -n02534734 6531 -n02514041 6531 -n02568959 6686 -n02568087 6686 -n02570164 6690 -n02569484 6690 -n02537716 6687 -n02538216 6687 -n02537525 6687 -n02537319 6687 -n02538010 6687 -n02536456 6688 -n02535537 6688 -n02535258 6688 -n02536864 6688 -n02535759 6688 -n01482330 6532 -n01495701 6532 -n01487506 6704 -n01495493 6704 -n01486838 6704 -n01488918 6704 -n01492357 6704 -n01494475 6704 -n01483522 6704 -n01488038 6704 -n01489501 6709 -n01491006 6709 -n01489709 6709 -n01489920 6709 -n01490112 6709 -n01491361 6709 -n01490670 6709 -n01493146 6710 -n01492569 6710 -n01484850 6712 -n01484097 6712 -n01483830 6712 -n01498041 6705 -n01496331 6705 -n01499396 6705 -n01500476 6705 -n01500091 6705 -n01501160 6705 -n01498989 6705 -n01629276 6521 -n01639765 6521 -n01629962 6733 -n01630284 6733 -n01629819 6733 -n01637615 6733 -n01632047 6733 -n01631663 6736 -n01630670 6736 -n01630901 6736 -n01632458 6739 -n01632777 6739 -n01632601 6739 -n01645776 6734 -n01640846 6734 -n01644900 6734 -n01643896 6734 -n01650167 6734 -n01644373 6734 -n01646648 6746 -n01646902 6746 -n01646292 6746 -n01646802 6746 -n01646388 6746 -n01647640 6746 -n01646555 6746 -n01642539 6747 -n01641206 6747 -n01641577 6747 -n01641391 6747 -n01642257 6747 -n01641739 6747 -n01650690 6750 -n01652026 6750 -n01886756 6522 -n01871265 6522 -n01871875 6522 -n01874434 6522 -n01862399 6522 -n02082791 6767 -n01887474 6767 -n01889074 6767 -n02372584 6767 -n01888411 6767 -n02453611 6767 -n02430559 6767 -n01887623 6767 -n02469914 6767 -n02075296 6767 -n02139199 6767 -n02062017 6767 -n02323449 6767 -n02372952 6767 -n01888181 6767 -n02329401 6767 -n01887787 6767 -n02453108 6767 -n01888264 6767 -n02461830 6767 -n02370806 6767 -n01891633 6774 -n01893825 6774 -n02454794 6777 -n02456962 6777 -n02454379 6777 -n02460009 6777 -n02458135 6796 -n02457945 6796 -n02457408 6796 -n02460451 6798 -n02461128 6798 -n02470238 6780 -n02501583 6780 -n02472293 6780 -n02470325 6780 -n02496913 6780 -n02484322 6780 -n02475669 6806 -n02474777 6806 -n02475078 6806 -n02470899 6807 -n02483092 6813 -n02480153 6813 -n02483708 6814 -n02483362 6814 -n02481823 6815 -n02480495 6815 -n02480855 6815 -n02482650 6818 -n02482474 6818 -n02481103 6820 -n02481366 6820 -n02481500 6820 -n02500267 6808 -n02497673 6808 -n02499316 6808 -n02499808 6808 -n02499022 6808 -n02484473 6809 -n02489589 6809 -n02486410 6831 -n02485536 6831 -n02489166 6831 -n02488702 6831 -n02486261 6831 -n02487347 6831 -n02484975 6831 -n02488291 6831 -n02486657 6833 -n02486908 6833 -n02487847 6838 -n02487547 6838 -n02493793 6832 -n02490219 6832 -n02494079 6832 -n02493509 6832 -n02492035 6832 -n02492660 6832 -n02491107 6846 -n02490811 6846 -n02507649 6781 -n02120997 6781 -n02134971 6781 -n02083346 6781 -n02441326 6781 -n02131653 6781 -n02509515 6853 -n02508213 6853 -n02509815 6853 -n02508021 6853 -n02509197 6853 -n02510455 6853 -n02127808 6854 -n02121620 6854 -n02128925 6865 -n02129604 6865 -n02128385 6865 -n02130308 6865 -n02129165 6865 -n02128757 6865 -n02129923 6868 -n02129837 6868 -n01323068 6868 -n02129463 6871 -n01322898 6871 -n02121808 6866 -n02124623 6866 -n02122878 6878 -n02123159 6878 -n02123045 6878 -n02123242 6878 -n02124484 6878 -n02124075 6878 -n02124313 6878 -n02122298 6878 -n02123478 6878 -n02123394 6878 -n02123917 6878 -n02123597 6878 -n02122510 6878 -n02122725 6878 -n02122430 6878 -n02126640 6879 -n02125494 6879 -n02127052 6879 -n02125311 6879 -n02125081 6879 -n02126139 6879 -n02126787 6879 -n02125010 6879 -n02127292 6897 -n02127482 6897 -n02127678 6897 -n02127381 6897 -n02138441 6855 -n02137015 6855 -n02137549 6855 -n02138647 6907 -n02138777 6907 -n02084071 6856 -n02115335 6856 -n02114100 6856 -n02083672 6856 -n02115096 6856 -n02118333 6856 -n02117135 6856 -n02110958 6912 -n02112826 6912 -n02111500 6912 -n02112706 6912 -n02113335 6912 -n02084861 6912 -n02111129 6912 -n02112497 6912 -n02110341 6912 -n02084732 6912 -n02111626 6912 -n02085374 6912 -n02087122 6912 -n02103406 6912 -n02110806 6912 -n02113978 6912 -n02111277 6912 -n02085272 6912 -n02113186 6920 -n02113023 6920 -n02113799 6923 -n02113624 6923 -n02113712 6923 -n02112018 6929 -n02112350 6929 -n02112137 6929 -n02111889 6929 -n02086346 6930 -n02086240 6930 -n02087046 6930 -n02085936 6930 -n02085782 6930 -n02085620 6930 -n02086079 6930 -n02086753 6946 -n02086646 6946 -n02086910 6946 -n02092468 6931 -n02087394 6931 -n02089468 6931 -n02098550 6931 -n02087551 6931 -n02089232 6931 -n02096437 6956 -n02096756 6956 -n02095412 6956 -n02096051 6956 -n02098286 6956 -n02093859 6956 -n02094114 6956 -n02093754 6956 -n02094433 6956 -n02095314 6956 -n02093647 6956 -n02097474 6956 -n02097658 6956 -n02098413 6956 -n02097298 6956 -n02096177 6956 -n02096585 6956 -n02095050 6956 -n02096294 6956 -n02093056 6956 -n02094258 6956 -n02093991 6956 -n02094562 6956 -n02098105 6956 -n02097209 6963 -n02097130 6963 -n02097047 6963 -n02095570 6964 -n02095727 6964 -n02095889 6964 -n02093256 6981 -n02093428 6981 -n02094721 6984 -n02094931 6984 -n02098906 6959 -n02099997 6959 -n02098806 6959 -n02100399 6959 -n02101108 6959 -n02099029 6959 -n02100583 6997 -n02100236 6997 -n02101006 6999 -n02100735 6999 -n02100877 6999 -n02102318 7000 -n02102605 7000 -n02101861 7000 -n02101388 7000 -n02101556 7000 -n02102480 7000 -n02102973 7000 -n02102040 7009 -n02102177 7009 -n02099267 7001 -n02099601 7001 -n02099429 7001 -n02099849 7001 -n02099712 7001 -n02091635 6960 -n02088466 6960 -n02090475 6960 -n02088238 6960 -n02091244 6960 -n02091467 6960 -n02088839 6960 -n02091831 6960 -n02088094 6960 -n02089078 6960 -n02088632 6960 -n02092002 6960 -n02090379 6960 -n02089555 6960 -n02088364 6960 -n02092339 6960 -n02090827 6960 -n02090622 7023 -n02090721 7023 -n02089973 7034 -n02089867 7034 -n02091134 7037 -n02091032 7037 -n02109047 6932 -n02103841 6932 -n02109961 6932 -n02108551 6932 -n02109811 6932 -n02109525 6932 -n02108915 6932 -n02106854 6932 -n02108672 6932 -n02107420 6932 -n02108422 6932 -n02104523 6932 -n02108089 6932 -n02108254 6932 -n02104029 7045 -n02104280 7045 -n02106966 7045 -n02104365 7045 -n02107142 7060 -n02107312 7060 -n02110627 7060 -n02110185 7048 -n02110063 7048 -n02107574 7053 -n02108000 7053 -n02107683 7053 -n02107908 7053 -n02104882 7055 -n02105412 7055 -n02105855 7055 -n02105505 7055 -n02106166 7055 -n02106030 7055 -n02106550 7055 -n02105641 7055 -n02106662 7055 -n02105251 7055 -n02106382 7055 -n02105056 7071 -n02105162 7071 -n02116738 6913 -n02115641 6913 -n02115913 6913 -n02114855 6914 -n01322508 6914 -n02114712 6914 -n02114548 6914 -n02114367 6914 -n02119022 6917 -n02119477 6917 -n02119789 6917 -n02120079 6917 -n02120505 6917 -n02119634 6917 -n02117900 6918 -n02117512 6918 -n02442845 6857 -n02443484 6857 -n02446206 6857 -n02450295 6857 -n02445394 6857 -n02444819 6857 -n02441942 6857 -n02443114 6857 -n02449350 6857 -n02445715 6857 -n02447366 6857 -n02443346 6857 -n02445004 7105 -n02445171 7105 -n02134084 6858 -n02133161 6858 -n01322983 6858 -n02133704 6858 -n02132136 6858 -n02134418 6858 -n02132580 7118 -n02132788 7118 -n02141306 6782 -n02140049 6782 -n02139671 6782 -n02146371 7122 -n02145424 7122 -n02147591 7126 -n02147947 7126 -n02062430 6783 -n02073250 6783 -n02075927 6783 -n02062744 7129 -n02066707 7132 -n02063224 7132 -n02068974 7133 -n02068541 7133 -n02070430 7135 -n02069412 7135 -n02069701 7135 -n02071636 7135 -n02071294 7135 -n02072798 7135 -n02070174 7139 -n02069974 7139 -n02066245 7134 -n02064338 7134 -n02064816 7134 -n02065407 7146 -n02065026 7146 -n02073831 7130 -n02074367 7130 -n02081571 7131 -n02076196 7131 -n02079389 7153 -n02076779 7153 -n02080415 7154 -n02079851 7154 -n02080146 7154 -n02077658 7155 -n02077152 7155 -n02077923 7155 -n02078574 7161 -n02078738 7161 -n02079005 7161 -n02328429 6784 -n02323902 6784 -n02324045 7166 -n02326432 7166 -n02325722 7167 -n02325366 7167 -n02324587 7167 -n02324850 7167 -n02324514 7167 -n02328150 7167 -n02324431 7167 -n02327842 7168 -n02326862 7168 -n02327028 7168 -n02367492 6787 -n02331046 6787 -n02365480 6787 -n02343320 6787 -n02341974 6787 -n02346627 6787 -n02366959 6787 -n02339376 6787 -n02363005 6787 -n02342885 6787 -n02359324 6787 -n02355227 6787 -n02361337 6787 -n02359556 6787 -n02364520 6787 -n02343772 6787 -n02330245 6787 -n02338145 6787 -n02353861 7180 -n02333546 7180 -n02333909 7180 -n02360282 7190 -n02358091 7190 -n02359915 7190 -n02355477 7190 -n02358890 7201 -n02358390 7201 -n02356381 7203 -n02357111 7203 -n02356977 7203 -n02357401 7203 -n02356798 7203 -n02361706 7191 -n02361587 7191 -n02364840 7193 -n02364673 7193 -n02332755 7195 -n02332156 7195 -n02503517 6789 -n02504458 7217 -n02504013 7217 -n02394477 6792 -n02373336 6792 -n02399000 7220 -n02437136 7220 -n02395003 7220 -n02437616 7220 -n02438580 7220 -n02397744 7220 -n02398521 7220 -n02397529 7220 -n02429456 7222 -n02430045 7222 -n02401031 7222 -n02439033 7222 -n02439398 7222 -n02434190 7231 -n02433925 7231 -n02433318 7231 -n02432983 7231 -n02431337 7231 -n02432511 7231 -n02430830 7231 -n02431122 7231 -n02434954 7231 -n02432291 7231 -n02431785 7231 -n02431976 7231 -n02433546 7231 -n02432704 7231 -n02414578 7232 -n02410509 7232 -n02411206 7232 -n02407959 7232 -n02402010 7232 -n02419796 7232 -n02411705 7232 -n02418064 7232 -n02416519 7232 -n02416104 7249 -n02415435 7249 -n02415253 7249 -n02415577 7259 -n02415829 7259 -n02410702 7250 -n02410900 7250 -n02408817 7252 -n02408429 7252 -n02409508 7252 -n02404573 7253 -n02402175 7253 -n02404906 7253 -n02402425 7253 -n02405302 7269 -n02410011 7269 -n02404186 7271 -n02403003 7271 -n02403325 7271 -n02403231 7271 -n02403740 7271 -n02403454 7271 -n02406174 7271 -n02404432 7274 -n02406647 7274 -n02407625 7274 -n02407071 7274 -n02405929 7274 -n02407276 7274 -n02407390 7280 -n02406533 7280 -n02424305 7254 -n02421136 7254 -n02420509 7254 -n02427724 7254 -n02426813 7254 -n02426481 7254 -n02421792 7254 -n02421449 7254 -n02424695 7254 -n02420828 7254 -n02422391 7254 -n02422699 7254 -n02424486 7254 -n02425887 7254 -n02422106 7254 -n02424085 7254 -n02428508 7254 -n02428349 7254 -n02423022 7254 -n02424909 7297 -n02425228 7297 -n02423218 7307 -n02423589 7307 -n02413131 7255 -n02413050 7255 -n02411999 7255 -n02412210 7255 -n02412080 7255 -n02418465 7256 -n02419336 7256 -n02419634 7256 -n02416964 7257 -n02416820 7257 -n02417914 7257 -n02417387 7257 -n02417070 7257 -n02416880 7257 -n02417534 7257 -n02437482 7223 -n02437312 7223 -n02396427 7224 -n02397096 7224 -n02396014 7224 -n02395406 7224 -n02438173 7225 -n02438272 7225 -n02391994 7221 -n02393580 7221 -n02374149 7221 -n02393940 7221 -n02392434 7335 -n02393161 7335 -n02392824 7335 -n02374451 7337 -n02391049 7337 -n02389346 7337 -n02388917 7342 -n02377603 7342 -n02382948 7342 -n02389128 7342 -n02381460 7342 -n02389261 7342 -n02382204 7342 -n02375302 7342 -n02376918 7342 -n02387722 7342 -n02388832 7342 -n02381609 7342 -n02377703 7342 -n02388735 7342 -n02386014 7342 -n02380464 7342 -n02386310 7342 -n02377480 7342 -n02380335 7342 -n02382437 7342 -n02389026 7342 -n02385214 7347 -n02383231 7347 -n02388276 7347 -n02377291 7353 -n02377181 7353 -n02377388 7353 -n02379430 7357 -n02378969 7357 -n02378541 7357 -n02381364 7357 -n02379329 7357 -n02381004 7357 -n02381261 7357 -n02379908 7357 -n02379183 7357 -n02386141 7359 -n02386224 7359 -n02382338 7361 -n02387254 7361 -n02386496 7361 -n02386853 7385 -n02387093 7385 -n02386968 7385 -n02387346 7385 -n02382039 7363 -n02380745 7363 -n02380583 7363 -n02382750 7364 -n02382635 7364 -n02382850 7364 -n02391234 7343 -n02391373 7343 -n02391508 7343 -n02390015 7344 -n02389779 7344 -n02389559 7344 -n01872401 6769 -n01873310 6769 -n01872772 6769 -n01877134 6770 -n01882714 6770 -n01883070 6770 -n01875313 6770 -n01874928 6770 -n01883513 6770 -n01881171 6770 -n01877606 7405 -n01877812 7405 -n01878929 7413 -n01879509 7413 -n01884834 7410 -n01885498 7410 -n01662622 6526 -n01661818 6526 -n01662784 7418 -n01669372 7420 -n01669191 7420 -n01666228 7420 -n01667778 7420 -n01672032 7420 -n01669654 7420 -n01663401 7420 -n01665932 7420 -n01668665 7420 -n01670092 7420 -n01667114 7420 -n01668892 7420 -n01664990 7427 -n01664065 7427 -n01663782 7427 -n01665541 7427 -n01664369 7427 -n01664674 7437 -n01664492 7437 -n01670802 7430 -n01671125 7430 -n01670535 7430 -n01671479 7430 -n01696633 7419 -n01726692 7419 -n01673282 7419 -n01674464 7419 -n01699831 7419 -n01698434 7444 -n01697178 7444 -n01698640 7444 -n01699040 7444 -n01697611 7450 -n01697457 7450 -n01740551 7445 -n01752165 7445 -n01751748 7445 -n01745125 7445 -n01741562 7445 -n01727646 7445 -n01753488 7456 -n01752736 7456 -n01752585 7456 -n01753032 7456 -n01753959 7456 -n01754533 7465 -n01754370 7465 -n01754876 7465 -n01757901 7468 -n01757677 7468 -n01755581 7468 -n01757115 7468 -n01755740 7468 -n01756089 7468 -n01756508 7468 -n01756291 7468 -n01756733 7468 -n01757343 7468 -n01747885 7458 -n01749939 7458 -n01751472 7458 -n01747589 7458 -n01749582 7458 -n01746359 7458 -n01745484 7458 -n01748264 7479 -n01748906 7479 -n01741943 7459 -n01743605 7488 -n01742821 7488 -n01742172 7488 -n01743086 7488 -n01744100 7489 -n01743936 7489 -n01744401 7489 -n01730960 7460 -n01735189 7460 -n01733757 7460 -n01729322 7460 -n01732244 7460 -n01731545 7460 -n01737021 7460 -n01729977 7460 -n01730812 7460 -n01730563 7460 -n01728572 7460 -n01728920 7460 -n01739381 7460 -n01734418 7460 -n01740131 7460 -n01735577 7497 -n01735439 7497 -n01734104 7498 -n01733957 7498 -n01732614 7500 -n01732789 7500 -n01737875 7502 -n01737472 7502 -n01737728 7502 -n01730185 7503 -n01730307 7503 -n01734808 7509 -n01734637 7509 -n01675722 7447 -n01693783 7447 -n01694709 7447 -n01684133 7447 -n01692333 7447 -n01695060 7447 -n01685808 7447 -n01676755 7447 -n01687665 7447 -n01674990 7447 -n01694178 7447 -n01692864 7447 -n01689411 7447 -n01681940 7531 -n01681653 7531 -n01678343 7531 -n01682714 7531 -n01682435 7531 -n01681328 7531 -n01680264 7531 -n01679626 7531 -n01677366 7531 -n01677747 7531 -n01679962 7531 -n01680655 7543 -n01680478 7543 -n01687978 7532 -n01689081 7532 -n01688243 7532 -n01693334 7535 -n01693175 7535 -n01690149 7536 -n01689811 7536 -n01700470 7448 -n01713764 7448 -n01701859 7557 -n01704323 7557 -n01515303 6527 -n01844917 6527 -n01524359 6527 -n01514668 6527 -n01833805 6527 -n01838038 6527 -n01825930 6527 -n01844551 6527 -n01604330 6527 -n01834918 6527 -n01822602 6527 -n01514752 6527 -n01517565 6527 -n01789386 6527 -n01844231 6527 -n01816887 6527 -n01517966 6527 -n01503976 6527 -n01514859 6527 -n02000954 7562 -n01858441 7562 -n02016358 7562 -n02021795 7562 -n01845132 7562 -n02008041 7580 -n02014237 7580 -n02021050 7580 -n02018795 7580 -n02005790 7580 -n02002075 7580 -n02013177 7580 -n02012849 7580 -n02013706 7580 -n02014524 7580 -n02007558 7580 -n02014941 7580 -n02006656 7580 -n02005399 7580 -n02022684 7580 -n02008497 7585 -n02010453 7585 -n02009229 7585 -n02011281 7585 -n02008643 7585 -n02008796 7585 -n02011460 7585 -n02010728 7601 -n02011016 7601 -n02009750 7605 -n02009508 7605 -n02009380 7605 -n02009912 7605 -n02010272 7605 -n02012185 7606 -n02011805 7606 -n02006063 7589 -n02006364 7589 -n02003204 7590 -n02002724 7590 -n02002556 7590 -n02004131 7590 -n02003839 7590 -n02004492 7590 -n02004855 7590 -n02017725 7596 -n02015357 7596 -n02016066 7596 -n02015554 7596 -n02018027 7596 -n02018368 7629 -n02018207 7629 -n02006985 7597 -n02007284 7597 -n02023341 7599 -n02034129 7599 -n02034295 7599 -n02036053 7599 -n02040266 7599 -n02037110 7599 -n02034661 7599 -n02031585 7599 -n02031934 7599 -n02030996 7599 -n02036711 7599 -n02026059 7599 -n02033779 7599 -n02038993 7599 -n02033561 7599 -n02037464 7599 -n02024479 7634 -n02025239 7634 -n02023992 7634 -n02024763 7634 -n02025043 7634 -n02023855 7634 -n02034971 7640 -n02035210 7640 -n02032222 7642 -n02032355 7642 -n02032480 7642 -n02033041 7642 -n02030287 7645 -n02027897 7645 -n02030837 7645 -n02029087 7645 -n02029378 7645 -n02028035 7645 -n02027075 7645 -n02028900 7645 -n02027492 7645 -n02029706 7645 -n02027357 7645 -n02028727 7645 -n02030035 7645 -n02026948 7645 -n02028175 7645 -n02028342 7676 -n02028451 7676 -n02037869 7649 -n02038466 7649 -n01858845 7581 -n01858906 7581 -n01860002 7581 -n01858281 7581 -n01859190 7581 -n01858780 7581 -n01859325 7581 -n01860187 7581 -n01859496 7581 -n01859689 7689 -n01859852 7689 -n02016956 7582 -n02017213 7582 -n02016816 7582 -n02040505 7583 -n02057731 7583 -n02050004 7583 -n02045369 7583 -n02049088 7583 -n02051474 7583 -n02055658 7583 -n02047614 7583 -n02041085 7695 -n02044178 7695 -n02043808 7695 -n02043333 7703 -n02041246 7703 -n02043063 7703 -n02042472 7707 -n02041678 7707 -n02042180 7707 -n02041875 7707 -n02042759 7707 -n02042046 7707 -n02044778 7704 -n02044517 7704 -n02059162 7696 -n02058221 7696 -n02058594 7696 -n02060411 7717 -n02060889 7717 -n02060133 7717 -n02050442 7697 -n02050313 7697 -n02051059 7697 -n02050586 7697 -n02050809 7697 -n02045864 7698 -n02046759 7698 -n02045596 7698 -n02047260 7729 -n02046939 7729 -n02047411 7729 -n02047045 7729 -n02052775 7700 -n02054036 7700 -n02054502 7700 -n02051845 7700 -n02053083 7700 -n02054711 7700 -n02055107 7700 -n02052204 7738 -n02052365 7738 -n02053425 7739 -n02053584 7739 -n02055803 7701 -n02056728 7746 -n02057035 7746 -n02056570 7746 -n02057330 7746 -n02056228 7746 -n02048115 7702 -n02048353 7702 -n02047975 7702 -n01845477 7584 -n01855672 7755 -n01846331 7755 -n01856890 7756 -n01857851 7756 -n01857079 7756 -n01856380 7756 -n01857512 7756 -n01857325 7756 -n01856072 7756 -n01856553 7756 -n01856155 7756 -n01857632 7756 -n01847253 7757 -n01851375 7757 -n01849676 7757 -n01852329 7757 -n01850192 7757 -n01847978 7757 -n01852400 7757 -n01848840 7757 -n01849157 7757 -n01847806 7757 -n01849466 7757 -n01848123 7757 -n01850553 7757 -n01847089 7757 -n01851895 7757 -n01849863 7757 -n01852142 7757 -n01847000 7757 -n01852671 7757 -n01848976 7757 -n01847407 7757 -n01848648 7757 -n01852861 7757 -n01851207 7757 -n01851038 7757 -n01850373 7757 -n01850873 7757 -n01847170 7757 -n01851573 7769 -n01851731 7769 -n01848555 7779 -n01848323 7779 -n01848453 7779 -n01853195 7790 -n01853870 7790 -n01854415 7790 -n01853498 7790 -n01853666 7790 -n01854838 7803 -n01855032 7803 -n01855476 7803 -n01855188 7803 -n01854700 7803 -n01584225 7563 -n01546506 7563 -n01546921 7563 -n01525720 7563 -n01546039 7563 -n01539573 7563 -n01585121 7811 -n01585715 7811 -n01584695 7811 -n01586374 7811 -n01584853 7811 -n01586020 7811 -n01552813 7813 -n01551711 7813 -n01555004 7813 -n01554448 7813 -n01547832 7813 -n01548301 7827 -n01549886 7827 -n01549430 7827 -n01550172 7827 -n01549641 7827 -n01555305 7827 -n01549053 7828 -n01548865 7828 -n01548492 7828 -n01563128 7814 -n01589718 7814 -n01578575 7814 -n01576695 7814 -n01528654 7814 -n01591697 7814 -n01594004 7814 -n01557185 7814 -n01527347 7814 -n01597022 7814 -n01598588 7814 -n01527617 7814 -n01576076 7814 -n01555809 7814 -n01587834 7814 -n01602630 7814 -n01597336 7814 -n01538955 7814 -n01529672 7814 -n01600657 7814 -n01601694 7814 -n01527194 7814 -n01586941 7814 -n01588002 7814 -n01527917 7814 -n01587526 7814 -n01601068 7814 -n01603600 7814 -n01602832 7814 -n01571904 7814 -n01575745 7814 -n01566645 7814 -n01594372 7814 -n01589286 7814 -n01526521 7814 -n01582856 7814 -n01528396 7814 -n01528845 7814 -n01556182 7814 -n01542786 7814 -n01590583 7814 -n01564914 7837 -n01567133 7837 -n01563746 7837 -n01564394 7837 -n01563449 7837 -n01565078 7837 -n01570676 7879 -n01570839 7879 -n01570267 7879 -n01567678 7879 -n01569060 7879 -n01568892 7879 -n01568294 7879 -n01569971 7879 -n01569262 7879 -n01567879 7879 -n01568720 7879 -n01569423 7879 -n01563945 7880 -n01564217 7880 -n01566207 7881 -n01565599 7881 -n01565930 7881 -n01564773 7881 -n01579410 7839 -n01581984 7839 -n01579578 7839 -n01582398 7839 -n01580077 7839 -n01579260 7839 -n01579028 7839 -n01582220 7839 -n01579149 7839 -n01580870 7906 -n01581166 7906 -n01577035 7840 -n01578180 7840 -n01577659 7840 -n01593028 7842 -n01592084 7842 -n01592694 7842 -n01592387 7842 -n01592540 7917 -n01592257 7917 -n01562265 7844 -n01558993 7844 -n01559477 7844 -n01558461 7844 -n01558307 7844 -n01558149 7844 -n01560105 7844 -n01558594 7844 -n01557962 7844 -n01558765 7844 -n01561732 7844 -n01562014 7844 -n01560280 7844 -n01562451 7844 -n01561452 7844 -n01560419 7844 -n01560636 7844 -n01559804 7844 -n01560793 7938 -n01560935 7938 -n01598988 7847 -n01599556 7847 -n01600085 7847 -n01599269 7942 -n01599159 7942 -n01597906 7853 -n01598074 7853 -n01597737 7853 -n01533651 7855 -n01534155 7855 -n01540233 7855 -n01531178 7855 -n01534762 7855 -n01533893 7855 -n01537134 7855 -n01531344 7855 -n01541386 7855 -n01531512 7855 -n01533481 7855 -n01541922 7855 -n01533000 7855 -n01544704 7855 -n01530575 7855 -n01532325 7855 -n01532511 7855 -n01531811 7855 -n01534582 7855 -n01532829 7855 -n01530439 7855 -n01533339 7855 -n01531971 7855 -n01534433 7855 -n01541102 7952 -n01540566 7952 -n01540832 7952 -n01536644 7954 -n01535469 7954 -n01536334 7954 -n01536186 7954 -n01535690 7954 -n01536780 7954 -n01536035 7954 -n01537544 7956 -n01538059 7956 -n01538630 7956 -n01537895 7956 -n01538200 7956 -n01603812 7864 -n01603953 7864 -n01573898 7866 -n01573074 7866 -n01572328 7866 -n01572782 7866 -n01574045 7866 -n01573240 7992 -n01573360 7992 -n01572654 7993 -n01572489 7993 -n01574560 7995 -n01575117 7995 -n01574390 7995 -n01575401 7995 -n01595450 7869 -n01595168 7869 -n01595624 7869 -n01594787 7869 -n01594968 7869 -n01595974 8006 -n01596273 8006 -n01583209 7872 -n01583495 7872 -n01543632 7876 -n01544389 7876 -n01591123 7877 -n01591005 7877 -n01591301 7877 -n01539925 7816 -n01540090 7816 -n01834540 7565 -n01834177 7565 -n01843065 7566 -n01838598 7566 -n01842235 7566 -n01843719 7566 -n01843383 7566 -n01839598 8023 -n01839330 8023 -n01839086 8023 -n01841102 8023 -n01841679 8023 -n01840775 8023 -n01839750 8023 -n01841441 8030 -n01841288 8030 -n01827403 7567 -n01826364 7567 -n01830915 7567 -n01830042 7567 -n01829413 7567 -n01826680 7567 -n01829869 7567 -n01828970 7567 -n01828556 8036 -n01827793 8036 -n01828096 8036 -n01616318 7569 -n01605630 7569 -n01618503 7569 -n01613294 7569 -n01621127 7569 -n01616764 8047 -n01618922 8047 -n01617766 8052 -n01617443 8052 -n01618082 8052 -n01617095 8052 -n01620414 8053 -n01619310 8053 -n01620735 8053 -n01619536 8053 -n01619835 8061 -n01620135 8061 -n01609751 8048 -n01606522 8048 -n01607812 8048 -n01608265 8048 -n01610955 8048 -n01610552 8048 -n01606809 8048 -n01616086 8048 -n01608432 8048 -n01607600 8048 -n01607962 8048 -n01606672 8048 -n01609956 8064 -n01610226 8064 -n01613177 8068 -n01611800 8068 -n01611472 8068 -n01612628 8068 -n01612476 8068 -n01612275 8068 -n01611969 8068 -n01612122 8068 -n01609391 8072 -n01609062 8072 -n01608814 8072 -n01613807 8050 -n01614343 8050 -n01615121 8050 -n01614925 8050 -n01614038 8050 -n01614556 8050 -n01615703 8091 -n01615458 8091 -n01622959 8051 -n01621635 8051 -n01623880 8051 -n01623425 8051 -n01622352 8051 -n01623615 8051 -n01622120 8051 -n01625562 8051 -n01623706 8051 -n01624115 8051 -n01624537 8051 -n01622483 8051 -n01623110 8051 -n01624833 8051 -n01622779 8051 -n01837072 7570 -n01835276 7570 -n01825278 7571 -n01823013 7571 -n01824575 8115 -n01824035 8115 -n01521399 7573 -n01521756 7573 -n01518878 7573 -n01519873 7573 -n01519563 7573 -n01789740 7574 -n01810700 7574 -n01801876 7574 -n01791463 7574 -n01791107 7574 -n02153203 7574 -n01794344 8123 -n01791954 8123 -n01794158 8123 -n01809106 8123 -n01791625 8123 -n01792429 8133 -n01792158 8133 -n01793435 8133 -n01792042 8133 -n01793715 8133 -n01792640 8133 -n01793249 8139 -n01792955 8139 -n01815601 8124 -n01811909 8124 -n01814370 8143 -n01812337 8143 -n01813088 8143 -n01812662 8143 -n01814921 8144 -n01814755 8144 -n01813532 8145 -n01813385 8145 -n01813948 8145 -n01814217 8145 -n01802721 8128 -n01810268 8128 -n01795088 8128 -n01803078 8154 -n01806567 8154 -n01807496 8154 -n01807105 8157 -n01803362 8157 -n01804163 8157 -n01805801 8157 -n01806297 8163 -n01806364 8163 -n01806143 8163 -n01806467 8163 -n01804478 8158 -n01806847 8158 -n01804653 8158 -n01808140 8159 -n01807828 8159 -n01797307 8156 -n01798484 8156 -n01797020 8156 -n01797886 8156 -n01797601 8156 -n01796729 8156 -n01795545 8156 -n01796340 8156 -n01819734 7576 -n01821203 7576 -n01819115 7576 -n01817346 7576 -n01818832 7576 -n01817953 7576 -n01818515 7576 -n01818299 7576 -n01820052 7576 -n01820348 7576 -n01817263 7576 -n01821869 8182 -n01822300 8182 -n01819313 8183 -n01819465 8183 -n01821076 8190 -n01820546 8190 -n01317089 6469 -n01317294 6469 -n01918744 6470 -n01922303 6470 -n01940736 6470 -n02316707 6470 -n01909422 6470 -n01767661 6470 -n01906749 6470 -n01930112 8201 -n01934440 8201 -n01924916 8201 -n01938454 8208 -n01935395 8208 -n01955084 8202 -n01955933 8202 -n01968315 8202 -n01942177 8202 -n01960459 8213 -n01963317 8213 -n01956481 8213 -n01963571 8213 -n01959985 8213 -n01965889 8213 -n01961985 8213 -n01957335 8218 -n01958038 8218 -n01959492 8218 -n01964441 8219 -n01964271 8219 -n01965529 8219 -n01969726 8214 -n01968897 8214 -n01972541 8214 -n01970164 8229 -n01970667 8229 -n01951274 8215 -n01953361 8215 -n01943899 8215 -n01945845 8215 -n01943087 8215 -n01953762 8215 -n01950731 8215 -n01945685 8215 -n01944390 8215 -n01949085 8237 -n01947396 8237 -n01946630 8237 -n01944812 8242 -n01945143 8242 -n01944955 8242 -n02317335 8203 -n02321170 8203 -n02319555 8203 -n02319095 8203 -n02321529 8203 -n02317781 8203 -n01909906 8204 -n01914163 8204 -n01913166 8204 -n01910747 8204 -n01915700 8256 -n01914609 8256 -n01915811 8256 -n01916925 8261 -n01916187 8261 -n01916481 8261 -n01917882 8262 -n01917289 8262 -n01784675 8205 -n01974773 8205 -n01768244 8205 -n01786646 8205 -n01769347 8205 -n01787835 8205 -n02309242 8205 -n02159955 8205 -n01785667 8205 -n01994910 8268 -n01976868 8268 -n01990007 8268 -n01975687 8268 -n01976146 8268 -n01990800 8279 -n01992773 8279 -n01991520 8281 -n01991028 8281 -n01982650 8280 -n01986806 8280 -n01986214 8280 -n01987545 8280 -n01976957 8280 -n01985128 8280 -n01984245 8285 -n01984695 8285 -n01983481 8285 -n01981276 8289 -n01979874 8289 -n01978455 8289 -n01978287 8289 -n01980166 8289 -n01982068 8289 -n01770393 8271 -n01770081 8271 -n01776192 8271 -n01772222 8271 -n01776313 8302 -n01779629 8302 -n01779148 8302 -n01772664 8303 -n01775370 8303 -n01774750 8303 -n01775062 8303 -n01773797 8303 -n01774384 8303 -n01773157 8303 -n01773549 8303 -n02226183 8274 -n02236896 8274 -n02263378 8274 -n02232951 8274 -n02163297 8274 -n02262449 8274 -n02246011 8274 -n02188699 8274 -n02272871 8274 -n02273392 8274 -n02231052 8274 -n02161457 8274 -n02236355 8274 -n02312427 8274 -n02231487 8274 -n02162561 8274 -n02164464 8274 -n02241569 8274 -n02262803 8274 -n02206270 8274 -n02274024 8274 -n02312640 8274 -n02268148 8274 -n02270623 8274 -n02207805 8274 -n02226429 8315 -n02229544 8315 -n02228341 8340 -n02226970 8340 -n02241426 8316 -n02240517 8316 -n02266050 8317 -n02264885 8317 -n02264363 8317 -n02236044 8318 -n02236241 8318 -n02233338 8318 -n02234355 8351 -n02234848 8351 -n02233943 8351 -n02251775 8321 -n02256656 8321 -n02258198 8321 -n02257284 8321 -n02250822 8321 -n02259212 8321 -n02252226 8321 -n02200198 8322 -n02205219 8322 -n02203152 8322 -n02196344 8322 -n02190166 8322 -n02198859 8322 -n02196119 8322 -n02201000 8362 -n02202006 8362 -n02195819 8366 -n02195526 8366 -n02192513 8366 -n02191773 8366 -n02190790 8366 -n02192252 8374 -n02191979 8374 -n02169974 8331 -n02168245 8331 -n02167151 8331 -n02169023 8331 -n02165456 8331 -n02171453 8331 -n02180875 8331 -n02183096 8331 -n02169497 8331 -n02176261 8331 -n02176439 8331 -n02165105 8331 -n02177972 8331 -n02168699 8331 -n02166567 8382 -n02166826 8382 -n02171869 8383 -n02175916 8383 -n02175569 8394 -n02172870 8394 -n02173373 8394 -n02174001 8394 -n02172182 8394 -n02172518 8394 -n02174659 8394 -n02243562 8332 -n02244797 8332 -n02212062 8334 -n02218371 8334 -n02219486 8334 -n02206856 8334 -n02216211 8405 -n02215770 8405 -n02212602 8405 -n02213107 8411 -n02212958 8411 -n02213543 8411 -n02213239 8412 -n02213788 8412 -n02220804 8407 -n02221083 8407 -n02221414 8407 -n02209354 8408 -n02208280 8408 -n02211627 8408 -n02210427 8408 -n02211444 8408 -n02209624 8408 -n02208498 8421 -n02208848 8421 -n02274259 8335 -n02283201 8335 -n02281787 8428 -n02274822 8428 -n02281406 8428 -n02277742 8428 -n02279972 8428 -n02280649 8428 -n02282257 8430 -n02282903 8430 -n02282385 8430 -n02275773 8431 -n02278210 8431 -n02276258 8431 -n02276902 8431 -n02279257 8431 -n02277094 8431 -n02276078 8431 -n02275560 8431 -n02277268 8431 -n02276355 8431 -n02276749 8431 -n02278024 8431 -n02281015 8435 -n02281136 8435 -n02305929 8429 -n02301452 8429 -n02295064 8429 -n02298541 8429 -n02284611 8429 -n02287004 8429 -n02291572 8429 -n02305085 8454 -n02301935 8454 -n02304432 8454 -n02303284 8454 -n02302969 8454 -n02292692 8459 -n02291748 8459 -n02268443 8337 -n02268853 8337 -n01321123 6471 -n02376679 6471 -n01323493 6471 -n01338685 5175 -n01387065 5175 -n01339083 8472 -n01339336 8472 -n01339801 8472 -n01339471 8472 -n01397114 8473 -n01389507 8473 -n01397871 8478 -n01410457 8478 -n01407798 8478 -n01424420 8479 -n01392380 8479 -n01395254 8479 -n01396048 8479 -n11542137 5176 -n11544015 5176 -n11542640 5176 -n09626238 5177 -n09856671 5177 -n09605289 5177 -n09622049 5177 -n09971273 5177 -n09882716 5177 -n09621232 5177 -n09902954 5177 -n09620794 5177 -n09727440 5177 -n09624168 5177 -n09752519 5177 -n10378026 5177 -n10500217 5177 -n10514429 5177 -n09610405 5177 -n09617867 5177 -n10355449 5177 -n09618957 5177 -n10002760 5177 -n10384496 5177 -n09637339 5177 -n09613191 5177 -n09836160 5177 -n10274815 5177 -n09890749 5177 -n10112591 5177 -n10260706 5177 -n09606527 5177 -n09767197 5177 -n10709529 5177 -n09976429 5177 -n09918554 5177 -n10588074 5177 -n10565667 5177 -n09990415 5177 -n10120330 5177 -n09616922 5177 -n09622302 5177 -n09630641 5177 -n09796809 5177 -n09614684 5177 -n10635788 5177 -n09645091 5177 -n10405694 5177 -n09676884 5177 -n09638875 5177 -n09874428 5177 -n09627906 5177 -n09628382 5177 -n10522759 5177 -n10247880 5177 -n09624980 5177 -n10529231 5177 -n10024362 5177 -n09614315 5177 -n09612848 5177 -n09632518 5177 -n10147935 5177 -n09871867 5177 -n09620078 5177 -n09634494 5177 -n10077593 5177 -n10040945 5177 -n09623038 5177 -n10560106 5177 -n10289039 5177 -n10422405 5177 -n09774783 5177 -n10042845 5177 -n09831962 5177 -n10726031 5177 -n09923673 5177 -n09610660 5177 -n09626031 5177 -n10401331 5177 -n09621545 5177 -n10362319 5177 -n10665698 5177 -n09906449 5177 -n09939313 5177 -n10439373 5177 -n09607630 5177 -n09631463 5177 -n10451450 5177 -n10541229 5177 -n09793141 5177 -n10633450 5177 -n10530959 5177 -n09629752 5177 -n10560637 5177 -n10431625 5177 -n09619168 5177 -n09763784 5177 -n09636339 5177 -n10235549 5177 -n09845401 5177 -n10513823 5177 -n10610465 5177 -n09951274 5177 -n09816771 8490 -n10401829 8590 -n10307234 8590 -n10505613 8590 -n10148035 8591 -n09874725 8591 -n09944022 8592 -n10015485 8592 -n10728624 8592 -n10308168 8592 -n10200781 8492 -n10480253 8492 -n10376523 8492 -n09903153 8600 -n10748620 8600 -n10581890 8601 -n10045713 8601 -n10165109 8601 -n10694258 8606 -n10509063 8606 -n10559996 8606 -n10366966 8607 -n10305802 8607 -n10421470 8607 -n10164492 8611 -n10477713 8611 -n10020890 8612 -n10679174 8616 -n10632576 8616 -n10189278 8616 -n09894445 8618 -n10504206 8618 -n10559288 8493 -n09917593 8493 -n09833441 8623 -n10384392 8623 -n10060352 8495 -n09840217 8495 -n09777012 8495 -n10309896 8495 -n09905185 8495 -n10686885 8628 -n10209731 8628 -n10093818 8629 -n10754189 8629 -n10411551 8629 -n10577284 8629 -n10285313 8500 -n10333439 8500 -n10624074 8500 -n10287213 8500 -n09871229 8637 -n10078719 8637 -n09843443 8637 -n10173771 8640 -n10192839 8640 -n10419785 8640 -n10406266 8640 -n10288964 8640 -n10804287 8640 -n10665587 8640 -n10153414 8640 -n10406765 8640 -n10611613 8506 -n09805324 8506 -n09824361 8506 -n10316360 8506 -n10707233 8506 -n10696508 8506 -n09858165 8506 -n10175248 8655 -n09979321 8655 -n10692482 8661 -n10396106 8661 -n10427764 8657 -n10385566 8657 -n10439851 8512 -n09820263 8512 -n10533013 8512 -n09854421 8666 -n10304914 8666 -n10575463 8666 -n09915651 8666 -n10453184 8666 -n10101634 8667 -n10701180 8667 -n09835230 8667 -n10746931 8667 -n10542888 8667 -n10604491 8667 -n09764381 8667 -n09929298 8667 -n10019406 8667 -n09785659 8667 -n10618342 8667 -n10782471 8667 -n10701644 8667 -n10105733 8667 -n10638922 8667 -n09842047 8667 -n10315561 8667 -n09835506 8667 -n10153594 8667 -n09830194 8674 -n10263411 8674 -n10157128 8693 -n10498816 8693 -n10689306 8693 -n10604380 8679 -n10634849 8679 -n09923561 8680 -n09764598 8680 -n10086568 8691 -n10007684 8691 -n09841696 8691 -n10321340 8691 -n10092488 8702 -n10386984 8702 -n10387196 8702 -n10205457 8702 -n10578021 8668 -n10098710 8668 -n09836519 8513 -n09836786 8513 -n09836343 8513 -n09877951 8516 -n10300154 8516 -n10095769 8516 -n10435988 8520 -n09930257 8718 -n10387324 8718 -n10098862 8525 -n10642596 8721 -n10331167 8721 -n09946814 8527 -n10299250 8527 -n09896170 8527 -n10415638 8527 -n10091450 8727 -n10069296 8727 -n09989502 8727 -n10226413 8727 -n10493685 8727 -n09765278 8727 -n09930876 8727 -n10340312 8727 -n09990777 8730 -n09834699 8730 -n10737103 8733 -n10649197 8733 -n10701962 8735 -n10415037 8735 -n10151760 8735 -n10229883 8735 -n10732010 8735 -n10603851 8735 -n10599806 8735 -n10369317 8735 -n09903501 8735 -n10755080 8735 -n10098245 8735 -n10382825 8735 -n10536416 8735 -n10036929 8735 -n10624310 8746 -n09842528 8746 -n10085869 8528 -n09991867 8528 -n10078131 8528 -n10627252 8528 -n10682953 8528 -n10237196 8528 -n09789566 8529 -n10182190 8529 -n09899671 8529 -n10150071 8531 -n10091651 8531 -n10806113 8531 -n10249459 8531 -n10317500 8768 -n09822830 8768 -n10448983 8768 -n09862621 8771 -n10540114 8771 -n10009276 8771 -n10333838 8771 -n10730728 8771 -n10721321 8771 -n09659188 8533 -n09650729 8533 -n09652149 8533 -n09659039 8533 -n09729530 8536 -n09641002 8536 -n09725653 8782 -n09846469 8782 -n09750770 8782 -n10486166 8538 -n10169147 8538 -n09684901 8539 -n09683757 8539 -n09682291 8539 -n10364198 8539 -n10518602 8539 -n10341573 8791 -n10672371 8791 -n10332861 8793 -n10112129 8793 -n10602470 8793 -n10727256 8542 -n10508141 8542 -n10652605 8799 -n09881265 8799 -n09933098 8545 -n09812338 8545 -n09920283 8545 -n10078806 8545 -n10339966 8804 -n10667477 8804 -n10566072 8804 -n10469874 8804 -n10624540 8807 -n09809925 8807 -n09846755 8806 -n09873899 8806 -n09779790 8806 -n10034614 8546 -n10449664 8546 -n10034201 8546 -n09951616 8546 -n10037385 8818 -n09846894 8818 -n10282672 8547 -n10053808 8547 -n09815790 8547 -n10137825 8547 -n10605985 8547 -n10604979 8547 -n09861946 8547 -n10763383 8823 -n09841188 8823 -n10644598 8823 -n10548681 8823 -n10791221 8823 -n10583790 8823 -n09873473 8823 -n10763620 8823 -n10548537 8823 -n10120671 8823 -n10241300 8833 -n10318293 8833 -n10176679 8839 -n09932508 8839 -n10186216 8841 -n10134178 8841 -n10079399 8841 -n09821831 8824 -n09934337 8824 -n10324560 8824 -n10063461 8846 -n09886403 8846 -n09760609 8846 -n10260800 8846 -n10655594 8846 -n09938449 8849 -n10183931 8849 -n09972458 8848 -n09813219 8848 -n10049363 8826 -n10372373 8826 -n10076604 8826 -n09835348 8826 -n09974648 8826 -n10433164 8826 -n09859152 8826 -n10727171 8826 -n10308732 8826 -n09833536 8826 -n10582746 8826 -n10393909 8826 -n10013927 8859 -n10225219 8859 -n10202624 8859 -n09800964 8859 -n10465831 8859 -n09787534 8870 -n10174445 8870 -n10441962 8870 -n10132035 8862 -n09896685 8862 -n09934774 8862 -n10279018 8862 -n10793570 8862 -n10155849 8862 -n10087434 8863 -n09964202 8863 -n09811852 8868 -n10348526 8868 -n10317007 8868 -n10058777 8868 -n10360747 8888 -n09941964 8888 -n10347446 8888 -n09770359 8888 -n09941787 8888 -n09942970 8888 -n09809749 8888 -n09770179 8888 -n10208950 8888 -n10580772 8890 -n10093475 8899 -n10645017 8899 -n09943239 8895 -n09943541 8895 -n10263790 8895 -n10283170 8902 -n10259348 8902 -n10092978 8902 -n10296176 8902 -n09893191 8902 -n10123844 8902 -n10259780 8902 -n10259997 8903 -n10510245 8903 -n10622053 8889 -n10058585 8889 -n10690648 8914 -n10523341 8914 -n10739391 8914 -n10476467 8915 -n10512372 8915 -n10802507 8915 -n10753442 8550 -n09733793 8550 -n09738708 8550 -n09641757 8550 -n09738400 8550 -n09727826 8550 -n09686536 8550 -n09724533 8550 -n09744834 8924 -n09743792 8924 -n09744161 8924 -n09742101 8924 -n09689435 8925 -n09734450 8925 -n09644152 8925 -n09750282 8925 -n09673495 8925 -n09718811 8925 -n09718217 8925 -n09712696 8925 -n09718936 8925 -n10711766 8925 -n09694771 8925 -n09719794 8925 -n09714694 8925 -n09675922 8938 -n09676247 8938 -n10774440 8926 -n09720256 8926 -n09725229 8926 -n09731571 8926 -n09691729 8949 -n09693982 8949 -n09712448 8949 -n09697401 8951 -n09696585 8951 -n09722658 8956 -n09724656 8956 -n09723067 8956 -n09694664 8952 -n09712324 8952 -n09689958 8928 -n09695979 8928 -n10327987 8928 -n09688804 8928 -n09730204 8928 -n09711435 8928 -n09713108 8928 -n09731343 8928 -n09717233 8928 -n09695620 8928 -n09728285 8928 -n09707289 8928 -n09701833 8928 -n09700964 8928 -n09750891 8928 -n09715427 8928 -n09708750 8928 -n09705784 8551 -n09734185 8551 -n09752023 8551 -n09635534 8551 -n09696456 8551 -n09732170 8551 -n09730824 8551 -n09719309 8551 -n09734535 8551 -n09736945 8551 -n09720842 8551 -n09692915 8551 -n09751895 8551 -n09724785 8551 -n09747495 8551 -n09734639 8551 -n09749386 8551 -n09705124 8551 -n09731436 8551 -n10303814 8554 -n10450303 8554 -n10722575 8554 -n10054657 8554 -n10631309 8554 -n10249270 8554 -n09913455 8554 -n10162991 8554 -n09807754 8554 -n09505153 8554 -n10209082 8554 -n10323634 8554 -n10104064 8554 -n10001481 9000 -n10242328 9000 -n10159045 9001 -n09932098 9001 -n10253995 9004 -n10005934 9016 -n10578471 9016 -n09770949 9006 -n10004718 9006 -n10570019 9006 -n10289462 9019 -n10069645 9019 -n10187990 9019 -n09916348 9023 -n10727458 9023 -n10320863 9023 -n10572706 9021 -n10572889 9021 -n10038409 9007 -n10756148 9007 -n09927451 9008 -n10243664 9008 -n10502329 9008 -n09988493 9008 -n10373390 9032 -n10470779 9032 -n09928136 9032 -n10750031 9037 -n10081204 9037 -n09857200 9037 -n10013811 9041 -n09894143 9041 -n10313239 9041 -n10082997 8558 -n10677713 8558 -n09787765 8558 -n10485883 8558 -n10275395 9046 -n09913593 9046 -n09772930 8560 -n09633969 8560 -n10195593 9052 -n09756049 9052 -n10607478 9052 -n09855433 8563 -n10017272 8563 -n10630188 8563 -n10522035 8563 -n10521662 8563 -n10380672 9058 -n10210911 9058 -n10382710 9059 -n10164747 9059 -n09782397 9059 -n10524076 9059 -n10467395 9064 -n10467179 9064 -n10698368 9060 -n09792969 9060 -n10525617 8564 -n10675010 8564 -n09889941 8564 -n10557854 8566 -n09618760 8566 -n09899929 8566 -n10116702 9074 -n10258786 9074 -n10508710 9074 -n09873348 8570 -n09870208 8570 -n10793168 8570 -n10098517 9081 -n10314517 9081 -n10629939 9081 -n10477077 9081 -n10261624 9086 -n10082687 9086 -n10262445 9086 -n10167152 9082 -n10098624 9082 -n10674713 9082 -n09838621 9082 -n10047459 8573 -n10091564 8573 -n10740868 8573 -n09872066 9094 -n10070711 9094 -n10628644 8575 -n10421016 8575 -n09915434 8575 -n10588357 8575 -n10529965 8579 -n10334009 8579 -n10339717 8579 -n09818022 8579 -n10412055 8579 -n10335931 8579 -n09945745 8579 -n10432441 8579 -n10607291 8579 -n10583387 8579 -n10718131 8579 -n10542761 8579 -n10147121 8579 -n10738111 9103 -n10159533 9103 -n10223177 9103 -n10185793 9103 -n10553235 9107 -n10293332 9107 -n10178216 9108 -n10563403 9108 -n10488656 8580 -n10619642 8580 -n10276477 8580 -n10620758 9125 -n10450161 9125 -n10043643 9125 -n10043491 9129 -n10313724 9129 -n10084295 8582 -n10787470 8582 -n10333601 8582 -n10131151 8582 -n09871681 9132 -n09981939 9132 -n10055410 9133 -n10243137 9133 -n10377021 9133 -n10368528 9133 -n10025635 9133 -n09874862 9133 -n10613996 9133 -n10472129 9133 -n10598181 9133 -n10129825 9133 -n09847543 9133 -n10173410 9133 -n10780284 9133 -n09889065 9133 -n09832456 9133 -n10780632 9133 -n10117851 9147 -n09827363 9147 -n10247358 9147 -n10282482 9147 -n10092794 9153 -n10375314 9153 -n09981278 9153 -n10082043 8585 -n09972010 8585 -n10237069 8585 -n09792555 8585 -n10236946 8585 -n10568358 8585 -n10207169 8585 -n10236304 8585 -n10734394 8585 -n10373998 8585 -n10595164 8585 -n10357613 9163 -n09823502 9163 -n10146104 9163 -n10602985 9163 -n10145239 9163 -n10267865 9175 -n09854218 9175 -n10399491 9164 -n10102800 9164 -n10102369 9164 -n10406391 9164 -n10300500 9179 -n10080869 9179 -n10332385 9179 -n09988063 9184 -n10375402 9184 -n10145774 9181 -n10143172 9181 -n10145590 9181 -n10345015 9189 -n10142747 9189 -n10142391 9189 -n10146002 9165 -n10267311 9165 -n10141590 9170 -n10092643 9170 -n09918248 9170 -n10671613 9170 -n10141732 9196 -n10145340 9196 -n10145902 9201 -n10145480 9201 -n09827683 9198 -n10135129 9204 -n10465451 9204 -n10353016 9204 -n13001930 5178 -n13040629 5178 -n12969131 5178 -n12985420 5178 -n13052670 5178 -n13037406 5178 -n13077295 5178 -n12987056 5178 -n12979829 5178 -n12975804 5178 -n12974987 5178 -n12985773 5178 -n13044778 5178 -n12985857 5178 -n13035241 5178 -n13043926 5178 -n12982468 5178 -n13035707 5178 -n13044375 5178 -n12969425 5178 -n13060190 5178 -n13054073 5178 -n13040303 5178 -n13028611 5178 -n12997654 5178 -n12983048 5178 -n13062421 5178 -n13054560 5178 -n12963628 9214 -n12980840 9214 -n12991184 9215 -n12989938 9215 -n12992177 9215 -n12988158 9215 -n13029326 9231 -n13029760 9231 -n13011595 9232 -n13049953 9232 -n12998815 9232 -n12997919 9232 -n13052931 9245 -n13050397 9245 -n13012253 9246 -n13001041 9246 -n13005984 9246 -n13000891 9246 -n13007417 9246 -n13019835 9246 -n13013764 9246 -n13006894 9246 -n13002750 9246 -n13017102 9246 -n13232779 9246 -n13009429 9246 -n13013534 9246 -n13003522 9246 -n13001366 9246 -n13009085 9246 -n13022210 9246 -n13002925 9246 -n13006171 9246 -n13003712 9246 -n13001206 9246 -n13004423 9246 -n13001529 9246 -n13003254 9246 -n13003061 9246 -n13032115 9247 -n13032381 9275 -n13033577 9275 -n13055577 9235 -n13055949 9235 -n13055423 9235 -n05430628 5171 -n05450617 9281 -n05449959 9281 -n05451384 9283 -n05453657 9283 -n09369169 1043 -n09454412 1043 -n09403211 1043 -n13086908 1043 -n09416076 1043 -n09251407 1043 -n05218119 1043 -n09444100 1043 -n09438940 1043 -n09257949 1043 -n09189157 9286 -n09475044 9286 -n11691857 9289 -n13102775 9289 -n13087625 9289 -n13022709 9289 -n11675842 9300 -n13152742 9300 -n13125117 9300 -n13129165 9300 -n11690254 9300 -n11669335 9302 -n13134947 9302 -n11676500 9302 -n11675025 9307 -n11674332 9307 -n11669786 9307 -n13131028 9311 -n13132338 9311 -n13132656 9311 -n12301445 9308 -n13133613 9308 -n13141415 9308 -n13137409 9308 -n12642090 9308 -n12267677 9308 -n12658481 9308 -n12144313 9308 -n12158031 9308 -n13135832 9308 -n12620546 9308 -n11636835 9308 -n13139055 9308 -n12144580 9325 -n07929351 9325 -n13136556 9325 -n12768682 9325 -n11689483 9325 -n13136316 9325 -n07770571 9325 -n07737081 9331 -n07774842 9336 -n07774596 9336 -n07775050 9336 -n07772788 9336 -n07771212 9336 -n07772147 9336 -n07772274 9336 -n07774719 9336 -n07737745 9336 -n07772935 9336 -n15086247 9333 -n11879895 9333 -n12576323 9334 -n12532564 9334 -n07814634 9335 -n07775197 9335 -n07770763 9335 -n11748002 9328 -n12172364 9328 -n12515925 9354 -n12560282 9354 -n12578916 9354 -n12560621 9354 -n12544539 9354 -n12024690 9303 -n13154494 9303 -n11690455 9303 -n12927013 9304 -n11953610 9304 -n13128365 9305 -n13133932 9305 -n13163991 9305 -n13134059 9305 -n13131618 9305 -n13130726 9305 -n11678010 9305 -n12136392 9305 -n11979964 9366 -n12088223 9366 -n12462805 9369 -n12433081 9369 -n09218494 9290 -n09381242 9290 -n09460046 9290 -n09451237 9293 -n09450163 9293 -n01904182 9295 -n13155095 9295 -n09432283 9295 -n11705387 9295 -n09438844 9295 -n11692265 9295 -n05237755 9295 -n09416890 9295 -n01956764 9383 -n01904806 9383 -n01904886 9383 -n05586759 9389 -n05581932 9389 -n01904029 9389 -n05238282 9389 -n05254795 9389 -n02469248 9389 -n05256862 9398 -n05258051 9398 -n01899894 9398 -n05261404 9398 -n05259914 9400 -n05261310 9400 -n05260240 9400 -n05262185 9403 -n05261566 9403 -n05262534 9407 -n05262422 9407 -n05263183 9408 -n05263448 9408 -n11524662 3 -n11448153 3 -n09247410 3 -n11508382 9413 -n11524451 9413 diff --git a/build/darknet/x64/data/coco.data b/build/darknet/x64/data/coco.data deleted file mode 100644 index 6da50e646d6..00000000000 --- a/build/darknet/x64/data/coco.data +++ /dev/null @@ -1,8 +0,0 @@ -classes= 80 -train = data/coco/trainvalno5k.txt -valid = data/coco_testdev -#valid = data/coco_val_5k.list -names = data/coco.names -backup = backup/ -eval=coco - diff --git a/build/darknet/x64/data/coco.names b/build/darknet/x64/data/coco.names deleted file mode 100644 index ca76c80b5b2..00000000000 --- a/build/darknet/x64/data/coco.names +++ /dev/null @@ -1,80 +0,0 @@ -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 -pottedplant -bed -diningtable -toilet -tvmonitor -laptop -mouse -remote -keyboard -cell phone -microwave -oven -toaster -sink -refrigerator -book -clock -vase -scissors -teddy bear -hair drier -toothbrush diff --git a/build/darknet/x64/data/coco9k.map b/build/darknet/x64/data/coco9k.map deleted file mode 100644 index 5155b652358..00000000000 --- a/build/darknet/x64/data/coco9k.map +++ /dev/null @@ -1,80 +0,0 @@ -5177 -3768 -3802 -3800 -4107 -4072 -4071 -3797 -4097 -2645 -5150 -2644 -3257 -2523 -6527 -6866 -6912 -7342 -7255 -7271 -7217 -6858 -7343 -7233 -3704 -4374 -3641 -5001 -3899 -2999 -2631 -5141 -2015 -1133 -1935 -1930 -5144 -5143 -2371 -3916 -3745 -3640 -4749 -4736 -4735 -3678 -58 -42 -771 -81 -152 -141 -786 -700 -218 -791 -2518 -2521 -3637 -2458 -2505 -2519 -3499 -2837 -3503 -2597 -3430 -2080 -5103 -5111 -5102 -3013 -5096 -1102 -3218 -4010 -2266 -1127 -5122 -2360 diff --git a/build/darknet/x64/data/combine9k.data b/build/darknet/x64/data/combine9k.data deleted file mode 100644 index 06a3e76aefa..00000000000 --- a/build/darknet/x64/data/combine9k.data +++ /dev/null @@ -1,10 +0,0 @@ -classes= 9418 -#train = /home/pjreddie/data/coco/trainvalno5k.txt -train = data/combine9k.train.list -valid = /home/pjreddie/data/imagenet/det.val.files -labels = data/9k.labels -names = data/9k.names -backup = backup/ -map = data/inet9k.map -eval = imagenet -results = results diff --git a/build/darknet/x64/data/dog.jpg b/build/darknet/x64/data/dog.jpg deleted file mode 100644 index 77b0381222eaed50867643f4166092c781e56d5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163759 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�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

ujIbhq}8PZ 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%0D7)C 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%0Dyz0M@GP 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 X$xsGJ9{%-|uyT5)jbl<9JD>mABxdr5 diff --git a/build/darknet/x64/data/giraffe.jpg b/build/darknet/x64/data/giraffe.jpg deleted file mode 100644 index a93e8b88398d94a7454f201372317a9414344c7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382965 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�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 z z;q?wI3VCfg6|s+Z>K7T1pUg;c)a3OACXWxmNPb|PB-e|)cc@gi7T#F=Ev$-cuqBy^48W5hZXsbtN!$-bJ*z4{7l`J&LZedKZbm2L z5-XavyuV0r>!mjEl%i&P4@Z=(6Qb%AVCaM*YK@SuR8pgVY;Nc!&2KNus1DQ;SP|$} zRtz{eFi0^h8$BaP!gwhM=b+z zfO~$uUYgg#>UKJCd!|8fX(Pv-v^1)kYv}?2rgO}}oQ|2V)RVxCk>U1NS)1gVb5rXq zB115eh_Gys-mO+s+5BkwlQNthTt?L2X&p8D_g;SXcD>lGZ+Mn?InO>edc;!6GG*%w3e^Rq1s@z`K|h0^{s^B zw(XM*NNHGlLmW8NgCTr}v%)B%+J|E0d7!U+Oafk-A z&iY}@Gm3%$&!mVyS>1_=i2C)c&+RSZu@eJjaB^YeVkuW0BTY$YK~N315wRDUl!ij8 zj*_-uiqdru75EmNaZaP&JvKuVJC01rGE8lZNC1v|o}>!ufvQwh0y~fMd&J4fGxmt% zMH>Ng2)CPqWi+)p%=&3ite?g$shoPUx#vU>gqV!yvDf(M3JBYXslulpa!1WO#^ACt z60cDRfMAsbl0y-J`hZ4$oiNhXY9Tb*n0Hf^V0MO_{H6)x^f~$ic9sbb3&614>{7cT zfssx6NDhyx40@X|o+L}rwD&0p5D76LQ=Sx?U- z{{Xw+qWWFSp{CVoh77u@W>iUm1J^Jz4mxKy4fZz+#jR4!^>wp&f9}OelCtD+ zb}V_lNTU?h1s6@n9gcm00Y}!ns;Z)V58>NJYwFb=pbfMTexH~DkN}vT$BYxzjpECj zabrf25lVKni5s^1W-?f?&Nv|Q2UXRV<=Kt)$C*cWOHqlkl0u#fbjpDZ(L`4Sy`qG# z8))c|o2sNO{{SD^6R*a95E5*u`CyuBJje&yMC0lJf^!p|sXEv7s@?f@K!^&VK--Ly zG3p{_Sj=Ka9Z%=Li&ssN+R2Fus`!q&rV7$YHl{#vrvCtv#N8JKvi1q8eUP|AQB*}$ z_^G7RdiTmn+Q{3C?J7YqPyz`Y0vj0vZ1jIhb3{~dO4MSi3SfW~f=Li0gNWdAGCF3q z9=N;2YpP0}>SV@Q`YU*D)Z4cqNKLhM)HX!LTo+NNM4V_;TU6nBLg20YEheS4!K+0` zR{sFM^!sD!(;ZzJy{m?#qhN**z>=UzjL8rhPGTVY7HX@{I-2^}5HSmYmyEE(O+sNs z`Ht5%fILQd)KDK_{r>V7K?VZym<1fyvM(u1Kt*SIc%Zqxw0pqr~?}am8iDao3^{ ze;J!s@*QaHw-i@Ox5PclM+`Hev!a2P`LYfCyJ5M8E>3(qu3Z(uKX%R1rv> zqyR{RIGztbZh3%5Rn_HIF#_*gV{k0?UGDMM+RCjfW?w+PZsQ@78cgW?yiXb$M#ddi zJHdDTPp#*a9C#JPYvrHe+LyF0p32^sR(CFdp-M^xGn#4&mZ`w38)p(J@_Lb^(W(^6 zF=7dWfC9!q0CGQ@0Q+zgJx`zF*tU6m<(8&}Y%du-j@H_^>&-bixk`{*2c8rlRVJJh zc+_1sk-!3NOOJ;9L87I5CPQ*U6(QX~4iKO&KwnImTm>ksWP<~#=IT7wNZU|B5xyoq zQervD%w{0xtrwS@V>sE{F>!pJ%Bh2+Cn>qMCM52V8nxOt7 zoRauUq|(wf8cS$fWk4!zE3t?&M&QTN#ZF}L0KuMzX;zez_{;`&pYC%cf!yPRAWk|X z>i+;2_HOo>{za}SZri|7pHzgeY*tXd+afQy2B_wv^4t+&NRhr2_)Y_=Afn!}h`Fm87Obq5=iRx~jrkk%W-iahONQuEMAVwH}sg81P15`5Bxxs1@fD?dsMa*f zmkLU$1xQi`)gF)oZ3U33w3&gsHou2FJ7H^0YOq(RgPe#Zepgs9d!9h#oMQtvrNXto zE3_=!wa9fwGnU7TkHu;{=+bGb;xg<>F9k)q0>+TriC`|a;`Hv3o)a{4vix1V)vWao z64aq#X(>$=;L9+2%)(emWCO`;5`9b{ZH}s+6E&~+gPI_s4@^jbl=%oILXVfca|Fj# zf#lzplCyfO#}{`Zrn`?b9E)2hs35Y8%of%gfdnQ#u1Pp86A15C$VlA&GE#4_{J6X` z;VR;#s@zfo$YK$gvpT6(UB`tE)3lbIidd{M=thrWQk`Hb4DpjYPIH3+jC|dJf$mn^ zQdViM&thx3?5UaY>}ny+cDka)xltvy(~Y?p95hu`Mor$r+MxQKL;G{e{IL8e*7}Wg z)Ygd%i&_3chZL>!LVIN6MD2~gDqC@+VWT9x`< z+-nqQnv{mZ6t4EEP3D<9KvXDb5Ge1^uGn^yvTRNSUsOD-&Q2TcYUq9dj2`iD`FZN&mNUToV^ACZ5< zF6>e7DeSeVwAiBxX+=3%R>?(E19>VLKvq@)M?~mrRjV*nNb?&CdG7=P1Qi69i2#!% z;ze13Jz>_@T}Ki z<{H9-Sy0#Ny66$IA+cxzU46BD(aKlysphg z;kH35G~a3Tj4GUh%jw;bl!8MQr>Il7qSdK5S7}(>ByB#D>UfY~5Der1cnC$be-Uwy zDt0*Mbh{SUSJY)8I*%8HMGjoNf-*i}@^O=ST~!Lh{Om zZ77AIRY-b`QIU~g6?$S0=K!KWUB7}s4B!K|)#;9pT7uT5s@5QhA&A>21w>9ZgPv5J zM1dBkL*}Q97=8(RKRWTZ6u@>ZdCqF*8Z0Ig2}OAckostgEEz_)cfVmE>SBrlf%vJp zTepTAQf2%#QBs9Kr5rOly*iWX0%jyb1IZl3!o6DyfI<_!SYXM52*fEM#tef5kpthU z-pBG|#d{hG+svatUu`H*fySWaKesg7F>OXWFUOA#WOY}gwCnN+5$BbqZLkzE?Ee5! zpwr>6h~Bf>Sn4Z4GJ?q_Hl4xCD*&uP1JDDOy?vtzQ=!46etTMo`li`V6}+{WIKDobqp2lxTi8qf6YcW4SfBBY&q^tZzg z1Xs~?(@Nm2LI?;}nxP0)RBwpf%M3S=7={u7lh;!GHYF^}Q-al7aUhc?1D?bTK#&9p z>3OhZJCWnBM7^|Po}>}7S@9WWLlS2bZUU#NpK(KNQ2VKY@Po^0Uo4*q zRQ~|(l}fI7Q~qdzSL`BZ1pSXzp0#YBgYzmADxr>GWWWS>Fc^=a>kst()SF8s@czSk zM6PPWUQK^tgjX;>$t}b8Kye&Kcts}v0FFaQLW-Th)9u+2L3}~DRjd)uqKgAPnPmma^Y7}$QfYzmtpT5 z;`bD~k7VpByIC=kX&YklA~21K1CGa4ZO#En6idHV>-hX|@Xni3;>D|PgH4L5IS?R3 z%*4()3^9(DFEv`0`hmBik_ZHWjFB_<>1|IOykLrw?_l|r9|C*nd2#u8 z(n%NxB7Z_jX8Pl|L-ZwGt#eotQ*>vve_8tUhH0#`D#~&i(XEc@N|+4ChS-O-*(PM2 z8zcVAl}mvhc||2pzdWipit8;3B9e(<(T@F~52^O)yH66$QOqb3da_tK{%PaZ6+wy3 zdM&PBYdzbW3i+JMZyOI+s0EcpQAr2cNXxe>f`Y$pRYHwM<4(5ORC=7w(tbb$0taGe zImSM{VD?mX8qH8)Q~@IejL+%-(0BM=e)gZ8nB^I5Y-tkyvPd0PIR)oU zmj)bj6EjcYH9;gJ7RZGS6YQ|;t7+6yoz+@p%YxfXY*0y7fd)*BOu+s6&ZUk0*r`v= z08=mz=3)em#6*6WKHU&&e8GK%VLJEn`Wd6 zBE4H_I})jv!dD(5(yLqfS2n~bGYbMZk_dw*G6y*Cp0KCkYukFwQrfVH1JnrzoF8C2 zbICs4czH2^H>A<}Zr)kWRSeD(45$t&CE}L>et@xrAuJ2HvpxYkeBZ>O))gx|eTW<6VnyL&txtJ(7^QK3`}`D(cOea~^vZ1q}R)}=;=;cJQ9&fTXZk@}7#{{Y*l z<));?{D#sD?HphikPDof>{tm^_PnlX-KmbW% zOG(TCGQ{z;caEc1Caua=s$mg>H*pXk5BjhG`jhX{>H6GTH>13o*wpx?b+S!474&$u zbMCn7h|E~5!-}cU$v=^%+IbOBI;)C^h)9X@#PHpcQ=n;_B{fh>hq|XuF z)$$RLhIfmzqlltirO)T4Y?6xk)N}lGP*r>m^Ir>Z^sq5O($o zHOQ}3K~Yb|5|{CN3!9I{qfF=R>>zfC&Ozp5t3$#FXj(13U{)uX9QXeKfBf18uJcP} z<9QZOmxfp?m`QFmaZ8yX)!LZt%1JJ8JoIo3T1MBu3ZS3gD!&x2b=$jgZWxw3Oiutz z;yvO%#K*r*qeHf?iA{L#?nx1!-b8h`{aA=gdEeXAz-;cOM6R@`n*mXwl-rQwI1W66 zz>A+{Q$9HAXedgmskPG+864_tHNl1md_Jlb^Q|JNy(?U(U1+7Y& zg$s27fG_sjyomOQE6)&phd?|)^ypeux#8W1zhn||!Q4+D*RD-#GTe?mjO~+SBI?mi zmtj6{yo%EGTH@m3v%O~;Kv z$(WyiemitV!n4^qW%emtWg3Ed6qu&s_Gt;Tj;*#mzUZ71rwF2)sdgpj?ttpr)wOo2 zu2>KwIGN5q*f}`FXQRFlze*Z~673TpoJ0`-Oy&%pKF7CHN}TI5rMnpSmF_zHH_%&< z+v}+(WRe5ww{|2_!52nNXouni-;#Ex2mqiP;p0hm!s=6kMZgSt)<$ zHm|&sB~BU-VnhI90F{Ber0!0asRg$$D z^lKV!k1F6n!GOavIOmZuC$kv#VU${H+#@})ugWvJWy$9;Z}kj>=9qOO#Up*U1BEx- z5t88>+^;Bzq+Jz8zSMOe#az|V8mOc~E2t8zWt>3=@~PS(edYw`N!07Hrp!yYExDU4 zWP(V7B$GMsi6rN*+!kyM`c$hz$gkkgLa%Muv@xei7pK14iip1BRsIqlq)mdk(Rut( zQ=glz=xP@B--Wi@x=AjO1F^U zg~Vn?Bya(IaUF-hKsBvY)??*mfg|W6CvPX7PDz4CR)eRjrB1-=@mPCH3*8m1{&=E`vsMJ0rvUR&Zh^A7RWh4~@U_h3Wyr|#? z$@c0qFso{{NieEF804MUSOr6sK#53$(y`ULxgJQu@#bxDX zItL9o^(pBA_lWlY0F~iU2}$b|s#_%$vjs!)WZ;#MXXBYL?cnH7e$!lmQqs9js2+0v0BFaoz@cg-)e2U-2ljC%pWi1%@odFaS@> zxw$2dGu9?8cm@h;3= zHQi<{v@zNxhCm82Gb3!^`llSh>m74a^X>&n+zf#;yC?G>Z~zhx&;a)7F@YZ@zsw%Y zviVG5nB3R>wNagyA)I$ETjY^L)SIv&aw!9`l($r}gOhuOie2HJwV#pJZf>)X|Y96m*E~ZJ*){eNDT< zV)~l4;kO)ISAP;EAx^xD)3v+xzPD;gO`$=ShIUhupa?1eFi#Lb&U&3~aI`3@(owZ! z;76#58;>M%Ld^0{TR$wSHC1Mq$riQ4`rV_`a3mkmqym(`y__up~lX zW6qiL)fE~%A+DCYsY$7teqyscOl|dJkC+_ESSXMGb~!NjK@Zuo%a$$5EX3O;d%ZCgx9I3 z%TvRaVyz~xKze`*(;`91*&K-&`>>8WdGQtJn@wm}X;<9Iw?3s9-^T)E9PsnV>2tKn zD5`{UHE#fEj&>}yn-4G zV3JNwGN9w^I<9I^w5f9UluXkgiOg;&fbs6!5%)bD6D4~KZ(`FuX3V@}C4|8(M3GWu z+eT#iQP$1DP8=50-$iVMNK2JP>&MJAog$mu3y(~o_Y)9A822CnApV_A{1dfmz`oFS z?aw3_G4vde3`CstHL=-lVY>pSE40I-#DCIK<3zVLl*AYS*B*pEyz%)eiK>6Ql^zv- zI%yT1fkydLgU39d)PeOJbw0}et+jJnq7N~FFwnpZ`grU~Ad&NN80vU?Vl}j@43fha z@ygnpa6x8$lBU>M6n^@%K;trynq_sNB!~ouPjJ0H;%H>l@hCt>rUR zCAei7B)}Vn2W$_tbUN3Y&W}6Ip;hdxH(>6an`LPS6|OvYD*7k#2Y#kFK!~oi-_%Pq zBy5Mfg3%fi#ml6oJmsr+Ui!{~tEb!xdu2wbL(`uvNOr2wNmK-rAylxCgU|r!9W=`K zHzLN~J!T{3lElkS;WBwW%mbJ`SzMnVs`nlvkJ)$^y>UGL>jQ~D8I^^(VBtRe_hyWn zM~2zb7Zz-(EwnLZ5DO~I2uLpe3QMm_6UY|q6XAc4ys8G^$TS5 zcf>lP(7UIj+|p9Cr`7WYejctM86*HkKpo7Uhf?;A=<-icvzP(CTjaA0tOaX$@6ax+4nD&Dv0O@4i(sK6hpwZOi znQqI&ugS?cL-w@tQEZj@PKuN>k}37>`xV4;O9-M;4EnGC0L1-gr`n2-cJzM^wAsT$ ztOQ8;ih58)LLLwa`fsOh^-_yEl?o2wGxR&7Qgk{H^?1@mRIZdRkR)O(Y3B z7uQwD$Y#m%(1N=_1n!;K>Au%br%tUjs=zA&I2i&bJ+MF-_c7nAN5}Q;PA6%IOvm*` zy3w*S2oRx_`!sG>JgDq7bs>#{FK{(!x7!dyLXgXF(}$*Lvlf}qQ3PitF^|xnF~O591wM{3pNC1dWaP6^-H8Zlo<2Taa1GzO!;x z!m6c402O{g-G#^#6CZPv20Mxm0>yRaO+OFLtsyypMu`T=kgk2#8*PgfhAR>~vm0VZ zMn(A}(cV-_G4&$t`4mfwtDO?IrDB0@Y6pplnsXb17hS}}$1*30>)O>8>XTNY(H^V` z-SnIZB1s|ygPD`k^NG^rxE@aSHdrQMLwHi%N>*)|NH%d~t4L8v4oEZvW$uoA2_Xvg za7Tm{DEiIa4NA~mdFb@vca%Hnvd^qS79b6*B!U=9vvU$IZ4FBPYY`+w07%Fr7zRX4 zsqghLI%$Iu@;^b0+0WbGQQ)p&QYT^7l8hiD3_CERN?{|II1W10*JelbI-p#(PPD28 z`B&F9v~57pxHLze)#9K4ytOru+ksY5<*G4d3^EbK(;>B`7 zBcEayR*3Nql9!iX{Vi#9!uZ?^io5ADmNd84-A$Kr!@kFAWstTuk`$nsr=kH;^;15% zpXOn;a@_6p5d#JL?&~*j;GR8c-LngDWcE1jyT!k4kumzLj_ua0?3-<#@mY-APUR)< zY_9SVzos-rX~uxPj&;w&^lvr05oxCvkjh{x?NHGyT%SoQyHFKicqirQbxXeTvI-dj zKqL_&SQ(IcFt~y{o~Qec4h?NbgUrRS9lIw%T*hXtn@nfg5N9ysDs3CXE7s|K7t|oK zsw#$vB%RfNB;NzITRJuFg+-@$l`3ymX<-#$0KL#nCwHm2ZN~8?u zy31`QK3swBx$Dl`LTp{zOO0&3Yvgol-BRTGyHKsBsz_xXD}IL@ZIEe21{r$zNOBXq zV&Q?R@SNFJuWl_WTU=Tl;a-~tJAp96d=O6XVqHuZSp%rlmW`E1yQZJSTwp*1@Y`6n z0U(a@Ip%B6%OCnxU71;8mf9VxTQND4D^^WC=(T)M9BY-dVH!hk_WmAq5<8s@Q3?1tlg za)G$Yyx&3)PE%&D4Vswv>r`R;hM8LvyX9&=KA*?vc@TFSPVkW1h=aRVI)Uqvl-@F z7oo{=0I%`7D-F;-$W9_B!#)huYwJ3FwM#W!%e)^vRNGa97Wu;xj0+qxx0t8Wc6FYc zX+^0mXU6^~lN*Ruh$lV!V{jw^)DSm=mRY_jkYZJA+2C~u?21~u$DEZM{gNL-lPH`~ zG9`Qv&^c5DPQP&!`EKa?U0OO_Ek57{B1^;oPp8;GQS{H|nd_oH8`EkUY63$UXo>7c zeojw(@s6C2Eiwwdx#7N*YhvsgiY?n~Z9JhxMp7hU$JywOII)04K^-xSjl8@OHigP6 zDi_0^3A5c+y;%x@wy&|k$TRmCIXUC2Bg9w#0Qyy&mfBBaxN{TqjBqjDdSkywjN(q3 zw}*&j){~{wRM$FDet{Iy1ewpY%d;a13W+Kzi7N1ls;T!?UzP90WLq2id&-i_EJ+!U zOGI-ec^KjV>C@ru2EWrTX(R)<7(9?NL65K;{{T*|=V`!^uQ9Fbtu|gwBBC}=K0dRJ zIbH@D2@_sNSpzS!02k0aN6MlQqW1p)a{Sq)Q@Cro)k_c(n=2n}@SvZeCnRt)$3^b$ zPznry5)SoW`a$jb;B=d4-S4;brR{d4^~#pS`)Kg2@!Mt@krqi5u8%^N*CYh;5_Cru zc|`mEKV(%+KH{~BsZyQ}Hzdd^!Rz3J9AK5 z+2fS7z*=$};}02!1+p5raTTQ$X%&(6w*LS=-(zRNcI(wpRXKL?1xl8sZKY4`PW9`VmlRhGHPJf!fiR^Q^( zuU_Q(_Cu9H9y<|-#51K;*BSaCMOZcOnyPGHpVC8g&r@DT|Jal3pW$5R=Uw1u7GRn zQEBxK8zbt1=Nxg#s;B!^emdA#U)yQ4>C!uaE?6Oz0LBULi6`oN^tSibHE)^fuGbp^ z?hwbEkL)|+u5R~cQI>eUQ>w0RCE2x;TMPGfj*<(li&5NA?o7BO+k%8<968wp#S5t~ zRYR7lFR8u44V2_TB6o60$J7}e`0tn+?fn~Z=Qt|bAPX-cq@@==?F(*oMBx+T-L1tsblI9cFrjcW z0REFOAa~;(Rd<%GYA7?9%ulC*`+uiHjrXr z#owRF)1wz=RMYz0vXSA!Z&A0n35GFl5jh&_iVfrIWu@Op==)&ec*@;l6kj1SX4 zsW`yu!60qjjji^5>g0i}cp0?u5icSY)0&(&c z73hkXSz9OI>fW!;#o))N1AqY>Nz6~Q^itBWTIv`~ZTiN+lltc{aXe2)=(;~y`Lp`6 z?(K!0*3HQDMzOHA%dMLBI1*<)9ngVL(mLS>rA|^xeM9frwiHL~qr*K>=2{y^K87Bn z-)eve82s2@-ZRpj%Q(5B-Nk8E{o*|R0MsfKRe)Bf;J zZnRr(^w-{$d4^X{gkqV7V~)YJkyH|3LQn~!f+ntuT#sRK9|c|&I;y8t;1}R6YRdkT zRG=uAL5<2Lf7D=(m^58})zux`AuwWoynj!*>HgYSJwCh1DSVakCW@}A&a+b1(=}6d z5G17RxtM1h#T)I@sI=h%iaR3+Rh3(qWpJ^aK72)BS`}r7KBU=FPFL2< zD%RRxvMQC2UOvjdAN&`m6u5fq#uOd6;IV<*oSuHBG1Xb|b5L7-HQ>WkXa;1764>LC zGsqF1M_l7Yd6bZ{5ah3ZQ3tZ1qAD-ns(qA~`se=ux5rB8+cx`uf4{Knk8UYG&4w}l z`Q|#wYU0X2)WwpjHL^hnlb-&?6IDet;SmuzP809{0N;h<<|fq$^nAng?c3}7b+Awy z3eh>7jt3ZyWd7g2dLdlx8%z2+C=E`HRNP4IL2+x^MoMcf@}1syvXMGUyb*o5;D7X= z7HqsPPTIXkDqC?ZHyH{}VOAh0Q=-Kf`sI2B$$r3SB1?jwK*nVd-Ej^yWnGt@mQWH>BWBLFd1mF^8G97e_ES5!e2JFiq< zvakGc%6$25l~}W7zqyQOx9!l&OMy{{AeQ}SiJzo*!N)}S*EudHNiy>v$Q-qp<-s!X zMg?W7233XVe#XfZkx>arueVY~MN<2G(QitE)Cy5{pv2^Z_B>~U!NK};#dT7ZIv!%Y zId4(_0NM;lITJYJqGd(e>+q}BIHm`SY{ss!)MCURH(k{HjW3&Ipm$d;DZ438t9;kDw~3VB+n!XBd{<+k^vLA z5@LD=QCa2kl&NoLSV_bq$$A@}#|Yy=M@<0UPw5p=SD*O*0O$K(i(0*!8o!64!_1s# zk`6Q6eSNxtPKvTEDnx`3OmMUP2l|QPXQyWd%C>H=v4sO5n!7(7hU@TZq8+kC7g}i- z)bU6ZG)CGkQCV=h^1o!~f<#{)crL9fi)C`YPUvF5D@++>6P)0Z1cCc>Lh{|C%iX+8 zD463CSYrneP7m+a&st?U-nq-Ec5>uZ`2G9x#(G;w5t!Q~YS%NKTEk+;^LEJ=%$2@ZYNDCR@BR?UeW z%+C3U)t1syrQ1l2FmJTuZ?+HGj8@bMwwnhXQ3nV_lu;A?-28*9={EH0)U&q}v(zv` zl0hK>JEZO&sP#eQ^^?$A)YMfTmN76f#Jqh0kPJw~_4RnP@p4POe}>dQmSIyFMj}Un zVIhYV_8*XpgR(@_T~tG9())H$HRM%Cx6JKy58x$xrizOZfN(&V1|mp-o_UOpva6>G zrKwW{iO1I@0sTSFCVr=^&6#$TI0knJlA}FowrbUpknQKO4T2R7KK5R$M>CK?%j@lpo0x@AB`x@CTD~ zO|3$jVH7gJ843)6^JlnUb0R0LlllE9 z28o&A9(xQQeu`;CekLiVU<2w9eM9A5GC;sH^nun_kXP8Vw-|bCDtfr~D?C;^&)7EW z5Serxj%*P!3Tmm!nj3^E$5J1+-{u|)pwzUYENVo8atV`zx+Xn@06{W6!LYnXs3Y6~ zSwLZcScnrKjAX1M?$P=r6!`B5DJD`fX^iZE=Zn}Dc7Rb zpc*73U6>K`akz0ARfr1tItNn zzRAzp{jyqS+tLE=f^*DF=a07?J6YAGUZobhr?!^H35nkF4q{0HM9<2g#9;L<{{S33 z8Vx&_SmrZqcX3AgGo=a|qDORyTM_oKWz`X{vMT+PgyA^&2`#PN-Bx`BsmF2p{{XYn zwySqe)sWm!T85&BkP;!L0NkYFIGl0XdWvnFBRJTV(ekZ(t0Cgq20vXs`z30x5o)H= ziegV{1FRgzUq9UaV=@7EU=Z6U&$~#is*MTZO>WBF#f|;Yb5(+=YOKiUDYaE?jsT^+ zrASkT3O2C>0v?sAw@*Hkvj!#^jy*7aGDoUd7?J+~b{D}tblr|O6Ju)p>v4Gfkm0~{ zF9Qw5<=M`^1h5#wuRxOe#;^v-;T~B5a6}9Vl~ET8y7;r>o6S2>{1w$2RobZqYE`bZ zg(0vp0g(gKKADCkOzzx4D5Bbktby)db2rNX$dIN%5Fl>iN%sU8==bLCYliKMy=PIU zYxZul+ZMQF%;MHHZW{)Ttb*A7wYecU5dO9#r&c>9>JxPV=i`{RZh{gTv(>BG+6_}v zG-}hSP$gFLTBgDqYP~;CmdmuA#wn{HaUlsEJ6>6$3UCmXqBpXyVD$vHeqWRflEVfh zbh+*f*Duz)n)6!b(zaxr-p3j&A7tb;)KwM`t}(vx=GH8Cn_=dV+XfZMFM$0+%@cw` z52KBv7lbO^-DxYUk1SIKUVtU#cdpu?hAL%=ib04~X!RO!#csBZQkAfUB~+cPV2B_Q z#(4neG5|0)62{`pXZ|tf*>x^ii$T4oi=yYIxS@T>mXh(47gBVF>zYJI8vX}ldsGFp zG-MxtgWJ=V(4@?$njLb$} zHz_@gf<)#72sn|^6H0C0AN6Lu@i~o^(O2h)^mtD^0B{ zn@e$fcSuGyA0oM)RRwst*jwDA4!g-zHQ6s!beD=gc$ zCI0}WM{E`lHir@%(J1C|*Qy-W9X_em(mtKiQr6C+SD{4P1gA^QBtj6Op#j~RhzF_Q z{{RfA499NPYbwZ;R;3VWZ3rD$843Y`IhM?BlPke3)Pao+^e*mgOMT(Dl|R2y6stIQ zL0oaNJWd-x%Plu+6-Vf#!c%Zmi5q3s+;mYNF2X+-s_SesZ$HPWj6j_tnec-*HVdq7-4j-a~V$f#7g9&f6*&KX~nV0LXi z4mLGx5)K|8Il}}KjE4F@6%6KvK%CK?xO zZ#gGypUOdkH@=qY67GuOez`nDWP(m7Co|Jer}Hd(#a)N7vaJ!CLd~+PHlfkfyNXMZ zVQ*Jh^j?-I#Mx0BX{%FUy#V8FINN-_ob@3xC8NFV?}zK$YA7hZCEN{VRitV$ZKbKD zLdKfsaApOhMrJk9)aY8&8_btR06~DPVWZQAGa&k-IDyb#CE5|EY^p5dF#iCmR`~08 zv3{{Xa0r&i3<1WtA`%pB{!A4cX~F17LMA*3CRf^B)A&$n^xl`^Dk~65?xnhSM%W~v z%rhyKf>4i7OSI}OI+YO~X^uBZn9l+L5D7T%^(3*kerf6-+O^(l-4@y0vatM(W=h5O zH7pF570er#T?va6u$uX-=#ph5N1HCEBh|!Gj;(rCepcQO_-%V;pNFpWsa2>!{tGoG zN@&b!gjE3 zzlU$HPMtxVR}}5VP4&rIlu2hmNDon!m{cItsYt@@4BdNA%qZgFg0IOV02VU4XC%OI z7a?T3Fd#2U4zJj|VqLmG2oA+yD{Lno zmVk+)^^>0*ylbM_CZLOGDqP(JnI=J^RY|5QG22K&ih%zBF~b65pw(^aC34A8jLG}p z5dvUs3}6AlGlA8FY#hf@-{82d=JnV(J27hk$8D@FaH6T0Glif}psueEt0^rx8J5B4 zCJ322>q08PH`#0L55RS9=o%gwswlW0Czwq(=WD%DwZ%ZhvNbxDa3s&A0OHfC~|pXXIXl+ZPyS0h;+qI;RE2-68fk6>d&xfA~b$dFkL&;hRa#&QTDhFlrH#J63OQV3rq_8zh z79g%kIj0Jj6_(!l%F|JXVI$=*Ju|q#5IY6I=x?R3e1r1aH}V1|vB7pW6wXl}9$k=_ z-ayfgITiZ!fc=abi6+U<4ji;ljLZCqI>;e^3v2Sk*C|?PsczP8gi%U{m}LI|no+lH zdcZf8B-4^pBXNjh*6S@k%C+qpRA_|^5J{6H?N?$xXgi76aI@{!kH|X=&r{`c^_BKt z4`Ad_@u#I{P~gXxT$zBacrR0 zS*G=BGZISVsLQ*O$K<9?-W-M-OsdsK>}eugH+7>tfJJbcvNjeO*@o(M7~1&j4wfiF2i2(xXmc z-559V1h(p^s;jh?DgYqtjjRlUBwg84w{`qEHMcCC%1{D$0t*7!GBM92KwL{Ih*im%_5x@`3N6zF*(5}E=C7!X^q zo^g>qr>o<^h{H{!qn6z#IE+aLF(yAwwq9Ljmb-s@V+OA_WbQMLF(BSm=raz!GCnL{5KBne_{*W}lirC?b2{8UFx(->a4V zB(e(q!*6Gdu$+k{&Z9nTYL;7%A=i+3S3L&Wj|;*Hnj-SQbGB8fUg)l;YzjS8MZVRiM8U}YOoV}9EwE??mWZxy9! zsSU(0#nU%iY`v%|sII9WKkz27v0AiRqVB1HTejdJG;nj=#!U0n$4mFLd0;8>6O*=P zCy@j4&mP06P8sAT!PePUNvy3aV_&g4z}vEgbjr_(Hc}r3+k#2Ks+q6+{fN`Ftz-DLB3J9{U$S;MA;N^?q)Jh`B6TjrBktgS;5;JsRY`4ilUvPl;>F9aYPj={ zJnR0lB~nx(?x?D(_h0Y+SCsp4^0T{tG0Qt{V;Sc?TC}M~)a)=j4y+Rt(^(!%cdHx3 zVk9g>C#R2KFFZ<&#aQAkPkq%?{26V~QsEcwj-n^se#*(C*SlIPZiJe+k}wz;Vo$Q1 zlkN5DC2d}nG^%R0X_7I?oS+|4KetUi6fFa{HkAX_@b9PIW9;`2V@T^6b5L630rV0@ zjD#`MhZFk+9)BeJx!1STukWc^Z$5}pd0MKSvGRilJ;%N}Uv<=NEZLX<9Q(niy!PgK z&)20NWY_H0GE9eO>?kK+m%lB`NlnR(>E**7%Bm=zVH7kGPBg`_U<(}mV zvmPQKb^v=s4w~#5-kmj}Y(~WxgFJL$fwr=|7fMjx(NA`5y^dh9p)d^#jY<%L*^_R8 za*l^*0QxF$iVM#@kx>5tg)VE_+0<%gHq;aL+a`VU5;_H|+tICg6$HY5(%jA?gVH(V z{u!sUY1!PlF%QMb4#(6XDev{vUtUCE9|uTUrnz3PRVn8;^ExSHP{!9Ut8ET;XVM>aGXZjanHFvMt@ZLsPKs7wIN;;g=$K) z>Qbv(ujV8`-~}hQ)RJS`KD{p^)ob8ZCysxcm_KOa9fwu{;%|$7_8wt|zm`~5zU4o}iLf7EqT zMv7R_8>=@1>D->){Rj7F>MgQ%Hg}TKYL+bO@HP+VIzn(zopBpaVi};J3UIEec2xXT z2|nrY4~YD9?Np_q0+_%t&(=?GukJ@pS}%hrTha|!Zgcnd{{Vm6pzhMud1mkN_J>|% zTPo^DkSdCNi$NY|$t>F8gS_kGyp69g{ zezs~bYAS$<_XZe@A8ti^s`LH)yu25t*Gmw@<)HqGAZLu3KTbO3Z;Q8P=Jjo;fB436 z+~x*7quhvr)o53?+d{J3emJ&Ga)R6a%@G&+G5*lM`1}6=>z}{F_kpmWPwD>u0N-w@ z8}?=*m$ z-|DmtG%C_S??3N7d0N=hLL8C==6~L2nEwFcdn(FZaJLrn1c+u}4@YoAp>SVrKHPT| z;XeNW-`oCvFHp0mQeKNpNF$yt#`&yMyF4m#xLN=FyRUXU0ulLuLPq)md=|Zv)zbVJJ^%>95^(x0qb{nXAV}b_+ zedqrG9ZG1jc(#~!(yNAS9GLDwxsKo}G}{8(%EP3hO1vjoji(5_amUFt^vPf1DVF_v z;!pPD`}9)NP5%JUJ-t<8JuEw%Nc-eB-vW5Ru&yk=wqe7xfhxL5BhMSkfKEBjDxj*I zD*d?r{{W;<@8-p}ML?{jS#SW%dryC_P@cwUO7=;%llPd@8KhP zb#buVlTfZio&o;=$1@ZAbUAH}W`~^SL6UytbH-*mGGG!hi`b7;%g!Ugr7290HY(h8 zQ#TW_w(kegu~z#is;5;XUU*eh06e;NnJ(4foElp|Wq7EyxZE+*mPsh*g8D?Bq@Y-d$Eu3PC%Z7}kg;X+5h5+gdL|<|r?HA^~ zR)AMeE}rnFL5%wej^s?{J9oyrYv^|0P!K=>bBu{@PB35sb3bif3A!STtZHPOex@u) z1diIY?EYK5kS-ISQ6sSjt<~%xJyl1jiYkBa9a){4Xwx2NA^`w{-WoShm>MEtvu?ae9(M?fBQ52Vj72y?JC|Mw^l^n%QunsXG$Pvur z+xO~iomP4LI~gWmWuV6#$iXKZpKg7!>r78vWwWM0avY+J$1R00%ETkPKt#0~}J_pA%q z6lTVG$mp(!p>z^bG$l{z1%3+fkHmis_?DeYT4nHhn;05mQld;lnr^F5Z8)8!fcFJU;zBJeBbR1l!FiOMfCHfsG>SzFexSmLEvX z^)i?a^WWFg@gydRK~+QhPn?b8ABdhPu<-?2sdniY3K%swJo*a8Nc)Tc*z4A(LaH6m zKs?DjfgIur$L&1zRbE#3Tajp7J7(={BQVM`e;#ou^z}H#WnCebTf4R+bJrKTFDqvW zp>!mO53EoAN4h7@wD@`PZl1MGXjVX%C0M$EU;qJ;hymtQ9DzKH_44bgExhkAg-wcu zNrrJS!yKxX+&4^vz}wQ>fNp(pIP*(c0>b5gSG3Qjj}n1LP7JjCG07=Rd?pBtuNTH9p#89yi5 zFHIWPE+xm!U!2QnE^XTpn>U^4!=Pgx#6)Ex2rKbH@e>8%IWEHTmxyaEjUb4i7Dh!v zN>e~~kDXW+Qz|)EG|5;er0>SmtyreQyFq1v%tU_Y)JG<8K)<$w!gevvu-Xe z4IRaWI!Zji!*Wyee~Jx7Rg@)Cm>}<9U>dD-R+1o%gK?3AEXyVgdPrP}kubB<<&$d5 z&Cy-sCPF(`7it{JSe1~hWI}z1FQC5_#coUkksThAk=5rM{M#O+W@g|UXwoZqb5i_0 zmBo&oMN+y*0f-@4YG#w|kh73rnZyFVqtgBrwy#2sx>NGSN|Zt_?io(z18D@9-0TN3 zXR?mJAMxur)f!8A__s({o?U$kx*L^rb`3yoy3yxSPz1^E57Ni%rqq;I9^`?}py3x~ zLb9s-M7h$gXw}sd%cWIGV!N4$+yGPqa}ccxU;8$0XV=aK8lUMn^^Au0K;-$6ujnxRjhLh2rC|!KF6as0-TM6IItWhV<$#p z523j2oOM{L(|rw~`>4Fz_#y0WQ(f@j6{xEKX<)DzW)gWKcMw3R7?zefAhqME)4Y5C z0QrDCl^OPs1OP&=76O%k1c`2u+qt_lX?W*_<1gme(b8e}vg)XdBFHOPkx(wP9UZ2P z6rFZ+qEE(01sxS&1(85;5yBsj6qd%vRj*Q&2H9I{x0a4UKCj~z!U?MgMnMo7W zDjHy>=ka59{{T>fGaJ2dBW@Zn2Xhmif)$z%Y@G!j+{g8^*)BD2CZ#Iu#UmAkp-Eo z&2C!@Bk8LZ@liu@r3CIgsC)-Q!rDb&5LCZ64EF+rJC>#t0>u`t!kcABnuyZ?7Xe7m zQ|_qI6%7Ik?b=De5M$*hiGU1b_JIVD;^sakZEFj?5qaZf{{W4dT2e}5Ag+-W=#E!p zF@`X*(yAD^i1WbXeyL(TU2s&$%z+ZW)-(?gX{L_7WvC09d$%hV-Wrpuu-hQWQM87p zN!mydfS!ccx4g9?p?$(&K_tXLlGBfP9Q%MeUQ1nK!#b5AO}5e6uF?#7tz_-e+Dde& znPk~^^rEz8k=c!lLtk*Qd)0P9VnaSsLK*+(75FS)r;R-)c{yiLhs?bSg zN%9#E3ANdT?kI|-*;BeFUQnNit#5w=Mva?NH3(qa0Ny|$zso@^xEK&d{$zWF9YL|9 zQ_W|nzyf1FnJ_>RkO3l3=@>E7bA(}@GPX1NAh3|V0f3d~Z^tQJq~;@me)$LbD4JUMM& z5lNw0jk2WJzUStg`o&Q>RABMHfHaLtznX1`y2V`KY8qthrB$Jh!p3&4GFbBmW#yf_ zRNl1NY7@Q;?U5rO7zQQ?B4%fz4kslt{auyT>rGRqE^(}8HA6EbKV)^;9zqE^VvEAT z%vF&k)szU}M*~L1mO7x4Dx90U3y(L=y{ySnDluFtgGI+7EzGzY+~xNHO1Y_FE+lHZA@F#wmSe#hE-{!k^lqvY8@9bxR4aUAQr2m zRjWa-R5MbdKxTqDAO)B+JV-r{J9Dkf@*LYUuFCLv@bg`Jsw%BuWF>-2zndwv7NHD5 zelydA!6d5y^KFxd$u^?cp@Rd#dK%3OV6ABDP}duLz^U_sNZb&H+6e`=h*Oe5Y{u7o zM^UM@I!wtyioz0ht0*IJ7$z_=kPIk{bz;6b`3+d*>71VLVK1rSBGcoETUIIC_n8mep8yd?!%fi@K)k!PLHB1{rbm$;EI zo`y5hRn^7PFsW?-s{*DsZ6T!kahw=#d-bEuOCIuSp!W7vs`loTjbo3_nBK;;^|?`N zF^^<-AC&Y;*7>yI$#JKiCptd}9*O`$3`TG9yr67^&rh$Ko=1TLcIDSh^fC5)TgE1*43>=HoI+rq@C=fgac}V z$^w-QRmlW}*nmutp{Y7s1Ykl`BX}E|AYg@zm6H(#frdElM`(9|_)|sYA2WcUS#I8c=pd$v-&FImbJO|#??5r zTpZshzetg%PUpK7upO1|kPF-Hrb`S^O?eRZa=&!>OMGiuifx?ws>=WuB$g2~^Z=GI zfu613g>@;gx^p2wQ=aFK&`HE}{eHa~_C}-If2WSSq{xnLzpjawUc-1F6ZFe^+9Y@4 zxS_%!w-g|@hr%x@${?!!o%}JRt&WhiQMYfZ#fkf19?}LsuW~vGuj<}&Jy%#hobkfQ zBk8(NJ-NqKedEpUPaA1h)km;(sQ&=uWW#n&Jdu>ss&IbAR8S;Q{{WsB?5bQZ#h(`G z3Mf?s5=j35UXJ)lsk6knEh#K=?>e1SB40aAnEE}&|D#wY4OJf<7 z?)M};_%#N;{{UtDRM(E_@kdrPs#}|CQ)Q>*x7^r*-OCJE!D zk0H~01o4b-V`KB4ZHv~WM0e^)m+1^06*k2=R8?PNM1r5%FIDI7@l5I)mwiQ)4YWZL zNEx2|5%fJcSk$My(LAgl+;r;ryF()d)_aa#>8Ez11+uPUmD!HNKV;|Mbrl+hq=|?VX_FG3D2@X2qstR>bK}&TyQ9TlPCvqrmH->6NqoRD~d#Pu-T85Q=6z^MFqhXIP%@u{O7 zyzW%aTaUO;I4vq7qQ_oDfBmIzlvLq)!&VX zZBdMp#3=RvK%cL->(IMI*G$GWHtpNi^S*|Brk4_?Au?&ic1waz7^)&C2*XASslk6Q z{PXaChLdXCUXu$=HV^vVB>w>IAO8TBIOwN{E1I_yEtev9x3n)4`oSM=jd)G9-;>%V zWLXIg(=e}*^yg(dbA6w$bzJDA@~S6B2?-GSRWAPkZhrp&8Z9W+y`a>a)mE7qBneY7 zlfYB@@y|i)GFjY*1d4CiW*BpiuUkg-hC6|3s1RZ1bXjgoiItvB6_%J^SGCy9#$(js z@z}t{lQdCJz>Dwp;Yir%i$;qBR5PPBLI->Ry!~L2`y6yKzNGalkZF}#fFzPT5=?=> zi2(ck`l0>3itN3EwR6oqR^_AyZ*HQeq!=%%mJwqlMpWEHQQ-Z22rmW7lCMN0Ec}EkTO{Rx;z-BrMmk(;k2aH4Q5&Ero&Y5O z0Nm&1&p{0ZtCFVs9rIOIwe`D3GR4>4+asw^A=DEOWZ-Bz2A$)aY1kTgr8B^ zQY8M-6Q8;tjVji*v}crdtSrUtn+= z5RTa*BJjUr`|ybIQo@C0t60YM%8%s>J79ME3?FWT*1UQFG~wz(2tQJJC%pHc>(zUH ztQuYepg@+lCBNmLRD0F&twK_>+KvOzH&aYu;tA3E{b$=kT(6aN6TW(510GmH%N zL>9HMYA&+(s_x)rbx>6yvpPF&G~9zzPvjJJ5c=|}sHTXk{{X^#yJ|BLPK#i%C*J^l zJ^q~!HA}4;3^ucpeeePOq;?#4&rvDQ%&lf2y&6fn<4wMcAP50ezu0K2!m9E2MNhXJ z{{Vjo(WJE)fM8@}KXK7&6c(e94014J$8q-m09@m&s22$?TQ2a)P61RzaL`lR&jNtw z^r^?+h2eSrzG%3!*o1yx^zS480G^`VY2I2D&flP%cai>BM^tF z!~B|5R4&NBWaE@Y@Ki~d(8Cj{VFla6qbM7)D-@hNHL>!ry z0ci4zV@a>fj>WWo>?wQHkyE!P{_*T3z^W=DqVx9nzo#)>*0e_5q^Zvl{RjHbK`g%! zPNPsV43J4Zr=B_NNICkRv+yh2TDsk7%HA>8S|hcRN!Cz=TX*f*7mg5s`Z%9-PvcHi zf8uM|+`A7kU}KN`pZE0Wm7%>_gw{w_U8jr#!GcEy8?lkta~8;|ifz=qay-Z{EH_d! zuR2P?i3+NhAgZE?$nnqgy#15^0CN!1w)LSb8$1a1!I>ki6e|7=4QhdbX}|#eIT`x@ z0K9GJ?wDw=tK>_zr>T9Gn|WJx1YY3Nse1naq7>y#IsX8Z=l(tfyR%{vqJYi`{ReSA z_>6Qu>XpLNUnuS*qKe8aA z{{U#8`uVY|B|sjXJ){heuYTRXUP$Xr#mxqXN_!-6?tfV0xX&bXS9>v|b~8;uu9Xg& zFmYcQnMmqJdBQ|__XN>QjYI^$6%<0{Q8@d28LJhjRVb)j9n(4XgCGOPxPcMhp!XFT zr8lEha~_a>QGq#(mXD+u?T)wGF3t@2n7lh-{ejji#g;-8KxLn3DSspFr~Ax_1e`uZ z)lF4ZI7Ilfq*u7C&s1$;G3<8Zf&d=zGr%7GPit+I>2FN=V}TKZBR`u0Ntq{%0nl!? z(b1JK8)l`yU?LxMMpRGktLs1Le%vqqm-_qt{xsCK+7yCk-<)Hg`~LuLwY{?WLYd5* z6P`W${r>2Q>(Grs(vu?A1ml=Ia5<0mW2mrN99|n=pq|(Lm35~H1h^#R#Z^&zC;tGnh@5l6 zf6vXoh6I)pJHa3C`gJ|6RBj0(N3r{l_x(E5h0Lh-47%UZ%zL`F2=DTVDsn$$UU~a} z@9*|S{{WALXsAA>$GQIizeKI+3Eub}d5|pZDV%JnC>>A# z0I5nfRrZh)5ECqmOWha!%0i!I`CNGZ+V1nq(=AhNI;8oP0QpoAi3AW_pH5@|dv%4q zM7Ir8iQ5o8D9St&CP#rGS3NWE~}#P%GQe3=RDW;RcuA3!QBx0gL=Ij zB2$Sa9Bq+j^ZrE?K@vePoNw_Tz*K5E)Ts)mRHsozy~Q^srFD|KUx<1;OHK)1>tF zETJnU4as0f8NzADOdD5+{m9p45p7cF(L5@*RK>4|4LglOnr_`DlT-x9uVxH4rI;*{ zFA`XF?XJC1kw|e2!*L)M06@g#u*~iDoM)$F&z#3C@{hrNFM)W6t$dKrwH7BmatxOJ z+*V|w$Y%PMJMtcRgfC>4pEsX>@low1daC-@;=jS|LeoO=4aGfb;*}cJS7zPd1d<(8 z&J|r?CT0Mio1=FxQswE|{GMjN+!wvD7^ zL6Ac1GQfqC%*DU#UlV*_yv}n?b9D-uoE~z^7)RKY)kBr_@ufQ*vtOka(A@fp*(9$x zhsiR7_7qh4$sQc7tXbTpe>B37NnyDQG6^IZB37c|NC3E*$4`1qwS{V%8)AlHeTO8U zc^Qb$<>^`S8^>LF|BUis9?%H=O;G2q{Ltf<9*^UDHu_Z|(Mpv@V zf3WbVUl?^;YqhwebzRL@%|M|~k_g_dQT(c9%nFK%3$E3sfD%FIzraxWq-a$S3l)ecu(w)OnGDHYWeHFPS1;vn2XEo14UKvnL4dX*NF6M(^Yq>)(T z8l`Pk<&xkPL6rdfgClB!K2T&vWcrDj>0Qk8x*USjE}4(wgHKjU%e2wt*f}L=+9t&v z7W<<6oHZ0*VXAS$sG=(Un)J;IwG^T&RF;UTwLtR-;Gg9KCusMANEs!i=>mlmrBf_$ z(T&6t1jKgi2h$*R^`^CU{LOPJ^3pgCz{>J=q=>e3weG$xnj$&X*8w^J_3BI9kWoJC z_WAdWJW-(8+L5hXB|2nq%mL?U+CE}u1863A&qwQ8P`sun)B%D0AdcYT2=~N$_0hME z6qcCgzsUC9S&(ZTwFfYT4pGm6PW&1SR??#1>K}x#+H-(c$}31;Ow4wH#v?C9Y=y<- zEo;OYbqlYf()1Nvay)OxS(&8cv`Lg#MJg5Snw4kOJ<6`#nx3BNO?Dy!Vo0QbQeRVu z*v}jMMzeh(FIJ5~O&*@gz$r@hxp*O@AeaF36-Wl*$jNQEy7AN_Z6CW2*X~iRmxIc9xZCBidjrU=Rt2 z+{7^Xhs;QxJu@Sy4m;*02Dx7*x0WTYviaGYMNfm`2W2&;9j|IU*v?!F@px_6?LS}E zAe&8tjgph9Lg!-nX?!~PS6zHJO3wbe?M>C2WR))S<@%+AZEeg!B}pKBfG<&WdwNuC zD^a^$=CY_$xPJ@=3}Q3NLFD?5eX6@R%&RCfd;;;88w&6_62EVf>&Q`?DJRg|lF@^x zy&Fc5(Zn=BPJgvumrscF^L=enj?xJnh&k@0Fd>I{Do5)bYPP0sDYbP&*oZMOeqX2p z2*n|Ecn0TCB5ap z;H}WrTDzBWv<87KOqB(h?w$A0yu0CcFL9hr`0oG2i!)&QP@)YY!;ZvkW~gmItC{K_G_NF??ke5MLs zKlpcdwQ2UudMR`vtz3!~(QWc` zn2c~_%z!{CrXS;mAO8SHt2P8JZ6cmA`zz-TduVS@^{n_k}_b- zHUNPH<~W~B;10JmemgMs6|^Mm?dxxw7%0 z#BR$IAP9lTBxXc`lh{wF{Cx5U7^153R~Xv5+hFEx#F3TCJ3OGL-9v>DiHMOEnF>QC zA8CXn2A9|livUD~0E9E~*1D~a_&rKSohb;api$oav z7=D(lb5XQxz%j>%_KesoYtusaHd?lK>eVk~cFX`l}t=P&cJ%sdg$1 ziJD@c!-ZlIh#s>%0#rcm0K} zc;IqmGN^>pD*I11$~d0VWk8%x{k~n=1$sY&r1a`3S5hTRscH2UBN4mwnTP;&(w+;X zDCx8j7c{1Efu19rjORT^a{L;?2xNIfPBkn}niV`*Z2m$nD`3olMMdOPQKJ?6C)ksY zJ~CNbkfDLfrrhx(1pb-&&qXV3Dyg@*C-s=>(fsd(RZ5Rj><9`!u>Rcx@nciCsvQraHjn*)1OER2@6~tsk*n?U9fuPY$gUxU zWSO3b!6Z?|cui3S(QlPhG%l&x6aIMq`1z|}wzvvnK*TZn;vi?7a|gFkG%KGbp?1%3 zKG{EG1D|fXNz)(nk~IasoR660w>7OIWUk3>DIi5{hR8?>&It+Q1tcy}2k=o}y8Wu# zn;TSm)~{5bFsoohZ3agK6Bs_j9X}<_(`~x)z&|fM&wqI6%X8$WEw8kp+v{lg1SoMe*tBi}|_!_DTq9dHIEBLCf_NmVmeywp<)t|_6pn);pI0iZUbpHTxYf7k^st(Xd z`eUZAe&lnk{D9l_mVn!jwRQ6%aHAH`h(T)m^r2CD^3aU&e#;|?%E~;cawid+ei5x8E2z#1V1XWa9Rb&v8 zvhswSDt1qXD-mmHPQgd5NM<>W&DtV(f%NvChw0{}LsI#$t}r7zR$$N9o{BXXZFY~; zvUSCc>r@%+$m3@%p%HO~Aoc)8_A2sbjth<;q9Q7f_sVdV2A!w9tp-biJl8T~um%Fp z_51Xpd8iuoyxL-EtbyC^WBPTAg2=w8#s2{6ZS*)6j$E-0il(~8FS;{QTo#eSa0~wD zsT(Ir3+>4^B#ONAvdLK&@dZXeKp03Y&(yU*O{L@HR+_JJ;Mif#xyl_`RoI(sxh6YrHgZ-;xTW1)5>`#b z9=!-ts-p4N;LSw>+xe;rtNVJ1Gu!F*$urX?lc>3Np;dwM$jQbc2h+cP`8_D!aL&uJ z=zcnQqivPRx!O=5%CpR+za#~WZpy*Ld(s3bfXG3vYACBBoHxk_Uh1jwk5AoWrzlYj z(%WETcgV0fp8mx02SaXAYqOFD$%*3&-ha%*=e|0*ul}7)8B2c;$?qtxF}7naX=>g# zjmMb6iC5xPF&K{>q~$)y@kr#jd>a)7T!3ymE?C87E!6|*@2Bfez%sLYN?p*$eSmDPF3|+QITK& z0En0DymRwK3SL!LdGw)y?m?D6Tn;_Y+oCsDYjPC;lG4ZTFbDLWtG_?;k96QPmfmC5 z>>Mta!^*pO@d|9IPd6R+o^)DD_8_RCzadZTV2S?zs3fE&qhIQ}-SyqWR?`ogNqGQ` zqB#vPK>`T_{{S61>H1}j8*xJUcGV#JPuviAo;#fNO`c-@q?h0REwZem9ox3o76&R_pAlMlpqB(jp;8x4d}?=i|20 zh=`12c2wt!j(vvDDun8Bh_s^BR@RvGh7QDz#QIb2XK{=Gqu&uzdRuwzJAxm$##{A` zqw9gkR1>ynF7cgk&d>7RhceG>^C(lTF&fKxYYw&o%Xp2;lXf(}sCCbCuL>l96)wG( zkyT%q={of*{X(l~^%V!0S;EWIs6pEVvh4yE3=(GxJ-DA-)oUA=qBoY9{Ym+G1`i+2 z83adF#bIGri`?b4mKw6A9JH&A`*Tp8lKU2J1MQf;^0@1&U7J$pp(1nt03R%iTY8r? zDAil0Xk)u}z*H3=sDQBt={-$^uSHp^?OcGPh@W&s;TPkjj+5n*QOFS=_9AEh06yIp(tJF&~3Sih3E<2^(RvX3d*M8B@z0N!gi zHjZgs`jCU`i2F|fpQj_V^b=9nYuPcSb?ZjP?Xf0E>~k2N;PE{hJZtc$$iF6J<@r7d zRgdEs4G*R*u0xdBrG0=#AgVC)!NK5N);TaQxIQoyT*PgI9zJ>BvQ&nOZj?dK>b&b~p(PPSD0+SXo)I3+Dv=`aTpA&wDknUA)HKRgwW`%76`;=|K#%SHIv(0f(zs@*rBnNkyEyEZRAd#GVkD>3@ zcQmQdwgur#08UOntOMMCFT}f3O0190<$dYzWQ8-_^FCXxL>sLUmk5A?H&JJ*R`+t7@FI-$x*wpIMjlRZkb0e`H-%kDd zC8G}IBUMu?F|Ws8keywVaApvlFZU<0&;?KeRN)mxRTqwU=j^XVMZH4FM|cMTBXI0Y z69zlM7~*@1(;0mBK)#YY9Q}-*-M^`hqLmHH$)*K8Rb1IQ#v+7rdsnz|?jCF%c&N9OsTc-%f}%m0*jpGUpg1@!WfkK8N({VQk~JFrKiv zlPUJw7FYs86m#(&5Lbdvw*$utoPU4&`3}?gbp<*g4o`Ugzj?-b7M1HYMca}DXNVkj z_V&+E#$AV6+pWlR-owktAsC9biT?l`^UptY{+EtF`>Oml==De|f2VGjDdsOj-pqj_;&Py2?Hi$hz5J(_vrrsOSkpbMXVmi zwk?eOV=9FWxNv7s)`=CwW?L^rS>jFzqNARoSt5j8Q-uXlMfj0Vz;{$NcD%MbsIe?n z$va($+|?d#RL?ltL<|X@!tg&ypE;^DemQ%hv;33xtj;^^yNQ9( z9EjG?okTzghZpj3?thdFla~R-Uc{iO@}BsI;krugu3C@by!n!3tB;#-ZkgFFv%Pus41{OQ_^Z(l7pp4OqpiMZDnufFT;MP>q6JS))T zELKR{XpKXX=t_iKpZ06>sXi5H$4<~K?XD{V(YhjbhV=!K0fm?n1PpLG-=)?SD2j!^ zEJ=-{8;L!*=Z@W5b4}_Q`!B`(KS9!C`v();+TAdljA19g7^bB5jm5H>@+zZc5@mFe zkZw3HGzd!Ant=SLZL}N2vwGLH3RkkMjvPd@hVsoN1_swxU4v++C3g@EjWk}f?pA%K zk;eu&44}*il_D`aWbK%IS@3T{Wc#NI+BP0cJ(o(jzXMBKRn6lPU2$5dnI&95 zqX*xfJb)8~;yOgVME+VD$A&1ifv~x$01qjEJ(*Te1z{}#1m}SZG0@R|wJD2QkGe1b z2aImX$zB#uCQrXat=r+xhxu%MbBOJns;RJc*l95wa=z`fu_qjot+g4jX;ByRQy$zS zVu)ZQTq=C8YWQO3MWI&XPp-*NaV;>!w+43(M9Gc`$Q^IDyMk#31e`ztn+-WVpp*0h zK$z$Ub^1m4pFbm$XRo$)*u?&dLgVw_SG%PxOoJ4PioadBL z`Cs^h;x4skOYqOJ_%g~vs|nc3%EN3+50@aa#Bg@P`kiV`MvYz$*#Hr{*hEPHki&>P z&kGLd{VS_-&2bN1>rIiZrp~T$&Lml4>rCy(E}PG^^_+Jd?<1Fiw%wG=g3tgXXxb;- z--P}b9*v zOu1u{S4qYwpTZ{8Rjqb+L7v;QW|a2j9Qc_D>cwczA*T`=7lpGyL{wMNIa_Y?{vhot zS_^w~Qms}Xt5QKsI1loF7DnR*8aH~eDsP|nJwfd2scYN!+vqTVpB*C$M(vrpCPB!*}l zl5j^bq(LLG1ENhXedE3MYgxMKJj;7WX^fCudUi9C)k&j`n_nw3exV$+gYSFX)4xvC zxxSSY1Z$&?IPeI-)bw3ajkwU?O*fY`fG+7%&3aV#0;9{Q0ubt3$wI))vnr~RNO*I@ zb>7N#1!F`o3nmK~2WaH%9JBse6PR9|Jl>}T@=I4@3FP*=*SpqwMwmF>(ecK5yqIY3R}IBuSR?3zf~iDH@QG-4Y;grv$taA4ceF;a>^qRj%~~dPbvfY6z!j zknW0#!*o{qCpw6&>DNos{qL;w(yNHQiy4nAmu868))?3Id73To(Z z--(%5GSJ9z94AuEhlO511W&=Qr&J;5?yjrr_D^5l+N9ORV&u&>6YaF)2fJ>PXS7Ft zr|7g^fGQhxJm(Myfga>EoXicsTtFx?t4t<*NjUp9SjoHSly9TvFF4q$kf@pp5Fsi8 zi3;*0J%p3stxHFxs8eLQBBX8+0s$}#f=DqW5P1d&J#DXTQmQuUo0}>i0R+d^3}>D} zf<5fFMR{XKk2$ZQV_rMi=KI28HH%U^m|ucp5+8a?r3y*2AV3>Ya%w4q&n$C3u9CJQ zsI{r^eU++QTwm7>PM+$Ji|beec=USC6oIsFk4{ORfa&^C1?bc$<-ignbc5=Vjljee zKd-TGGnrYR{{Vr>``^jUnR^OuVY7n?!g1yaiIJwp$7{+I=@H(K*|y>jrX+C)f{{tU zWYeC5)px^sFOjNUTxryoeYFKZ?7L3-?dCuR45G1O&UX^*3Fb^)cs1#1Z+UlAmLp;> zA_S7#r+`UO7>s^{c};| zqlgjR{v;U={{TCJ4#!?>@J*JyEhwg?=2EKTc~=gK+Zm9N7zbcd+hL?G0dW0R+MROj zY27K?5(%7@BVqcn>7 z?4Tbv&#VT~>L`fgZzS~=uDJ9nd5C6-SO60_feg|Wj_td#$O9Y|KIg){hgFZ`xS}Z`m`brdG>SXh&~|SQokCY zWkwaNuGCVy>CmdkXR{-J4AhmDdS^R$!s@Z549hhNf-x!qECdOOU=BxfCUMfu<;J3* z*M3;qj82b2tn@6W#_7xd*pG>NYY=G5v8O zqRXw=adV4$ya8Us;o7-kgX(>-a>h%o38IhwO|si+qMwKgefcy`oYV2^U8dI-yWA)~ zXp_gJC%0l`V?6%74e*-5lFi)|u_ugop8o)7Km2tJ{b=&Y8CRIpIE{O&Xd3ff<5-+| zBqS>-Mls7JE>%>8PHCu@{DP1Ce7rO|aiZE#4ZmUx!OZv1V;{FwkBJ#Y#DN9b+~$5} zAP?C@{d%sNXszQmb$MPjVR;hXx;#f?xCQxg;&*M&{>Z$Fk15Xy!u;P_Do_;p{{UzD z^$$lrO>phrb3dj>v~_(RELT|2UhVl=q!`zEDr2%9ohmfK>icgp(}=C0s_>jVsG_{} zRbEvU7v&|WS46y4tg<#aiH^YXIgom@#c@)FJ%#~g1N4#poq9PRG_;>P6sWAaT04sv z@|~!ZsIAO!dkbWoCtx90T;VxIMI}PzIYg-2SY@PWsWQ=l&ftANu4AhTjS7GN05H)i z4t;^=`w#T$#Ow7wwZ-tq{Azn7JZ~kil*QM-s`^##iR+5vsAxah3ZVVIw^z=9B#Fg zrh_nGcPRi2l1Pu2o}5NB7Fj>cSGIO~<~2dD9LP$=ft2VZJ4YN|@fePTs7@J~3xq${ z0Ovp2a?N$5z1Fg7S3tCPt8P3n!3v=K#F(DgKI5gats-dR-qe#*WN>AFn4h5k08!B1 z2AIFXvmC=^Y}~ID9NL-{o=nXz)r`60C>r*Jhrt7*T}j_>t$8Kj7yZ1i&nRh?jp;W` zvzLhli5U_H0$}_52pveg)+tq>v~5)EVyn6!LBRm?^yq2hPDLAX?EFVw>@b~bF(UegGcy_b&q2IKg5H}} zq5vR79w1sK=l!M!&}A#GT~;pXn3qAdB+D z7KwF#LX`y~oe~(6?~n)F#QldzSGSLAV^N>}Wmy>Pph5cyFgthe(#>zQG27gNMP>cW zwqzuwiiccX$eknU*ik&ow($6%^D2(xx{MJHebE z+DPklozktlQ3fhiF+Rh&{RG7R{ZPi`@*gCRca>n69krX+w)Y2nnCFNE`=$JXe4LT! zPyYZ{6v&0P+7#~MiYY3JiYB{Dck}9B>K>BPLL^5X z&@uGDk=qz62kpZF z{{Xf4Yr>9dTeZt`QJKEW!jISjPjY?w1L7e!K2YHRSf1nNBksh<)29AS*0jl7$?vvj zw!%E7{-zRQ;tMejuYUmN}V+|4ReG3zu%&Ia#cGP+yX~$ zsQUHH$NvCP-bVQAzYF!(idVK7CN%3R1{U6dsJ1oRR$Hw zmV*)Qqw@jp8%c;HXQ|polxkNsBXLj48}kgq9zNn{+;-~le1Py<$jm0=H}Z2}S>d^M zrKG33XAz5z$X}st+ZLaM1P!4n9HsXQ&bYs4o*u+Y)KLl373eSvOf4Cb(lZ@iRzgHZ znTr-%qOSc=3MmRUf`WVs1FEEJTWP)s)AZ+~R)uQyE-1e0YK{n*l3ivBlOc(mM*u+N zi|+u?v9|nGySD7U=Jc*GtC5xfXB?Q%RPmGI^)(fC5TMJjnL^o=WPPz-f+FIl21WkU zQ4#*W{3@^i06#DLJIa+VRmRfC)!uXZ2?L*QI<745YSp>(_QOwqeB&I)Ab(DYlseN6 z!f>ihsZ&Eyl-(#un&l*eHH@tTz|b~kh22k=5ze1)uye}&)8MO}PVZ1^wpA;X3j=Th zM2wh-9>WLQo`{`F;-ewCtGRxn0PId8Vn!r$`@|yV`ztle=`;BBv~mijIY5v&ol|U_ zDCz~(T?p+8s{Sj>#HOmN$1DAO#q>=w!qN2q05O!+JBOO&%SfH2nET;GbVjYG@R(67 z2!c3YrXpfNBagpb9R8l)rw8hLv-BNS@bPD6c#WQ67WHxRYwb@bJ8D(gM|rST5?d^? zO;%5mF;rPna9%~~24m|q6V_L4ZeEH~E+ew%`GtNv|t17VEdb&c23yU%;bRv-%#&~u= zZprGB-&G~!<%g$SQ>{our3@r{ESsa4tKB~Uu$an4~-*_m2yD!6Sw5nFqxs*0i^3JRZJir0E|H9~3t z2r?sr4}V~1{dnmY#NHK4pex%Z;toe2e(@up>D#2Y8FkFx7S5=eY3TMXMmy+kNg*J0 z*xzRv6;4044e#Us0H07V{y!#Dv|2S+dkvsQFmvBN_|HNtEd>zNSg8O5j4+Ioo@5!3 z+;t?y@PWxcaG{N3jX5f74l6E9o-kvql0ijR9&?aD>&kK2Kcr9ZgjEa8SkiQ;z^GH4 zZaYNa0S0HhNB8L#mZHsF6oyzLIKT#bf%W$3+}3tpH^S4Ja+}J1X`ko1#~PDj=}f~e zioRTsan{0MF(u%2kpz_V0wYvGB_u&?NX*uc*6n;tSHxGf{55ox>s1LURYQOTnq;Ud zWT2=3f<{X-02DUaUevBlcBfI1atEXc-3Df341;ukln(tX_fhpctiNF8I#N}|Uaf9( zkSX!}l6ctL#$nLpUw%tb*k#8#Z|~7NCqL5gsVmbW}6crZ!V0Ochlw z%m#5d`t+x)Rd=Pfu-HkFGEUj!82g-eg(ImAjYVbsI}lm@rtcc5a=t6pVB3`PE}585 zsUQQyeTlM;ZG(a+s-JQcPnxYMR-!82s}-oyb{MEBvVj>`!3J4LKjl4bT@IB5YuaR} zrbo1}%$&^TK*10si5*}D3iiH!%?)xaWQ@i7I|81E?}hjFHSJ(fN#C&j#ZW)tf3ALO zrQ$WzO*T@sBNY@Z5Z#&>$Q<)6{d)USt2IMYRzll|GBXkF$wg7?P=~&ZyS* zOou@M`07CH)IaGuf4EPd#E1U?WA;@==i`;E(7beJ8vv2)Bj5ce{?h|VE%>Gc#7Nq6 z2bnz2)9cs8B`ho4lMlw4VJjo6$sNOg`&B_xFUN&ME)hjP{oJSBerdYAsY>3p#O^U5 z52=rQ`<{+j(@To`0o%GH&Q4>w!R!Yd4!>xy8;rT7a=tNF(y=6By*1KC8f8rl!4Ad3 zcJ;R5pr;&lWm~P$uR(&W;YNC`rsb2(k$v$tAZf%WEjSK=Y#!w zXQr>ne;_lhr>iyA4Rw#|di`~cfj5pv$EunXt7XMPHj(w^Kupk#x-SIcs;Ydhej9jF zhL?3;%B@xE)g_$OGFiRAiNJs-A#e{tud6j%v^5?K9jYWiCo=;-X)tCZqF=C zk((xauSHTrQdLAw5fORk`~Lp``~ALLu*&dEnfr0~`gJ%G8{L77{XX;C{{W7jUjaO7 z+TKCr8P-FG*;Qfs{{Rq*&4yc&*+>zCRN40?MH^qu_stn~ePW6Dwp@_?k$L<6BYr7p z{u#Enw!TKIb9PG6q=4^oAU1eK8;7XQNPv57)U>8_{6v71;OCK(#(l?WCnKi!Qa1jV z+FI{xYi)y-WK{U<(0>uQVkkb&K z{8+`ZoX*~J_AlE+tcMtF5#v|A>d>|bBt+r=0OFjYC(5$>#QN0=r7Sg;rk&DS6}T!O zkN}Pb26_ieS2p0&R)Hk^(K1OSV~Hjs5rNf0Z|utvZzN55t+xHX`th!_teU)bbqlzw z)luJiWaF+D+$RW@JFma_84{9^`uRoset_EPKvG+gO=#X#5^4kILqa6ZFu_)K!s1&q zHbGV0O_@z9gA?-ukO@0v37j;T2QeFZ)@k1(_U@|BG0cx$ZLDeej$)CZFnJUx$ksH^ z3fqw*5`q0UB4!-1)SMUG7X?($ybbBJ`)) z;gtUXc#pN2Ea{u{dQaipm=RF@bzPiONEJh_eR!e5fCo#@uvS<8c z=$N)bao^=QQxPBp>M_6m9a*ARsjRY9r(PYNJhm*WwO%u{@eH4KR$@sabaJ(ao*`uL zHt-`J-tsVFOyjG4#k{nlX8R7w@**pLCHO~7w6kG#aLPi|-9(+?cL*}*1gqdBRoWU*dNDmnywbFLODDV3 z0P~f%(_4bKSdk?@^ea!|9wgk(FsTcccSbuMhKbo*M@RTi5Xl*_uQU_ftF26IRf6p?_2 zr>AISp}x_n>N=eSdR2)C6^yw6u_NX%Vi@3JN2n3jYI$4b7}us{d6sCOBK&TNA=mF$ z62#~R-VI;1#~d=Jd9SEg@!fP}udxrWcHJitTqh76PlY-S$f<2%LZz0VN2knsyBXjC z{8c|QsMNs(gtIy6-K^5^a{97f6M`;ot0>{5kN_j*=dw^+%sNXgLnd zR-qLLu80UzxfnCVK~gr89UiZJby#^VbF_U-$O2b)1xOQtlExvX36EEKb5WL9Q?^u< z{{Z0t(?Bf0Fj~iI2mFG3YMZP-t0vs1WA}Dclnd7hnsCSYQ^|qv=TP;e0vnu=(kAIr!mEJJvC|7!|rv+`FJFlkQRht}uVx?BLA$i4`cLw5d4|5SLq@!-?R(J`mpMfApnfQ*O07N+QT`)!T`m@@ylx7_ z?Al009e~@008aUn1a!lpsijt;p_ANqSl}Og0uQl~j-a}Fi(XVs#xq@&CmhHt8Cx)) zkK0I@31O=dLCA=1uwLN@{r#CCMNedN6%s<{=3Xh(?_9O5f-ub@88)5j&lLx#ZS;Uu z^C4U?AdJn_7&h8;n=E(&Lwn9R{H+wmjb!Ajkx3Xqu+{a@s7ywaA7;`M!WJuZx zB07spLrO17k*L8p9!v$?aC@JaK9s=4TasUT|3C53+631 zL=N)POj2wB?j{NN+nZlf<{JYQ z*#0JB_IY4LnA}{02q+V#KVAy4ifjt0;=b1b*^h&WW#8Cj2HGJi{0*n**0rxJZglNU z-kP1pl~DfxGfCQNQ!yYQYGZEQtGY}Mg56uGawrkGj$lMYgNY=uG0s5yV-r=_vy18* zxq3qf-C8F*$)L@Zdz-bA4Q);nAeoNaX#Jy{HD22wudvJDjjFdj8$)=M5MsJ&hs1XN zeR@@1#-Q@R4d&HCU(_kCT1+#`H?0eQ3Pd$aJs$)AqiPXJf;=4H1xy0i~A!8lDgy zncFY`lLYl&UR}(;!u**E7WO5s&yPCdA~ks}kc{-|@T`E!H1lnzUhN2al{n{+C0TwrHT|i|PS* zM7dAxq)u1+`O81?BUxikp-`3CN~2&-OhC`EoyU+Pu8;UCYE!d%w8rAjN&5-!?m@ug zo~y6*JdYMXoc={IUpe{JaBQH~!*%Wj#f;TlMQjy+Du2L=e`)inbSqV%rd!ho za0sw*kpe!QQNAkN_ljZ;(LZ@7{d!up8c|$XVuNN+l!#>P2cQy)Gi4k(%ji`MvSWb{~adLyJ-q6;g@Aj}U*=$VLSL zrFWE70#FiEU+;uYf9K^*tY0cz6{w4{40?0M0s4Qw{aA^iu%;o)85t+*lOMm^r$<}u z@ym5aN1x*O_CA@7K(x?;$5$L-r#mCA^UwS!s-bhoDx9KxSY1Itsa+|ksF4`VHz)1( z=;ciy)2^1)9QkiO@JQqL=~=`ujjg?Q!$ley#BtJT+b5+D+!`|lCkTajBH>s1;Z;-d z<$t7Gns2F9@>ACAdF;OA`$Wk1Jaqe7;@-l5cfyVbx$HmQBc7()&voV-V{XIM*rdyr zF-X&6)l|Tc;TX8{XY}Ip;!29HI7+0XU6nZ$=l$H2@piP;LAR#IVi2kc<+udSNhJRO zuUfo2qS3au{8dmq!Un>)(P3rRt-Df-I{P_82+M%t6~4HJ*_B~|>K zd9o5z{>Sal0-q(^>0sU4=>>sAg+9gx=Rb1<48W1?(8E~UX_YUcDpb$^0J(+zfuFxa zObTXcdA6R)GKyL3LXUpm_AlSa9;cV(0+tex49oH|CLI9`^c zqLgG5>YVo@RA^8>$f%!xx61>=qMZun;gmMe&SO(wI~AJ~p!vJ4$qu?j(%@0HJ@hI22A3<+-HN@;4R*WXO*G z=l8(-M^%2eQEI>kbm0Am1L@r3o~xP#jq~n=`wYrtXl%MoJo9a;IHE|s(Y0T?uL`J( z_u&`q$M^8nT}2U2GxzCcm5aF>jQha<0Ar#KOTP21r*DVjtw#Dx8y*B=95?!-ZaRs_ zx%U*htBR}s<>UKb?Riy!d8}_hj$nHa@6_u}JruDcoc(y?p%%Krp)SvdpJuV+xrNlo zNz>-IDe8RM=cBzBsT*yoDK-iJ0Cd1p{iv$3wVh3FDT)-7<^lQ%AJ^~3M@4Kj^Gd0z z#2@#M+v)V~I_by9P3M$l*bdu;DCW~z&c!NV;`OE|QW{w`GUi7P5jj^#3OD}%b>V*9 zljM&IYR7B#RS>_kN9toA_UaD5VuGT^a%c2m)~m~H%b56gBMZti3tE3w{JPv`vAIT$ zeKdNyR@i<}qOW8L65f)~nkV~XDX;s-g@ ztg{#&pdZ(xe~SB?FQm~qUc`NiT0iotx~!VM;i6WIn04f3glyOHKyiRKQMBW-Iw!~9 zpOv?Qu4~xPy563qgSs*yw#V%_@6WeS-XYRx*SMn31R*1DW9gnJ-ZRmHbMm~M(|J7@ zTTipwSmbFJHL_$HxhBd2qAZwZe`h^_;kNr?zkkSu7w`6Qp=uWrq{s(O^3;NYqK zV1f0|K`YZ;I^}92?W0l^fb8Fuy`X?YM;I~Ef2?=K{RS(yHIB-qa_nn^!<@fglxS4;)$y8j<(vWCsp~QLe%OCRRv#AfhtT!WB&gDu7g!cRA}(7UTS8f!OxYrsq`ixQ`;T6oX{R zvlS-zHi=iTsPdwssER-H&)B`C1h~80zr$g{KH!PuL>}J#qpfy!$oE5G6wCriBW!{q zdlNqVeF;4>J}T`B9cz(X-Bm>7EZmhozYBg!xZ@3E0o(VF!f(Z~JP67M%(q6IsUafL0 zFHSwB>#Fo8k-FA}tXo{%L~s@Zl%v$%o?YQaJKDI$r|=faz&OP9_aEOh?5&31w|QZorqVGa->p{`Kll> zm?8|GW`FtYefmkMefWw?0LTPm=yCdtgZ}`2f<8Fmn`*DenoXgR5zoM#pEAvry83j`WAn3j4vVxgEBqoJ)Ybzt@#Y{ zMG@6O+BI**X=vn`0tqKP`egHw{(#Azk$iFCwWq2p?F&ts00V0Jpa4e@PC1S`tQl(~ z8=|_b0Acc(I89|wCfqom#-dGwXo@CAsw$2mqNiRJKea+FPL+GLaU)=eS%aAboDm(w zM}DfSdi1NfS4gOX^2`uE`4D;faA5S`>HW7tx;o2RUBk%pYiZ3{H(0?u!bhW+a^ktr zS|ma?Ur54E_bz)QO4n5dRi(UH;d{D1Ax&D*mW?#>_u;0h1aNl{U=%G00wZ?$1V`0x zDq1k2i-rUa2suJQ6TvD0pI}G7OP%J9&9yB)E0p9F8KyHqeBsE1pZ0e<2)I=~+C3gY$i9NpEXR6%Pxwl%cO<73vk%W$=8VpMY^%n2h0u$jQ|a@qRH^-87+pD-Weu0SxiPV;^K3^ zZ>jc*t8E~wUbb6PG%g2(PE~%~^YK#0#r_htz7~|P?djF2QZ|~@_q=jsHs&xQPunrk z6Q{de2fAk1xB_sXJ5y?rhlY8XFpmqZ#uQTM zAAis6sHy#Yf7CopZ*6cWGe?>jtIF&HcG3%&5`Dj8)Qi0~wI*PKNrDXI10>1zfs^eA zt^O4Y9V7kcB#9vAGe45AZ++sbnjV{6{w~%7vn4p$QC6ZVox6&uA(Z4X zoRB(+cXd|FWi6xDJtv+$E z9sR%(W<(yYyLNe1OS3bA*jkUr4Xd2s7Z760gC-MUUNN|70OJ!f1W8G=Y{%Frpkvg9 zRTt+NSbQ+0Xw@w)bqY4GO^DdTcVX%VnPCmg6Sx`N0qI-Ch_$cX>#p7+XNVENIQIVC zRaPCXG(C|<*gj+9tzT`Niy&rGxRwr*;6Q~~isH#T#Dduak02m8)F>_ss(!Y63b^XG z*BXzFbx~5KpM~9)(uF8mwM8P$SJSjm^9q$iko9VzSlv<}DK;gIQfqIbrlKxn!GcH< z4=Sgb`c5&{%3gx~J2R$pYl!-*dg&UvreWGfvZl&dv!2UmB$_gnT{1MDQjPX(r$b~aa`6kMP0sNRSN4g>LE17)@|!ie8gS}0zm0usM1-u zxg>yC&mTjM?IFEN0AboXHr#5gpKM&~ZN$~>9_Pm*KUqm*gTkwK7qEtjFX^UzTC@om zddYMJ`M}{SePAkeL{u84r;q7rl&*9d^o^BZuE|`Lu7(i3J)oa4i9k&{PPy{PGGao$ zvqV%hE)W(?tWk?Y?H??GB2)vC7?UG277gOA38pTt4w~D zsbz9iN65pY$*x_mu7{?rSui(3i62q|lj&Y3x#)G3UTGWLD++gGWLdY3I^Oa#k|bla z_U$BWV$6lZH)#~RIbOuJh4!DN=<5dRgKB`P)Ss4jhcBD)twxmMt!n5EdKzfB~u4wp__rifYJKD##_rhM(Wqd-pZ>^lgU6GOjTwl zDhUnh02TPNyh({vHW_-X}J(#-dM!VN%;O9~kHW zis?HXh|$DPz|quF67HQql~dyNmE|RBx`H)L>du8~GX;=LC=LRZAD3hZjF1Og=wEF@ z>jlJv*iL?E5_^(4;g2)bkZMcY%i63zBgHiW`5A+2Y&1qCHd~6qOL|$h4Xk!!q?mu4 zh+y<|b-9vI7CMTOkgD`L9;bzep7zfERcp(F)qI+@1uBY+Jx6hsc0vPErb@9fw25w^ z+t#aAu7T_P~W3WDojqm+#8_=syzppGDEG>I*_oI^CpazW6Vw<=dyZo?bQvFjS)#hZ@wh9=j=L6WWd z92c3EUeF_P&I&)R=1B^f*Zh4_%TuRgO5U}?50<4Gh~}XxjZUKipzrjxGwOw3`GljX z8#PBjCa{=d&iIrzRQ3nE%Ka_{{Vt~Pix{EJL2Yq|GbC}xA_7NsNSrlQGwP$kb>V)h&6Y!nseW1|kASB+5=5vc;5SCn3= zJb&w+zv3%XRvLYJSsN;X4tW?8kJSF1bWg%0Yg>AYQF$YQ?LW4E@6}#;xhX5WrQemZ z-;rpL@@X~UBt%6_SwU$F@5d>_La4lQss8}aKRSOx+fPWhro$?W#~gP0dv!o~l^ox* z4)Oh`p+95C9 zI4(X`y7q;9-l{B&Nr^Zgw9Yxtw^mJtzf7m8O2-2~-~D=Say^GnUB zCs_~)tm!{?myrJehQR=bgkBL*QBfD4i1ltpl!D&e?{k)8-;ojY>?Fo#rfV%ZuYs*} z2<)SX9RC1c_l}5JUdPBbH;%c6Sw`(GW?dpvOj=2S5xCM0Fs~wyxQWRLA##eJZg>>? zbIh7Lub*L7^jQRN2hOolwL|fDhZK2Qc&9|lP zT+|7VMmazp+bQZDSOyF#y4)#$|Y1=JCS4X=1q2_UMB`!k*BSQ?y7OzNyos6 zcwWe#bVU37m8a5X)D?*JA$C91L5?Jx4&$sftEwi+DJdIVsGp$Z{{T*cUO{dwpHS+Y z()VFGlh4_ChY_PO5RzQT(E-8sG=N`V_Pyz48~jBFpRkH5{AKXon^NNDrAmZuAdggx zPEHO42!rkQ9WGyATcKYmWhrI=<%ofg_5J$Tc!%W1Ii2HSJ36mog8yGd%)O$rNEhO zPf+85CHt>m%Z^bv`>+21yp0AliF%9`MR ze!@vJz|8fhO=Pc3mK%ctL}p88pXK2FdSP&V5xGB6zaTMuV#_GMksaGNeCc)N z)DcV>`@{eM9oWWC0#98~>#-U2dr~(XbW| zEF%Y#!61&^4!mot(%MpOW?YvC1`aX6ClWaQ`bzwiq?xHDOu%47va8p)+$Xjb{jhQG z$?X^3#c+BHxpi(t#+q%kRQ5XC%3s=i+32xXQepwB?8gUbJ4A8-Xb0X;L3RB=HI-ZD ziGqs1%OGwu?m#(=2WQniAQF|xDHX4Ce zs6xFJ3Cl#dy}K+gYEj=#F-`*sVJzxN*jR(<$o40+T}Ia1_&SBS59wf3V{2eAff&lL zEy&4L>+eEpP3N;|FLA6DXmNpz4l^cm%`*x=*P~s!Jo2Kt4x>VD_UfD?YMiGD@V|`y zCF$NCdUdaN5xRDOOU6Wxe^e|_CVI-Atn?f!0uY=7^I{3?VgdS+W8A{^j>X*g)ue^7 zYTcHQiPz=2jmnDHiGmNZVv!?%?Qn~-r&L8$>b$CS1sjh(h^ua}3`Bw?ME4(2o~^TS zMx97@0CR~wuyG{J_WioFZ_^9KO{?c`n7B46f01fCShX=q&mq2m@lBZuxm6ir2e1ia znmY5Mf!x(l1>ea8dZ_(goyA?2qC+&nkYPtX{-6(HeW#+jThOM}Za|PAaR9Nv_9Frh zXdeA^JL5~fEe2cUPR+KaV$)LwYk~Nas^!M@{T&@$v&Pew>kQD@eV?d~6NC&^9ccs+ zN4YP>?O#Zs_cf?hSxQO)$%$fjF&q*;^Zhz)(=`g8hos6tFS+>7q+v&J57+6>On%An z8fTH(H~yY)tZF4rU6o;#mbaMI3u5J#EkD)-zqPRGb_*yEBr6C}T{LmXvz&w`zgn&Y zdmTQtJ(Yj}Mnpygjz3&4wmIWHUacDC=^iA(IsHlf)tCVUZtd3$o^N=yw0uw6`5v&? z&>4X$YpZvUTvr4C0JY`Rj}dz2*QxUy z@%_K3F+=LwHCsJJ>ef(c8QXvWGxsqAx2O@2d-bc-8p+!|a9OrIm-2ErQk{i=Br7A> zF-P4|BD$@wW%MsEijgM*X~!R!{HgqH;-O1a`~}X@Nx*7gyCYPOoK6Pslz=$~dmff` z8mjd}QOZdKf0clS%t0_^q(lw5&sHCYZF(wPcVp30RJY_7PkV|)$19$CGcrPwYPh8! zqxa@RQQqP322pu%z(fc{xL$g^@Lk2_#lM|4LY-q$0V-WY1q~jCbsI}O9iYnsbI{#e zO}n_J*7O&95(LbX-U$XofI#EC44Kw=kr;Lc(A5p&wQ-wy$rN=~E`?k+0t3Y%TX358 zqKseQY3B+;^)Tgl>R)w}@p8@V^esx}>5j@vRoB+%bb+um8Glg#Adp~8ji+=Z;>*jYL~aJKG?t^80aP*)U}PP;L~;r0W~r+$ z;lBw+u$qK}w1N}^kW9cVPu>CSI;Br4wmvywvFRYJO^qyif+ zMx6=9-vwVNe6X0s>s3lZ!D(a z!3RAHvaM3vdQ~~61Rm=k34n4(X_5I%^|`m#TARq}Rl3Vj>(RmYgcoZd!JlsYS6#{A z@QybiNtT7TUnCxm8plINR0z!km#FO{U)TIPP5!BHZfvV>l%}uzI)v>h48?-Ulmejz zB~^C-2!*Ly+Tc|rm8fzE+*HW}X)rP%$mhIAOaAiG{!!>UyL@M3VtGDMt!7?KDc0n2 zAEl3QPO3iJii#lI;t@h1a7VXfRPDkq%Rj-sCh*?1TwGc(p?OI{d1XRY*rNgnor-aS zcElLS>qTq3SGW8_Jh&{m+!tOs1qYG5PHz*9k(;aEunj5tnvIh(k-k=%*w2^ z6PnDZq^Lpyts6$!DfKUCAeay;4=K-Yyno=d@ote$maSFP(kw%yAq~MNaB#vTZ6vD$ zCovx1YAaemUFgHpAhF^^<#QP)k;s60bNslk^PZZG?Ui>)U9a_#ybS$j7w@rv+XmR0 zouWuZBWct@4zGeXDkdEAOU)VZYUAPUTd(k&dWPcYPAl!E%7cTMIhM#Rw-r||gIc;%7_`gK9BRV?IdR$ozI?5QJ6nU}Jr$35`A}1Uw(mxYy z>@0On;-a{$i1GZ@79G6*G<%*iL_R*@%=VD{>Sb1l26 z_7(0$XP0G`1+v{X!UY|af1nEJeUY|CDLLJlJ=IXpyREh;tHXjIrSq!nyfdxZQ=}~D z0cZwlBN~O8CAY*n?cre=iGi?^2U`VOltf1Z$`d3<&FwLR>@$e_b%TuT9q*1%>^odq zll)eaJuH|xE>Tq66&m=i3xL?jci!6|2Iq8bwOJj>3)Ch_${e%Mbl1C}R;xRf8!5M$ z3`|Z6F*uFn`B9DKMmqaXplj`Fv4R0U=YbedeX#;D+o0QP%hVd@+{!h|t` zc81Bq4O<|_@TGA;G_Vrp6=F|gCGJPe<1j-EZ8#yPMc;#h1?DWe7qv13;1(wpeo+r4V_ z_LX&%46M#sO2){5?v;{%ip5UfNFnvh&9$pgqYkhNuz|P?5+(_NFgZDpC#0^sEj!O8 zTMg^0vHg^D>?Kr2xWi?nXcN%hL~cX|-z8}MAIL)IW{m+|M+pA_E^n<;g`FKK>e<&c z(IMRr%pr2D$~PVOkVEcZq(@LL)x4!^Mu{`(^%A|%vHG37m@zROE)CM`9X%@7F~YKO zdm1?(NZplqAwa%_Onpz&O^QpxlZ+A>#CSAgE4$@C<&DP<2>VP17V_x(6tw@|u5%`U7jK^y*xBsZ7(9QBsqTcWues%p29b zDu$Soz?nnHa==vdgWL>*1RN9IIqpaTI<_q{2W4w)TSsFVRDDeRx;!?9y&zRqIu4|V ztGQ-bM{Yw*%9cpL_HpDuR{#l6Pq$iP>h_Mas5Rv#YIItqMwc=Qip_&6!~-A&Q}SX+ z0(VgG#gClTO+cwTxR5Y1JwjNRf^vK39WGfPk1&tO912c%Cui%uXBvXT7<(q3%~UIi z@|=c(5W&`3amilqbb{_g;-V?G(~bJUK3KmJymxH2D{X2;YR0W9j-?%`q6&eYpoUNd zFag>i4@){QVaqnAY;;wBD2gO7i>5;4_8=D4O_#ubK4%_Qg5R?@;;a<97y z1s$-@>hmb*DhF3Ym!1!V>Hh$STGf-%y%rl9iaL-}Z>w@-w$K-GBLqyQ z-)_FPrADnrRcM15j1JiCl4Iy{WFDQb5A^=Fa~#>ZZT%i({!L|U$zp6paU#p9tyzvV z6B>2VA$f=8tH5GlvCUa*T~Y7P&QbpWh#wwmDXZJrQmCzONgK{5<$8q!l!f_Pnr&q& zcf&D2W3Bpy($T0bfMEb}0CNi@@-YApxiQz34i)}wBQ34gH6y9rLbk@T+@>SR4jyL| zn0{B#95xlmfjL@Fr%`XKXtBL&P9Z5HUxoGW@aoo8b$Wuf@U23VZ)ZkkT4tv9ik?to zDp*Tz3_u|DI^NAq1g&sRThZ9^PuRvl3?QB)%mz06Park@W}&>x_U_E7)D*Lxx1z&w zneD)lj<+e;%sRDjOqbaq^DzUL(2>Jvm+YXZm)5^ZjpaJ_ROr%XJhf3OSx3z0xBvqI zqyq*7bi=PxVO3}#8=^fxg@6V|MEjkiJd%0_yN}}AS2@h15SWqXwNclC1it+%4? zL&6|)77Z)|^9nVgit-6M$H%ilBBYiq= zDqC*oFbAil;8|S3hJ%4Qjy8-$jz_WJ{{S~f%PpmOxO|O!Fs<_%jjYtNir~hwxlkRb zqK;Kfn!rY+PFCSZhQr*02;hn$Na$P-3ZPob;@d-774-5@Q-+`%GwrNp{U{5T1Lw~p za><^yHKO@c>9e-^AyFZ~&9N=EvUnjyYkhyo<$Im*dqKR##4o5!P~C zKB5!yT{CVoO+H?u0Ox^e*Abo?RaV5nz9Z@PR#oo@_%-4DLp??m+G$p1UA)MGrHMPX zsi+G8ScV-#v7t@sC48SO<{NMW*+ib?L6f=T zNRw{l3h{e}B!8_oj4R>FYD>ZhAi~6e|H2z_@>gq*}3%MNA zSqv1Av$aM*+RzDz9cy|DD^y>|WE2u7xCi-iM&1VAGb5$8C6-%ZSFyZn@!r9Ao-Hz5 z-1j7jo@4Ig4nc=n%h4oCfqNmvWO!Gab@$qM8#kIaP#fTc>^}?Ww5wZ+Xb?3`p#p?= zETGg0wS8YGV5&enLZK%ec~aWuu<~iZ1nveG{KTGE2wrjolZ;PD9{P7<<5`78I(U~$#h{*cb-P2VX-gs?22(=iQGsOT@9@zA?+GbWT*sc}Bz&l~q1}q*eHbdghfg_xpaor~d#Q z713g)UBzS!$G=?(;kx?UTVGY)XBM(>!+v|dr`nVf3QF>bs(^%|tNE`eTq5$n@$#?N zsXZ!-TDug^4{|}z2ac@UKyIW_UBN^j+ouyQ(%1&t#-nF3tYXp90KGa|MPsywfOu6^ z0WuIJP~mt%{{WKz0C(MDYFcfcp%+%Kv>cK<$J4R>2ivUly;ADUjjdJO+zC8=C%E?g zx?geMA-;=ZW4dD&$Ec%X2RWE7{akcMrh%72b>-y+3;uW!L=+TG6?pgt+f!S0N;Cj8 z*r+lxWWguv9^>1i_4KwhUh1D+q)%VpU+WiIlwR^paFPZBkJRBlXj z5;2b+FGOA)aRY>26@JEFWcz&GsauN8vYZAOT)-b+q3`$T=9^}e?bHA_xROtQbM_s2 zZT|oywvcJ8lPtb>7uNQ+b}1<$Jt4ZO4OceVi5ZiMF1g*pQQ>(d_3_6hiSXu-l`iTs z5i$qLC%-a3*N%ErycTw?w4KRJe8(bwk@WWW=quw6Lx<$La^q?4cjMOOGMlur!XQl{ z?lBo>uf5g}@m1_b`G3HReK`LBdi*s*OQzQ~D5yIr!sCWwc#=4njPeh^O1F2Ul&Ay; zGJV4KGCRh8fb~?_2GhwZF%nE8_PVTp>s*@#tr}HejnX115dtgyLlTS6w8p4$M+FLikyY+H2+RkTmZ zc^{Rgsjpn?rL^iQ)TuUn@#Q|krF(z!+oG*Do!5m$MI_-@ly<(X zrkz@J<8V%UP5>f18Ijw!R=2|Y#=EekQ*j^$Qce$~aUV$I_Uru+Jbu<%k5yxq_4qCa zQLnOWnU<}xE{vbHeSr#+xJu%$WJ7R?0D6Zm8KQDa&AVY}lq|x$?_~hYlg2sXJ%%~! z3iT>hxZE05Ob*;1_x0;1Bb^SWqbEFa1ukDcq0ii9#+wyhCL2K!C)pqAL`ea8U+ez> zTynoE>$_?|Jvu5XG8rI_G06LWPOPmto!JdyQCvVE#QhIc(d8$WwplFAU!QDQ}TZk1d5LWIRYYN@F2{8PC9JU zG`ei+;6@Enz!yqZkk-E1Zs(cXQj$hK<^xv7o_ zsw8FZWt;f#bH}!SaC8{xwF>4ze+=ZEc*qb@u8&AL^_va4;gh`vG(m1n$@` z;;O1vQ`%o?*R)#x>8=^26#!5l(tSb6CSwJOI41|SS!~rpIxzHuxV*_Z5txELpF!+; zI_*twm*iTDTRDMeuwvKYmTOT8w;-HR`q?dGt~C2`91>WrDzCHB@egAA2{->&oU>1 zVDz)<>;qy_*WlUSL*-5ruD{5BvOBVE7EBw!n*hzXBfQFrc5u}Q1>$)S``TslM|l~>U;h9*#ALgBfy{JWRQirD1m_;fCfis{{2|)Bl?zj(WbE-wWGgJ z-_z56c*&k^OjKUXCD6jUZ0HmZ(Vrf;eY8>pts#9&~B`&%S=}! z$Y@+v&O=u%vpE78ww&_R2HUA=#YIsU4OgBQ?grw(8%p&m;8bLu*xsNI*b;r@^nTj( zi@J2^u_m22j`;}1kM4VSkA9809v!sTGXDVT8O?3%RtLIk)is#~&0&P7tmE*c9c^eS2DHc8)virfoMbzr1Mj3(L_|ZAw~8IB6G`r zJFET~b4&|@?@qS&r@2^42|0takO3GXeJ3PR`WBmeQoTgDl})8o=G>fIr@+*%VDU?1SACb)_#C>(s?? z)alTtQ*}4>ld$tloGTODZ6j~_p!D-cz%J;tnxry zTEh{WcJAP;&&to&5p>AL+vS(bSN zvn;D~!?4LKVTLVt1!{4-h%6VbHRGb&(wJ@4^`bh<1j2ip6L32kjZu6501&$6U1{w6 zH)tBzEeCHpoliEcDy${#!DOcFqGev7sCJU7(4d6T>FLyHkycAGxIZisqi_w&12Mvp z1VaNbu-QR_n`L#BjoQbkb|e@MtVSf0jKNY7L~Y{Z?%?(8NFRa|r_TzCzb{=@wM{;W ztsY{$!NifyAi$aaf-#Pw-%xAX(6A4rkr|#NIl$&HW(*#R`YkN=hIy~NlgwcjCx>HO z6{!pzZL$T0%#;C^k>fH2z(*F41l>eL6?{c|{m~UQy>5+apWzmN#jNyIij^S|RrZq3 zMDJzAVhzY9&HWPH(3@~23t7&MWc-3Hl|{Rj{gA4kH?=ArP$MN3!gPAnDT@p z(hun;c_b5%!*E=JlfmePT87r+%BsMSfu zp2)PQ$W_~GDwTN(%AunH>k3*A``I^LB12BiID^k3y@YwM;8(%xdp%aQ-luF8=t3jM z@Z5rCqE8H}0E{}!X9S42sdZCj6k^ocP9i~$8aV=H4h&CY)gR}VldvM6j#lIE;*%hn z^H($9-Gd=TbL{#GfRTwG2%Kcjt$+>UxITn$+^_yCHOwg^?HWvy>$No@jW=&)a1d*1c@BO6`a_J5P~1v z7w755p|6^Hd+HjsKf~0bPQVLhY; z*raPO5}SKOxz@JRV=Cp)|FNP5?67J-HZ|Lb3O4A2Y#kI z(*d%oa|p-ttRr{RWGox&D&F@ES_kc1bsU*ATn9b!95~*_L=D9uR9OnDiPwPMAJyr8 z3axv3l-Rb`g{kHRI7D6EfJ21_6fQ`BW=NDOTgn78eKJ7rCli@10z?mftRGDH{ee(S zk*hMx$ae(uRMD($;4s{8+QrE2&27h(TP1zQP2gl=xywee3I71Zn*v%N#NH~X?w28F za1Nt!F}Un?1h5O~%Q6Z6CzfOw0`^;>sJuCK;tP7$wKQ6dP3to?MnXs~!*Y|}WPlC` z9Lb)ur>x$gH3J>K!{v$X5s5R7PdVsunr^LcJ2Ktc@$B{{4Xd(vbQRVy$Ez&X;}Ipg z^Wk4J+`Pz_7D2RvNy}(JVx$0yk2)`gH5*%dd%70wTD2cFcb`ydt+E-!Nm@+1p-C)3 zSOk&L2GpLKrQ_2jDie@BW)IXf9#5!eF&%HUmf*&2wpRG^GZlHfwQTXGFw9y4zV)^{ zj8Qb(Z?iJ?BzKr~=fSGG2f?H!IdJ70z-=|^DfZW+Osj3B*Rf|>D(tGjB}$c;noSNv z0Z;g<8|IQIsyfL%XIE6MQ*{b-B~}m2z>%3#5hOr~g)mr{kYx_I_Rh(mTxFX^ZOx^1 zf=ekAYicTK-kCYVFjk|-X$)HBz#?!FQ-O)xg#i^R4;Fa0P`Xn_owB7mp!!qHB@`8z zC5n#9HxNgxC?Ll|sascJx!Z4D)wb=97)q)L+QC3l zPT*9MSS*6j&@8En5;+h!>c=!Mgps_J)bhM% z#IC7hX^M-bdQhX}6v-*IaCWJgB=x((7VCLXrQ-%Pq>v(2iDdTRWUT)HVbZz0 z@l0Db59S9&}9{2HpN<%mu+wL}~bs zsJ64OzL8e7X47rlB|%LXQ}aWEP`hlBR6$*?QWb^_&Yv1r7gfko0;bRb<%AN%50qv< z%mznPlZEMRBXuuV#Y~$$(R(H>kL~y6e8V>t_Rg{@Yi}L-2+>19br4^HA-7kP;i59^ z%3WITj4#r{<>;c`DHBalnn!Dx^8FLIh50HgC?IZaq8p`MPWVz~dgIhcBl3bLI32+3 zV-Yzp8%;Ih{g~9s)*Clm|^W@Olc{>rI=XvCkCZc61=MEnTG*QC%tQU{tZ*2xbm9IfNldJsVv{jnERCHtx)k z$c2&)NXQZM3HiHO9Bt_8X0^KCD952#Y&;C?5>xHsHFgl#u!g}{1p4@KfyG0T-&Y>8 z78+sFa792m5)~0w!nNty($_R*R7;?P3`DE2r?#WioyMFPq*<9D!7@)muIOC;CJ=zZ zN%?mO1n>soCul5t{KwKW492sJTVvr{PF@LBYX>crj<+&g+ge4adM^eH8?~RntvF(4 z=cRx(>Llm=q5Kq9t>K+Qj;(5M>Z2!`(5T^*k_&-Q1_eP8yzLVL10PToV|er^lU4-# z#t0z9f!zG6W(1KL=#k^JFCO!F^*1`w73L{<8uE4%h*MgWcyceh)VTYW6A4jK??dPy z%c7#6$bry^SGmuMT3zw6bz-i6g4GDz#BQiY&_)({Wgs1ZOAH>ev7o}gp`;Q(ALW8~ z9ATsZjt2vtvo}tvz^o{-M`>-J!=&MHAme)?$19lZ$6&@+e>>-^52?yBjN{S2ggQQe ztssgDB1G_)if`=JlZrx}c4vBGlq0(_^w9@9RUR3nl9Cy+NjX$xb=w0$#% zBO8>!$ry?0YVzZ8XpbPWntMD$U$>~MYG~xqO0cJ(s-|lr0JI0<$!;ZA4KhG4prd9g z;~vFm$oeAu?7a(6qveZz%GE#ge6iI8)WvnS>m>hbtTa!m^5Rd#L#NB~X z=S|&JYLtv}WA}mAJ!)zN{a7*!AMSdyU(#<4gC{u3bMDo!vp5l6Zk{Wx1CB^=+7Wfe zMZ{4<5i$Ic5m7$;{H}Fc-^3na0IaYFxd4y#nEwE`O&S;_LIjnN3x8kh)z#!U9#IDn zYcs#GIh@J%Iq4N_Swj0DrwhUwA}{y$AtL+#0ADGu5ZlxgO~q6BkN*HaN$TFx>Ms8P zDwyrj7dP3r7&eo`oyHpXjgQp6uRj!I3#f>L(auwj6gXZuUQl@X3f}kd_6TWmN$2+K zbvprZeBNi}+Z|RMyZb#$mc+_#sWI6ZB!Ol-|ic$ z3k-U;!#t?Np+ac-DZd#I2*1@!eZ^EDIUS9E;Zu%OzW)F$y&}e)s9SU+dr2eQ^8<_l z5Dq86A!0w%eTsH4#qy75ns>saf$ewS@Xc{OV7X51vR5P&N4=_l0ZljvN} zRR@VYV^uXOI(TiRwwA>1S@}n9**x?ujR|C874YZ00Aj+SBA?`BZ|C!D8Jv|@BaX_`+w_>ejrrP>(XX4%&eSu z{{XjBKM90;{zFS@)hYr6kNan+mF|@K zJN1)CjI(MnW!H>$-XkYO-$PcI2E)H5Ad0Gk%2Mw z?lIEtyQzK}+3F0y{{1@Is!rpVr*84w`)*|Gg=85BWLb{BfhY!5v+>_y=4Za_#UP0x z7t}4h!lQ((qkRwkt44Uk#x}I?-kz0gigs+LS%E0B7!_1mECe0EzyQwRI_3WW$GsXU zOtIZNyMA1QkrSPudtxJ}H}tjD>>rjImWDl6J(EtXsO4LX43UIR~zX_+_b7O)j;&dSI^- zFu)W0nI!#Vw_V6!Sxl?^>N_tm3|P3|XCq4fIYKGd@@SXr;&Ot&igr}z`uTPx>r}f6 zf36I4{Z7FW(6v6^+;h_5v~tqayFV1!ZRc=*$Ly}w6nGS@gxRy?8@&yuJ9TBW>fni? z68()jfhuy9R<&;SI-2Tcpa@uq19LGah~Q)1db2dxywlpu(M$T6m9I(XZ+o77UdrK-_>4 z22Q~wC@bDa)N|J${6w#Ff2)?YJC$StTc746@N+XKIs0_O>1~H|mE&{jc1BC9Z}wez zi*6KX{{a4C%z_m)JS&&?`B41CH#$L2Zel(5s# z-U=124HRr{*hq#l3n(T#NX~K(Q2hJDypM6=nTEcFT{~;Plvl%#OJz>jw4Y4E6Hpy> zx8DOPY?Qf?MbrV|2^w>^Q9(-AwQHXOYZf;xRZ@=TVU{AJv>M8wAu6U3*&1^$gi8}? zYWg+(p4&neqO&Osq62N6xMmG1$8JVvlgCkQl_zS4mc#^t}K7pleR^<9aGEbn^Vzk(Ts;av{ z0fb~2k^f0A2HQWWwuSQIWDgCt4yMaDj%^)j zEMjC4V?(I8jsi#~e^5;#A7CZtvMQ5_)jocXQq<8a1F(W|0RI3_=p*{|e7&O7QXQrw zlluI^C*LL_J9q1&sNbab>y_obM7;aRKOlS>s5y3#EWgIzqPBW8=`omAQNxn~wv1Ae)QmXHCPaw8vq@{m<(${rY@-XZ=8*IpZgh(o=^N8Aps#;C$ z<1H$nZBw`+NfI&{*yO>;A1H}4)P~fpt=DzD%t2<3J%Aifb0nXqRe!F$sXdRY{{Z@h ze^CtDvmvqZyEwt-YpfjSwy|1~^i{LrR!1g!{{Y?qmr}!oCD>n@plRQc9k&XX8jzCJBR>B6{+JRT_Bn7i(30(VjkD-H+3f4q#76ub-R8D%HD-PHRjf$IMr9 zRwkj=xG#-)3o+yg(OX7hBeJE_O^%`t$Z|!945;VXx0`X4c@3p?rv%s=acm%D(Gn)Ti5kbly*BRoFRn14jmRJd zF#vnOj@*uM(($rzSSO*3%Y6r^6EhP%u^dE>s8b}n%CNoLgXT4N`95KJJf*7S*0N2% z-W+U&B^*fNTt$WiCm0cbHBoVS{?QnGP*Rv0Nl43K)Ol7%+2xV5CD zm#IwhF;5})4*V`VgU3r;%6zY0J+Sb|*$Yx_sGoL%<$WqlyA@tWfJme^22D6(om@oa z5eZdCvLQWNT-s`hZ>XAI!>R>T&O=0;BM=!u%FnkkAuigTO0-+k42(I0g5g5WF+BE; z-MaM8JZs$ezCRy$-)iUI(fI|KRkf1VT(dSDNoYt)vVt?6*ggc6MbJ*X{{UZfRWG4@ zK+|;!r%$)9w(5+^H8w(UFs$pe^CN3|vj+qNH=12Tekx!qyl_w62!SvQ5PL}-x`F1^ zds{l!vUYp;eot$PMV#Gjt@99#VtrDfeK)m01*S~f6ySK}e#%@a3NHN?`$)0XKf=Xy zTJELNnP3}l=YUCO0g2B8h2ZoT#1(7Z))%Y+Q36E4BoGXCkUsd%Bc_&@0-dU|oimkW znM68`bwgbJZM{YFO<0Aqs?xn8FxEzQyY=d>BTtwgxIxu;1yK-^v8CebH|cjyg|Mx0 zQleBsyO0G9wM$iSHq{^#OcAh=v6wbGIbf-8T^goJsTqSZ8*qsSY>*gxdvnv3s$c&x{GdUeO z+7DaeTWccQlQ7+3uG!BpMxa>Z?yNwLtlK0hPo#8pv_nOBS|%K62}rw%3Mrx|#NQ86 z)M%Oyb6M)qtQ@*C6TL&MdRXl-1(c8gh~uID8?vZvZXS^U`gZ0ZsBBL@pdta2+dWm) zMK%-XUSH&`c59MR*2=NLEN-<0MrwaWDsB4`BYNS-oGtp5)r}f@AR(-CF+n636?p0T zUT22sP`I|M<#`oBuGGflYHcKjKx7lSPUZ^Wi40VU`%I}?jTgA{ra>#rn01ku1ndN0 zfLM%!1EeF!9kmNL&-Io50cATFpI+o!xc0JKRvxCFqRWaxZ4n|14vMHa3(Ak*kNEie z@Y})FEHvx8eMv<{sk)g!HwRBr@W2^$KA=Z9`t(M|;Z@0|W41Z<8H~XYBkX%f>e8le z4=r@O$E$DlzADyVcr9etp$ZkmKuZ}d2f0`1Bfk~pQg5<8$so8SE6^8_PGw&V_(M>o zO|*on*3`$Ao~nM3q=2MWdUXL_A%Tebk4w76-L<7{wk+p=t^Bruy|U5_jocHq7dRbM zev{MKeWdK_^T-??>se|#jAgT(WaQGVnJu@z(aydsm2B;%IOkVUhQE)~8NyUS6)&Bq z;>|}^G-*@t^>wRs%v>t~QWxe7;#QKxqLVIaH~^f*pQzteQAkpSX@UkxIr*ia9E|(M zB1q6}Jti8>%F&>$$gsNSZSOt^iuIh3L1c%5uQoBheM2u&kcQ@jyv91dq_z{`oox&i@{k{5hGR#(zPO-DhO0`|Z8lY%uUb))E1Imnms&S0;<#MZQO?DRb2=3D$uqOjDCQjjrJs2^Rhc){8 zzcl=K#)jx!p^*h~?4CSn(=8pV1+HR!TSksfZfs$B)mX@?qWX_KuPN@EZD^>~bPKAV zhY3(-oGDK^x3ar%X}_jg7!(AU<|eEvP^IMBfb|$}nE>sdbASnqj>iNU9ZU5#S>hHo zjd;a|MAz8GhRkw`PJfZi3T6sqNllCLV?t&lhDgYP11&Vj7rDVfGEPkqb$GaH2G+fE zQI#6El*GFg+8<;{58M?RS>B&Zz=yS2NyHEB`>N2*w`Gnp`Fh#Ue-djkWhm6rIq zrrDD7cXyV!$~87*DTg(T{{XC}yQ;7dYETrVai;;39v_Nmt|B(B3aSz>f0d$XCcU*w zD=SKrZsi}5;!y{si0 zfu_Ilh&zQQbQ{^dAZ;Q>)eB5H1O_{J>rFjYttvrw6{k=DA7}sx&uB5<*kE*U+*qw{ zGmTN~>L;Q}-MI8|sKh48#irR;*Vl_;3^dzy$m%-FZ40V|<1RDG@JOhni0R>NOG~-8 zeHT@&w$`IFu->Sqplly8kIlG4LvJv1JxH(>(Nf*&Gf7+kBh&Jbco@v$a5K^eg5e%y zSZl9hZ9H=OAImN7E@Z@&3G9A-eYixDNhoD9jP`b6%9#jbz4$z;Eb!NMlv#DZ9e7@j zqj7k&{JWZ7QWjPfL#E(;DnkXQNmM&BK|psy!*qJ#=|7o4$EZs(lZfQVg+sJ5nv%n@x)MCBjy9C=sN}{{Tv&G6qV4NHb7GQs9J9Mz7NT zDO$do_ICEd=kZk@LP{d5Rgli9{7f#zB?7CQ4YFrVd;4m1l)8}X5@G=QAE51-`}E#v zK~E&SV9!rx=vei!@rW4iZ*4BuB#cq+f)#SLUm^skPawjS_qHgLZj!dck36IVhDetO z!|xC4R#&%H_V?3n;-{8r)7oilsNQWliBg$0P`==-uwDajC#!eD_E!(1J3NXDEDq@< z*Es|OC$}(98IGzK0`f~|c=5M)Za<Bz@BY~1*hX!u-SU%!Un}$ zRyqC?Lm}s~m%=_d_+_Q)w5_i7%1B=2sVQDmv1!7lektRfB^zi5}GWUOtr{l)dZf0k&G#2H`=j7J+?OaN#LAH8a%J#b=^ayOgU*ZhXaX z6to(EA#>%Bpei9y3o+?h%J$o6^Gs6!LE1@SBr`}5Mhfo9CQoMTf1T;=apSI_n@Odx zD85`{wf8lZI~vACl%%kkAs%(u&d9H26rn>_da!Ob;yh0f3OL%fg5j?Mc>7bMn-&SPPB7PD~7K4c4#>J6->W6EarzL{1hDe7h1f`f1wl~|H6%}lYLzSJ$8O&VB?7zzh%#fcv&=hR6U&qdv*agpmv z>*_tDl;>L4A;^0h! zG-$12`^Z<^0<%g}Qt}Hbki~qtDx|V{h#hXWpp{Wps}Z#A5Cnw)o(^(5k_nuidW>sq zMz;{DgSYh+yzJj=%B6A?L8GXCEXQAz@){}FGDjjg#Yt-6FxxJGqpy>K<81-_+WNgq zyWjAuhHG_Nz@oDT1r!t`XQfH15(93N2oaIouTpL9D$!*YXLA*tNy!=8pO_8?L2Mi- zJwtHVG|}-K%QndL^nZrrn8~+dX=gxuqsf(vGUeEVT&%}b}MzSM!$Mg+1iLG6e|HR0sP8&pJ*o_ z%t-1Hui3&f`IWM)@o3vqB8OxHRCzShl|8!?AZeGYq&OfANB6kM409zWe~t1~>PDDr zt*O}~wXJh&Ph`K60wM}5^}`O?UhyJXrFX|jg~%^Wr4cl^d*jNi$ag0 zt*xMHS{;SOy-=vPC)ZxHY%N6$sKV|6s*ctw5P`wcRNSoDXaFm1zzfiw1LJV6&?K=^0V@q@Dx~tXf36OEm zA|9kPCGGtpBBFhlPsL+P{8vq`e=0Qb{Ni}e+oq2N)2aR&Rev!f{{ZpF?+|CMUoTDR zmaW0Ig3FUd@+9^C3QNH!;;F)-^UD3#{#Wnv?7g_Cq=?}D{{X-DOlPf$oll{q1Zp*){39`hDZAU072E(Q0y9A%|mNRot#!+K{jW-HHQ*AW-dAF zQ8vL8dHj>|{*_nqMB|@{*PbJ#e@&=Yg#ZFf$9RwY{{T*$7esp+%U0VY$N=YoJoLTn zjj@Gb`Cw~HEEcA^20Yxug)YWdy-DOwz~J$~g1V^E_C;Pf9=s}X@dp0wC|3L>I$oM& z!T0))zyAOoHQDJEYA51_LQCzC1b&~VRn3*|2-`vyd707c$~pP{P_oMwppHC_&3l$b zNrGOSh_G%7s{ND&f3NF73TsW&ZNnUqi5-S=e||ciH20*-MQTc!#~2+evUU1fW0?g$ z$Jv(|9Eaq`OSWK1GiJa{T`{f+Ca8+1>mzZ*;W~;UcI)wu&t7tT`(z6P(n#ZvRB?~# z_3Ay{vs7iKP;D|jq;O<&9fx!D=}y=KrnT$3yFlPrCPj~6S7~E&ZwfQAEnLfTP>63r zsgWf?6p&jeD&t(C15(itcyYz}TK4kho|{usb{o{HmuOK+iD+lXxt*uoOw8w4V-;?J`?Gj2?!I1hT<2RKo0?y1|3KHPWh_WOPR0Qu#9cZ;DF z*#2Hev~}23Di;2|YBDYj)nS%_x5-IFg?alg+y4OF$KU?|Up%dD7)L_s+!-Z$gUWz1 z3Aje^YcXwDMk-zJx6S28}A8D>TO(0sW-(!udmoW9g`N9tUY72C}s|2J+-_>tjQ{sF0Gxn=7Gd zwI?gv_5@amfNgua*|@4)b6I>h)+tiFwz#wm>K6(PLX0-U1m49%oV!afDy3J`BdWbC z(<92QgOEsx2045d+C7wVNi%`dH~LO8k~V$Te~neT#XKq~)RpKy_szv&U2WrG!V&(7 zl}7}WjZGJoUcWjU!U=^*F_2M$eKYaeTtL$#C+e zEOTh&vTdYSPqdphwyw&yG8d^Bk19l#N@+Zb2k3F96%`ZI=PIa+`ksq(UZ>(|+#f2M z&zG^bJ|}q_4$`7RuyKqy>c_G1RW+wcu2xWzK0$yzBQq^LkivU|)4}y|^ZRON>2hk? z+l+CJ_gMZz0!wD++`3A8(IgH!inM~K!-A-aikvSBA5QSX>a?m+d)BvgFe4Mj;CBKT z8HNDv5)6!WRo-e;>D~F%&^FR#NN5>8#{@wUn8pZ@SB>kt+tU^_wb?dnNr~p5F)ib_ zR6^X_KS(RCdncdMqfmxGkusgcoHtQFkcAMeYwb4oQL(9IRZ!F2w6!!f3`hW?kjHr$ zW{5xx5G3_s4NdOsDgHHrnN}%GLzTu$7}*UaV2#o_?x1cBm9Zw_*0Jgat6}CAOIvRW zsvbbhaj>ayh})Ljp^xi6#LI-f;sOy6UaBskd~5g~mikVwMAWuwXyMga)m4M!5w-ya z01_lLl^FzdSHs#?l}!p-C-FCAvxXoLeOO)$Mof$lAjm+q{wH^oxhN9x=M8Ot$QEQeNbw zNaAtN{{X+^J)yfVpQ&pzP4@i9@9DbktbO-X=!XMMW#VFN#-}Q3y)5*Up zWS8>LQ)U@FhGg2RCjgc7kzR6imisDpaU`(73i4(@`4aLktI}Zi1t^bbMg3R_E&l*c zN$7CYE!DuIKpLIDG5xTyp7IAkjEBh=y!+Pr?-|qn4Q|Za!`cQGel4T%tU0V^j&t#i z&!U-?W!4DIW6@f8R#SAfElUTFp-Ph=fk75(RJEf|$hK{$c_<~!9Kqp391_H{a9Ct? zR-GE*{QHP60yh{6Pk7{!+6L9^z51`)HQBx@Q)%sEn7;VnVX{!`7#0zSgk8oeRg%Gh@!AJX-P2dCo2~(ry)4<7#j!@r08MXcAm z@fd2A#WPJFol2gHex{}r07|$rSd=J#C~S_at#?|yvbZa1;b?*zXi)^n1d|eGcp2j& zdi2jQtBv!r=Io4%$KBDc@+U6gxfTzMKt&~ z!aC)qfu=5#OI4v-h(Z|^(O#O93PDt+&G~~5FU*+iI$5!%8Y*4x)fS@Hh>FKVX6+>`biM;#aI(N)tG^jr10{ZS^4$KA(2g zd3*3)g=?+Y6}q~6`%uf}ny#vMt`ln03KS@usof)SJBLj5Jh68F0ECoqkGQ~%qjNA& zOv^&@NC1zN5KN-sbUtmMwPcM^j%-4z2MxTkxhEV{3n-|lp|ijKg73-tJS5r=7SXse7E^PVg*Lncd0HTaNI$h)q0as6@vj32>xsr1e1&b zAO;I02{1|G3#a#{X$_{(NosH$%;)q1GXZ{Gj?wiGncz z0ggxMD!wz5=DsTB8`mG#8!f0;)fqD|E3D{|0vw}l*$5^iDxl*|HT42aa6qE(_Nb}F z!K~=EJ}jUr(elDV$oB>>t?#bA>mJ^G=n8(N@w#Z3-4Zw$Io;SgzM_rQ4rD#M{3`iYLswxG_ zXN@#VpYZzneU&wOffkt%0aPXd2Zd8i6Noc2$mk7n=QH@OkNHLoaK+INN^|>pfh@@lvinq@yimSmN6g~#&*1FYdwv;L- zo_y9H!*$-|?$}xwEQ~1_GZ-LrZ%gpSrlUkwty-lrvY;vk5DbGj=6_B)=l6K)eX*=J zmR+YaoQ<8^d5U|gj^>8aZPjZGM2gayM40doSg{n*qa{v^`pbnOL{j}PxurstqCARQ zf{?zI%aYq*7%sw0FU(2z>my@M=9igCqDQdF6EXqGA$wqq@z#e()9p;7Hh!Qi>T-z} z#u0B|*pf*GVuYrVr@NUVimSxfHseM1aKKe~aYa=8cYUMU*sW()q_i_lmO1WOkb9QhWM%qRpH`HAEla~|XpCI}ho(`+xb#?smL`u@5b+Ls`w$|Vfi zxN)1E9iws9*pilm??`IY*Wc?RLn`5{o{YwAS#PoOt$im_(DbFesy`4aQb=}Ut?5=| z@<>xtbtMx{n}k)RFIBw8Fqh&BZ9MP+TgP3z$kID+T=XXq772{`x?I`J*b)|*l z8ugzDX_u+Kn5xF7oY+#c>0)x*RaHwzSlsFrTA!16le#@%Z3RnqTo0(=NLC;WfpqT) zHiqBdbh{6E&|GPyy2a#Vui8L)w%odMBqic|Xm0mq(?_c%7$ERXtIF9Y+lDV0{9V($ zJ))(qkpBRQR;s9`qL|rMtmFXF*{@j~D16uWpffT zM%Iux+9U|uj^p!BNTnVdu`!PxweBy!vfQs7(3=tzTI;)4r!3i;s^Ob9+HT?EAm%-E zr=y~DGUc-2#3AGa?M*MlT20=)saEjivendVgEce*%cpfo>B*!rcT}RTB!Lwd(a2&L zPK`>f!d+4X)dkEP$_x#{Vn8H7BXD16>U-vni_2>^W|fn%H*|}gT^ZM?WLgVpZ+Vns zjikvk?j4GZeGJL$GTfMi%VzI$Z`g_`>YDEOFMp-Jn|W)cS_G};27nDTO3W#NO&B?K zqz>2lhTYo;Fb7+-dm2{k=H6Y{?%EFM!C#n?0*sP*12A^aPN#uch6#jzkp5%rESFP` z@Y2>c7E)|s!jj%EX6!bsm?V@DSXE#_q>RZNU@`83=%M}j`FdztU1rtpZG)O`47obIc>7klz)kS5pj^w9fK9Wth8uc*4jG-549DG;O`~^=@wzKf# z55(Kplqy-t4A$+kpPjrjzSmQ?)$3$tZ%PS6({znOwSPZwqQh%%+61h4tFJPhdy2|_rv-8)rA{*z3}A9&B{jO3tg|jNNdVu7it9!~PZEa) z=!zQg&xoz>^k+&&EPTe?b`7IDLrheXz?5B!O-LIQt0^bEkEX-aM z0s#8pWO+6tg5s7`8>?`_&TF#C@bBoJf{et=C9urJ{k7*Dc}=z=rD{Ixf519OapB<& z*4$B^9IsOK-h)`R0Y-^NkXndsiX9ZJZa!)CA5e4(#FbJ2-@_xin-&2HKQIUk69tKw z1a67-3Ci@7O@((wv@q?3hepXPLe;6&Ox6;IG13dn5=WY`!`Oxk6km884ydT#=4z$G zJ>ptd(rek)Wm-zX!xJVd1{;(y+mQPylxZNg6hxZ1w_2rz7AB+s&_D)3fDAX*LkQ!% z!_$ptGV*NGQq0ql-G>x?<-tdTUuD$*Ymus?{0}yTRl~#3I-)!9f2-L8$)i8 z%K)yEOdB_?Mx{DsK?)t2TA&AbED*-wFaZAmr!r4laoAdI?6kH0)>o$X$L&~*3(H71 z;O%Htup#S4pxXML78{usOea`C_7b}jp%4$`j=FWFOMedA*3hV%ON+O9Z&i_MR25a2 zleLPCszFyJL{8udITdG5(x&tH)X**t)Z+@hKOrxcH7e9@Rci`OaG-&|Yby{y z3Zr`CV-HXg9ZH_Wbsnwdv(T$eV2KmjCT9ba{KtXF5(h-QUne|gZ)LOD)^`~7MqLgT zLd}jiZP_&8w_dS6u0&3(Hp?$ZB4}7e7d_1nwMYpB(Y2c@S6WREHt*MOG|IG7AR3#Q zRfgisq%#u*b}`wRVTPWLQ7F?52(l#aBxfY!CQc{XaA4&57n{JryldRLS-cNT<8~G= z)G*dfaXcN!a)+WxWaFe!gd*1p!9Uq#y5h1VO$hZ6G_^hgYxMsB#F4G()U8go;t5iz zL0fk3oR;;}0EIvm h41*gIKts8Apg}o>YAx|vLxO=Q9iO%9+;b*J2{VZ|+02}fh zd#^LxCbG&6&0SNnCDeT}n!F4)f=;QQ_DZ5f!Y}2*5dDz8bOoiI1=L5JW;K9zU_kkVfPKP<8Sj&xt=%6^uTU*|L=BRl5KkD-u`&Lg zE4LZ_u0N1}k74CDULkZq@7qDFZ> z@;-;RR;7)$163Ivy^Lr5`*k?;GBzb`8(lrLf9e%(Xw5WePqj-KvIf*adFd(jPiNem z9;mCrefb}^Y4;bE5s+8KK!6Z<$9Xyb08ew~ zxf?<+BPiN`e`O^UCF(}fwHt5aRYKT+2X^ExeZXV-e>4ML{7CVT(6sOID$g|_g%k4= z@{Tbau{e%>x>#v+m3B+62Ttx>Ze?qAv83JIT}Pi3JK4=voC&n#*_YJGQHtTDj@$^E zuiuevX?FO%QLcsc3iD0s9iWFNU;q`WjkE=mw`3A$06}iQJ@pzlH#c=I?%1_Z2`qM; zv_U`#UzdTv8TxfGZpJ7*iQVf9YpL_G`Q>(&7EGc;80-+3x^q3v@~?GH#ngyHvx+91 zq5>W-scm9(>x1QnEUFX!WWGQN4Fy|(Hi?AXI4c(#D%CG>PFa>)JOPMeWM#hC0$}#0 zyPC=Pt-jfz4`X%7kj`?VH`D`!aDJuNfZH)uLJ$X&g+<{}dH(>PpQRoPzpHtqTi(^l zsZ9^Gw!yy#Bi0)SAk6XCRQP`VYU%VH42D(u$pCj4{dhd|8L-LiS)Ub!2i2EUm-FYU zk36p_{{Xc`Rpb8vxBk8zwYsYHHaL&<{{VdTBIUN9PhJX${iFw5bXGf$rwA+dAXVjl z+#>zH>(Bm`fBSqtLYa_y3sJ)<2dCr0Ol2I`yE8eTXKzV5&nS&oUh7Oob*9*5mF{je zBZMv%QKE1{U*A>b5k7E-{8Q@nTU@rb*c}p`Mj)3`No+w(fOZbVW7UqUABuNY>S$1| zS~i|G;!k2o$dA{zPd-b4)HSSR&wozLEVO0gg z6ljqZKHPle{R_pnl=VYvYeJUUzM@hGqbX!bY)wvn;g#h`H zx)?Mc%A!Er&O?T;0U2S1yo#{q07*+ayJMbK(ql;gw*o*j=$NS9>vV6`Cp#g_ITw+d%ZI5I7hRI``pSBWqx-liE*s9UaoVKWvq% zkb)ox7>?xqGsoN8q$6|MXq*24`aP|Dn%Ow?A0ST~Zyy>+R)Z4Krs8An$yR21-Dw6g zur<~1G)jaBoPxG(Dky)5zvC@qLXEOCZEB41J4(0k@eM2i+yMj+W5MQsi#qj(<6BB* zg(NbWCJbP^DH~_1G2hvCp&gHpgIcR!)g^JaQ!>Ra{gVE+rQkw`OaO<^!6Ou{k*5|~PMW}mf zhGTBX+zA3n`p+KCzvP)mT# z0DfXHeKC(?nC-ym6AyLeW3r*#XBd<{lZaenZposht+j65DSn|ElNFOtR8f%JxNzNd zt_P58{X|4!D$lI^J)oLW(6qbqt5bE}>z#>tZ=&{aVfPNk~c+tjwI)SOhH+rWRbd<%X(N6z^o}5BRm-BXXO`+5aH{}{jE#6BI+8+&59jN+D7Ju znww~RSJ|VBz`g$fi)9>~X?W~>aKA540DM@yy?T@@&=nOIcbT}U1KE-}TnP*}6UR&% zUDuszZ!a8EMFplHGQcYY^3@4|00cz0eu~=THS>cO$f=GO>Xqhwd{W{CjdWV*_7dPl zLo#UN&U!&K`gCv=9uY<1f8a!U>Msp=!Edc;-CHm!;z5b}aAP3gi3AWwJqxREZg$tB z2Ax0}eZkK$j(d;4R}-T4-|4HSE~;;JhNjrwbN;0{Cn)qxs&hGx%9ACKLUL5=OEOC8 z8u0JgWGY7y9uPsrPChYR+S4j7FRGW|0CUXYPzV43r$AW0WY1yA$61T2!HvD32s0&p zBmV$%a!keviHMGeK5}I`?_o14cj}G$no?=%c~RSb2aY->{mG`=KW|f3b4EMX7Lo{+ zI~v7mFJV<>ItnVlyL+~`BAif2KBF6m{cs0pP)A$sO|=)?>T0q5ryK#C896ib>a=nF zEt2l-bD8+7;tO6-FxS*c{#3e z8tWZPU#vWbtH2$>?gpnSvXPKtuRRH_}{9yVvyF#r5DPoH*^p%JW>I2Lueq4Y(P`i%g zI0awDbm&w;NS&kuwjh=y4@i@aKXJ(Dkh%tDf>mTPsB&ZOwH zR)kNtHm+o@ib^Wu!1yDeO|q(jh4=YUX+H?-RZ1Q+T1%*~s?AcRLA7ov>>gD>nG&NC zr*oAIR}s>;hx|)W!c|?Me5y<;&Io59erb?I4*kzn_2r+DUMuh2pOEC(?Z$sWXLBYv zzZwii+M=U`{HDIKTyKTqmtP?}G(ihO*zz8H8n#o8sK(`$MuMrtyNCZRCR zO%QB=n~DJC+?79;C#j#}JE+$|>1u(1oIzr<1Ru-+!w5a5K8%dRt z#TVA;AqME`cAsEt2_OQb4aATKZ08u0IQB3J=x0$!fGnF`VUuiGI8A(MKU*f=<`7Cq zYE2lVS6hbTh=uF~6d_(Zs;~Tg+V8auM`CK$wxYAJ+7g=;-2@%r)m5KKm?C6HS($Yhu4@TkZ?!9XX5Dz?G8XltsuEZ#h7~x1k|v%3z#T)irZ4W^ zy=s1%Y5-iQ9;}kWGm{wZAWnMUWZL@IWNW<7Q`F=Y*uA1;FWXdBOpO!^E4&7ZI!5}n zJ{W!00rW;y&Wh_oD8I@mp|o!i(bF|5I>l;cqIp3b!E@x%BsSoieQK^$?%Eq+B>bnL zx0EQ+q*ibkka)=;PbaoW$Qg(|1^kP_HSPz8Vvb;RR^BJf%kk>`jht@f+0v5npjR4g z({<8ueJ+qZ>tv(HB%gq<A0VXdt$nf30he3AaQfG)Z5R*~ zZegR{eR2&s6A(lNR?z6BT~jk`b%3 z{{S8Gyne55;;h)zL6cb-x2rP;t7Ns(6D~FlLvUDepq1T&y_6`BLe$la1k?};M}xLMD3S<(WI-k;xh*55 zl9$O!yS!5`Z+NBFoyKG4!H`#BFso$9M-DPMEUD|{Io?fRq{rF=CrH%dJL+u3BZ?jC zQ^3^d-!-nANh;K>M`cTbM(SX~d7C~;jOc{OfVEe1Dc)d>TN*VDLQ46eKwM%-+E{W& zr`60!_nxc+3i2O$Y>fLv>TCxO@e>-xYjxFL%XQc0&#{L<a}6 z=#Y{jx9#fS^H9Hn^qZS@^V;ClH#IGjctkE}ygSKby(&h)>SuEX3n0V`jVJIFRYUJ4 zSwH|mOp?YAsDmev8Gsu>Jt`Ph=b~p$-0OcSDd*=plAkHa--j+OWueE+Y+Hpnh?C*Z zi~j)V!o&6r85t9dx+uaZs-dsTI=+K*N5r-3=!F~cD@4`xC-6cY+Xz0U4xsv1Yp<$K z-Mwg`PToUNf(ZF#U=Q3GStQ1L5MW6wQF(i~b`AElsMWRaVEA4(>z5ElxY9$hpP&1E zW0EXY!D*+I8*S#?l&${&I<)Z;btE*aej|8CO|j6cX?N|oRH#}Qm6J^#pb4@_B!y&I z-Ap>DG76ox))ncRUbz@E8&n(ueT3wFL120@ZvOxz^StBAiyeEsC+nOdfpN&SKU;{- zklQW`GG2DFcr@dxkteB=#6HF#=n(L~fD+c4SA(pZ!gMul5{o@#Vs^SLnNTYu5I>1b z58?=2%0@(!5N}-7sHWx0pr2BS#_q~VmjZj>83Pm4TW0UA)n}phb}E1LQ*dh=3P)?@ z(c_csZKYXEpDCe<9>PQD;yC;lLM&F>0s}L2+-Q`WGWgH%{{X^z6{fFhyQ^DORyB7x zr$7%W4&nd`N>v-Gu=OIK+Q1j+zK2!Iw#F(JNau`Ure}yyAdJR(t;Y3`>bN=cJEJO% z8z9CYix}=jA0eLoW=Aj{Voh~4cYS3U$cWTNUKDA@m63dl`2`R|sWjbCYkoz}j)7^j z2dhPq7NV=GElR4Q8EThiSKb?b-oz4Gg%8A2ibX=xKCk98DoFPrlRoPN=4SUi4T&>u z{)ro+g6YX~r)3#c%P*<2%!7>6k2dfFOgxI)oG)}nl?T|T$8c3bNqWw(nq7TD?F1EM z7$jt(iII^djFHE&?*KImse^xyc>)>dkzx%yRD;bsnV9+BTm`u4;J1 zoBXN!>1@Afu>~6Xxsd8!6Dt=DxH5TCBvACWCPV@W@?NXrs}G0%6t_j9Oy75I#V4#8ssneExG2&fE#(HWy)T)-? zO-EG#uoWO8ZS+$GK34QG_Av!I-%q`*M77;Cs8pTh*r}MGpK_8w$pD@Tku-h<(~lE{hKV zQn1kovqEbEwTtc|pbP;l9Ro0F)`{7L5Q)=d-)GW>E3IIuYVx^P+mkZ@ z3`BD|C4m5bZjL*%9MYS&WJ`&RRNSgsEYu$c2%~o58>$Q%frrdUz z?v6-CM9r}TC0H81nQeOQqUg7#&uCgDfeGf-V2n@==xVOtQ`BL$m~at^f-tnOxL+pl zfm3#1vBIn@n972{6@UbfS^*LwyrRW7wXRiZt88D zpjS|b0jh3cFsJgUzyJsnCNMfN%<}m5h3*1l^b!mLZb+ z)xvIL+;JpaioeFnyru$8gNPibV?GV=+iOa?Ug1GPnvSJcDH~9xB{s0-lq;b-W(g8M z81(-D^%Uii%7eQbN|_@gCO<6UVq>I+T|VRT9>#UlJN(M8N6eEF*CDHVydWzvUWp<+ zD;pNY({ef#=<%9xS^hF{)LsMy6XR8ekzu5}QMaNV`iLTvWubi3H5CXOAX9l#-k=UL zPf#>{lrP@ql=>b<;G-My5MoF$WRNmMW2?dc0O{{p@@w(yd8|BbLa&=5S6}wK(V_zE zzwya%oc{p+NSt%R+V@uCmx^h}3LbvL1Fz7U06u`Kr{*9J{{V08)yQs~)U#aGjNyv6 zShmNjVN=LvwmGC}49}j~8>niE-?66DOQ$@bIoVYc?y&rC;x(xBS(j;{Es25{s4`+C z0fF_NC#DY!=&f#!iqpK}NXF1(>jd(8Y)?<;Bm)AQ;}_s7mnl0&%{k+(YH4Cq!?|)etTUUhGZzcJD=Hk6ds72rwG4( zdE@0%d8I$#?ddp|QR*Xz2mb&#{eGQU+9hq(>Xc|w#DIC~HRDyzR(eJ*ZDCDSHhnCW zuBMyQl8lc303fIzBmI6#yrQq-oPE_eu3mu^YSyHnifjNRWm&RfKD=WSj*j0_SFS1U zfZ|98kTKWRxw+YQTR~XKuToyPa3xH!{l*GTVUTDDohH%5Rb|yc6cSFND5xr*bWebV zPco=RBXJ~|5+XAI$nB0lZj4s6r%u~)EHHow$Jl*)^^F?DrQ|pJ*5fUQgVk0|MV0k3 z$eDV*8RvlKh3bleoFXCu5|Vw95l-lKH7>4ZnE7MwdBkFSNc!{(R(fI6k_%u)+vyQRDge;XuV8IFs@Q&MVevuRUgPmDUp<$YB7AZuT6+}8~}mBvnr4ph*7mSd1USo8Nl_=Jpt2os}n_St0<&usRPp>$n?JQ zH$fu?c8;SM#*n(MjVo4eeCK3j^KA;-BY!I?i)RlvNXpY_+d}x0jW%t{HbufDC26A` z6-S?n-ahdT-AHQo^pO>IQve}Wq!=;X3RE!;fRVs=VfR$04hQe^rgCu_YL~j1Zq&}F6<8E39aJz|6M3^xEj%0MX%%)~N zi<3xJceP8Z@?3h=RX+Tu-BlGi`D|L*kzdU@l7DWD-c>BcR|Bn`WG32rs$0a=b&uJ_ z5>(`q{uiJ4;W_^R?f(G%_|Tvrk=y+`6_TujzgB1C1nLScb%WKvc>+r}u`S)Eq>jt2 z*+^-rWYWu2G*+LCXA(&ZgTb~!qN=>7UKaS>XKvcH#ry8^DT-)LHpv5t$TG%3!NDA6 zh4`Iub9JeUGz67Vj(;qJ9@#P94H)Uax7gZ$7T22Z1-8MkDRx#jGiAZQl{v(*x+RW` zIR-RdiTNTE%Ay>h`-!sUNjp?}zJ@C3tTeh#YZne`iS!_dN`iLn4Fy=`NSs7~ngz!6 zTVE|qNi0ix`v43G?f{&U7r#z_=}(M1W3=|BXC^&NMj~Z%BDgV=@M);R1J$rq?gT!t z`ywX_B#GCRMd+W0_Uvu6>L3_ODp;`_q>_GwnI}K|_1yjiw|j33TT!Wp+r)P#6FHdV zd;4{0xCUjcwg$v?y|Y~Dya;67rCi^mVaULWqHY2L5D50|&pyTcQB(dt6Smc?FLe`2 z^chk>WiTL2PZ94t{{30C>@KaXfAnV_%p}jy{{TqfbRY81$jyBgJ%u%0eiMycRBP({ z>@x1}{ZLlOojjX@r4x?DH3g!Q*pDh^4T>+|tMbDaHeOvIDXT8R)c0{4fEz}=KhIsdt-0j?xFVtFFW8I~BT2N*Aqm~LX>(WPH zxSo$b!($y7Y56XTW~$@lqKM#q%a497{6^LnT1r+|b&V5L(EC2r3BE_~ZE7S>_8q`%rTtkx~P17J%Uap%xP#kp8TQ>Uq6g&f4O|magh>NCX1` zj#dE@4coQKH{t846&UT~zC=WT7#z;%k;n+R{dwGmkc_)=+*RiHCFJG}u zKP1N9II@~$*p9dk8{d?5R|TexfjG`7^>Gzeki6H1p?gIFkMVy>Y{7!F<}v#UYPj^(UGNv6U}LCUiB22kKZbYbcVoJdocdS^AJ!#Qa2!m;-zC}l7E#^lX6b+z^$l#Xf1LVV6LpjUF z&mWJPPp`F;CQ3!gGD(FxNUu^AVZeMPdVM{5u<FDWlncFaraUlc??$;Uxcp>g=4lJwS@Yjfr$O7;D1 z#wDZmkUzKU)rYB8qvf$mUV+TvK@phm*!14W@W0EA0i|htoAPgIY46i-M97@gl~g=3 zwYPG-m=#l(+I{yC_hhOVD7fpS;i9RaDDlZ7ZC0w5p-;_Wjnxc^pWD6;IKl7G<-Deh z1$NjB`c!lJf7oN_dh|J=w{%>}Umkqt{a11w-|c7ocMEnb`??mT$a%I|cKYer4MT?0 zrcXQB7!d(pIVDa$MyGQ2rH$Q00uB^GU_X=tKThM{-=gN#E_RA4Op%$w{p3UdXCxo5 zU15He_|*@Lc-9lH>8&zNv!0s;jo&|QcPeu z-W$EIu`h0f)N(eDXhOJ#uU2q`mEsexM#! z_`_$h?Z4=oIrQc&U$=s`RcjhiEa>3VOvX8J{_;M^-&JiuQ}W=xYxtM(FaH3iw3Bj_ z{K}<$C<>`3?(Czqz<3yd_9p@vg-jRO19MXzX*Ss-3XqyXTFQ?L>ur{#6m#_@5cJ@%pJ+p;Z2q_7=o zlE>4sgjA-%xM^VmVV50M_2|8NwJpo3X2U^^rY9SUgM&WBuweAr`4{?s`6J`?S!a5; zQdZ-&^S+8b)umQM<;9$sZN_!6hST1YP>f1VuXlwFz7SF81w}<;!QU2i>+^3<#r0k3 zLwO;or7Am#4Y=)iH2|MVm~k!TshMcB&?{QkQ(l;AVlc0m0GQwiCMR&tR$6DSX?9DQ z_A!)V`7YtbV#&1kM{3ovimW$&^kV2P&X9nu$$j=jke(h$i?W(2iIIMZ_)#>=t4fx- zB~!8qUsRf5@>ZJe+=z_?DZmgG6sQPQtU$M=Sx=;Z3V=q?J4bvOkWObaBc`{_ZN(RL z=P@$eGZV;($6zZLp}}nvnG+QeIb-MNV<}$KnqX>Ru|g zS{Jn_Sw<8Wk3;)-B{LIbp@sBrX&zS=amG(1W43m($Qktxm-QRU_Z1DQRb7h=Kv4!kCo{+$w-X1Mx+LI@VMDMJ}V16v8J$ zq>6BefT+u$0*S}ic>8_+Y`N3!E=Z`i6%!m&RNMFUD-ut<_2Si~PtwUJ@1NEP&-Lr; zU0d%@9Pw86%Oz()3f;SGcE0MW=B~mF=9*Ssl?ljdq^%ES2a)hlHjIV9`=aqP#Tq7u z;(EtTU@8hNN!cALqpL7+O~d1H+6t5*mDCh&o~u!!%)*;WpG-q;2Rt{o>6}E6I<~!i z`$niN9^MiiZ^76?_?1r;GHrqIlMwIl-@lwjpW)7+tj5I-r3jAA`R z;{tg3bC?|_T9sHh`D)qz z7PTO?0FccAvZNIzRz#3bq-~Hv5@OwamGL*i?P246{><8x872p`Hn?LsCBzl9DeYiu z7{+{~k0wYexamfILk7tbgQp>c>d=TP(Z3BoC+oWBiO!#5)Y^@pu807F$nFtb?Jy+M z4zM>WhZ4k{qdyE5f~lV{f*^if!*}Z8R|0uIlmdFFy00B8cAWk7cjFBOrfr4TNv*}P z*_IO;qh_z#{AVAMfhIt|Fnv)cL-n8^;^VIVKZqwsY92GArc}1K)hc?aqdRSvc5)d} zNDB)kmZ35R?W@4u&}&N6sL~3;B}tNU3C}!CoPi<;_RN+wuaPtuewgr+C$P(P{+ahi zo1VsBSt!nPXsXmazL4bEtT)`P60MZ2hq;y-f)7TxCl9-MjTFQ!>51^*6 zob5h$CiU5qTN%$XRn=`YAPj=P9l#ck~d!S&c&ilKQ|Tr5d7@(o?!2)6}3H+gK={RC7-n@tuxu}EF{zQVivIwwg^yJvSmxBok|HqRT11ct!y?p!CL1PE(KS^2d!yTF zmpYXsYRc*mH8rG4mfX#_)bkv9btw|tfTpb5wy^xY3!!8g1;LqKLYYyLV=;(3Oo{J4 zph4SSZLi#@@<>?T4#pRuMkF}!Em)Tx0Nme-s=f7an>g;NHssTF7okbz7rUz1bMl1N zyaQC-(Y(C5^KVs&s0y=rbXdxYbqH`v1ls|;xXPd>5_H{8tru6K?2gNVumh6;#TQL|xzMA69Tr@9 z6%F^@78w#yeZZOVvqYidIwH^kQrgjhBav39WqqsdwECTZgr^)k0JWB=qUNc+t_O8R zoU*}E&D~V)GDb-|K$+T;d4c6t-SQV@W1H%B%M2G7pvk?saay?*i-u&_2~3SHEdvT| zIbYF-pb-HY1B62N+?5uFwDPWv&XHb;thLbYrA#u~)2B(ivrEkMiglE@tH5Vby$R=~ z8wziIzVhpM07=rLq*>*!8_Gu9BsEBNQu&wL<^`#? z0>wfkWInxZU-31ORF)H-2Gt;L{X_xBF^C-=a&6J#_V?4*xh}rTb=HjE)FU!&Wv$j2 zk*l+)ZGt4aQW(xU1s+H{6T5Ol+7b|4Li_uKC&Mih#$F5Y2p4MiHZ{VlD5}*OixPI! zJJm#~4gp!FY2XDQDV?KhboQ310i%M4X^zl0FU$PE$&yLy&szBn2NJ~KSXX2fem`T& zmR45BgDwGG&cgdvl!(uSnQ`ABh9cp{G3@M?lpaJk5e>y?*L(|YsOnc5g&Jti$WGC_ zYo9QRg+O3%R5;8!vU+4F=ysv4R7O9CBAS*B3O%Guvf?;^Ne77%dctFP;JGEv7%}ns z$P1j`%8c$(^^>kam@hK?Id;sq9na!L*e_zysdj~#MHB< zgwrar&K+tcH}gaaWj8Cjg#bA$l>k}x!RWO%r(O_|EJgLfW#5y={s@*8N&$s$3ttg9xb;Gwv&%j}^) z;rE4VTUTq1Nlwadxk`p8z?Owltc&f$)%^dsyJi~3i(nC1>7X8z`!)+Nl?SBf8zA*Dbs&VLr{ql>$h$c6SQH78IoYc zt8^5u*0_e-rO%t!`;yC7mRSwfGHSLgm~`23m)?_J%$Nw`H2W<{XWRmcN=Wap-S5GX zd#{U{wvlkObt)cZAXEkl!CfImPhQg7h=IEq8$#{C5vJcwRjFK!gc4Or89tz5WaJIJ zgWS&nIQ|K27F)Qx2Jm(vL$;B2b25Wjj9%BxlNt#vs5bgI#Ar`5CFN97GglCS2?La3 zrSbC7(JMtpEP+p#=_=HLc%}-F%~&$8sul*)K`>f$>Z)jpjIgVm#P*qjF*qg(B5@Pf zOTVG@mIZ`iG#cJzRJ+X9MYW9;l){oJ4}_NUeHdvu?goI;p%SkOYMd`r`0a72+b*<~ z*$mbR8N#cmBpCqA;QIrPyYoP!R7sm+cX%0{{Wg#s6p+B7|%KB6Y-19ZMUK_d3i2twJvsEFE(3} zE-P;)IXTI1z10p^xzbZ@^AHhNP}LP%Z@8$EDoXKh!YwydpbDT$s3BMgfCKFtVKuOhmrpPZ>WGk$T{nwO@FNa0Q_C+d}krpxvjPtfXt8W<3xO40O$<+z9uaw(m77~qYZ{Ieu07z6VnoF7W^<0ZHkPPFT~J-YgrD#G z#CH00(#T9NOTnzvHu}|z+(Im-$=fH~R@O`Hpn*s@z^I6*j-oaW5_S|{vUEj7+q)}$ zJx#mP-i4%}bAn8J=M&cYHEu3X;!*arKpw-epVKF(LmQtEbu)%o$7tzrTF6d>q-4D> z$`o(~f%dN)p{XZj`|-za6%*{QzLBo$MwnV)b{?WQ8RsYd{T-+nB0D)XBy+&`Kc`iz z=N!zM{mMG+I^?W>7lj@p)_7Wib7e18ZyA!k? zg3vXFJ%?Z$V#-C{Wu+@Fawl>$s{O7#z``|x(O9H2it#+)`#RVYofbGY^PN4a*CkPD zzY%L!w53{t3#!Tzm~T}u#TmA5X9}wO2t`xsVgP-l03S%; z5%mMD#YRIar!U7VDl*DyOfM#j6{uFV_a*do_ErXs*M!!4HcTJ!KHH$+uV<75zurG9 ztxrR*O3Lo7HD;-5?kZE-cQqfeOaziRJxbE-H!@q(VY;XUGO>ZX05A|$ zmOVh{+;P=wd1l?VS$9J^zSh;-Ri*S_RLX)ZONT9|0GWN()dhdlgVG&DR8>w0Nmq}z zU;hBZ%{$6^b>*cn8j!2KSzB_jVFW28gRp?OfMbmHar`XQQ^&(h5dcG;eYl20PjwIbl!k!DzdnN$m+nqDEH3Y z^y2at$^C7!w+0v$*!BxX;Z-wZGApu9_R(2WIB=M2f--D)Lv?=!$=1O;5h$Qf6nMpK z>IxL;nub7f56ByjyGC}7+{BKK_;bQ0^+~By%LglunmP6n{bz{)^||rCQe5D$^>%-2 zm)sR1Vy?uWUonnSkx$&@!H*-l`nvW3Q0gj3PI9QceBytL{xD0c%gr9GxD`^kAco6; zR3K!5Gm|nvG4<<_ykD(7Emr1{1Wx6d69Ra~C1G%Wf^*ZGX%k#*7+Ab{c>7ajf(bAd z?8l!KS_e?uu!|wFUqYxjtP@CIZ&IJ!$ixNsV_LnbdgUsWMci3-#K_uFfr4QAw-L-i z+Y+U5TH4ydO)6z;oNhCK41%$Y{H02mB0-q~(tk?!@an98H@cUFr3K14cXc|?>q%U* zZcLYmoOO~EZAXJu4!>besrOH^be@VWscMFTi1KL+&NjdsNcw+%zeT(^XIOZC(5d;= zFnN+DXX<_Wvg`{2@!M}xO^u7>FVkJEI5I4@2#-XJE`KA=3!jUINS|_5R0ULCIQxA2 zPtkN;Op$3<_=REtk_60Q-MWk$@C4 zm_;Bbrdi2j>Vbeh{UCV5#kDPTyQQS1S!ok3>GeBK<01!OqcfA+u6R7Mo1`?w-;5el z8pmz&y?0wzF0&-5mynCGSt5JcIyhKYy(8-Cl^$0?_S`;*OR_)kE3YV2{i5MD{X3s5IjlX$5>Upu8#EU6(9mT?B{pQhN!XW zQhAU$UX{(8fNgwx6`{>q+4$T%eud~S%YktUGxHj*S?%{jk|L61dR$}$)!rSsy z=UORfje1DcM3nwD)zYY5C~F~6O&VgMplVfSWJNMokYP?`Ku~r9!GMN{WU;GFDco6H zvn_L!os1fyk%H_&0I6a^V8{?h5UsemPmX!i>iwgt)$6QtCaSoMv~ROv2{Ibi1?DF! zhxU;YRbTN-Wl^>56o`~b6@EeRMzN!Kw@rV*SMuoHQFMX|IHy&LGDP}boq1|Z3j^j2 zvN~?n+UA4X-qQxHN)58AkP5Lt8FxY410)k4$Y;DpT9rRzVR)|T$6;+MExCu2mo<0Q z4Y^F!MmkF#EGFZFuKmTAob;oSh)}sCQZgj@qRkgb)NAQAYSR2Ia1^6|6`tT0dWD%6 z(pg6MsxblrfzoB|b**+S7{kmjnUkLhc5`((xH97bg@w@Gqt;peYfNlsPhr04_U>`pKp$cDQdA%WB<=Xy2TG>Y%}T65Fb}yN!2bZSIFu= zj7c9(B**RhdvtN~drItW@8fXgvBWcDAgzj-`#$c3X zWzZKsv8N)NZZfU|h~k(KiHiK;FZjmsQ;kl>k@8-cMT$-wFfF*2ERzaEi7V-Y$j4O& zh<_FMs@8>w36Mm00Agd9#2oe$(y8KfsTMmQV|e{}b$7Ef7#NJ_=R~%HE~efyrzj8{ zafu3HG{uJ+aK#YCe#lAG)3+adOs7Jfg};cY+XSOlpj6oE^ykYt4NL|=91x(y!Gj>c zdU|yl73xr?hs-F-RE@A?9tib%NMZ;ffXU?a&gs3mvOHzOX6tOdmnd5IRnCo=JFf7_*B7%dBg&0L zm(!k;WW%In3__}tl61y%|sqg4T3 zNNuH6q0H_r7%xx2HjPQbdRd5rxu5}zC${Vf`FmvbvBduX{3=ayRzQZnxwTvjG|1a z2eOz10JE72ABnMhqVA__Nc4aB;(crS%O2SvjzNp-?d#&thTA7*xuLU6o}WoehT+rH z$*HfEabsy5QB+MBQGAv|1@;G95EN{GBvfCFUOVvbh`d8}O6N}wYg2uqwMJwDgZgEG z4MYWgcCjaRSE)97rLtD66gZ`{l>{u7Sd7Sx(;lFrL_~?|-t`{A#QdbNfoF_e;F}*N zu?X|yuu|J{JL2PF>us7gMbQWdQ=uY#l#x+?=Zy7#1$dU{#7%E-rj^BKZ=NZJbudEi z3X>uL1Oh++$sILm+KnoMXaR`r^AG9B_a4*L4(1yVK;qjoE7bQCmUj{Dc0{XL&Akb_ zlEH16W#(k}Ww9sZHp+vHHu0%`WG^6~zsYwQ@Ry7iO%*DYp;q3G!l8{rS$8hcxR8ij z<|rZ*6x}L%um1oSYPOzTFd)<~JV85w3jxDz$|ya@1A_(4wyvawmqpUqJ}H`N90wz* zm6Kwb`zrg9U6tG#U~KEXKG)&&XR!brIr*^vvHheSqcUtvdRlU7dtwi}%D3w#S zwwINuyUfhq_Fa?2+>anir#FO2!FC#`jT z_DP3Bt!kdyTw4I6=`q+5=AuX!o{-QAJ|yZ8gUChrApOx4RbIXq{8h5K)$a8BYmrlW zDN^2*W~O$qP)ULo3opFH=cw9_m0VJ#POGbJpGuS8BXJ;1=V?;IZg`0RV7@&`$#H7A zRnYZyX)=c%Lm4eKp-vYN)VmQhY6>JK2Apxnem~=tc<~p+q_wujqz$MSq6ymo;8AF^S>u(mmMwqE&?(bfqbWj)A^ zvFc?WVHoPB;JRpJ=W$P+FR6=qBBkcFS9K8d)psl^6=Ai#IeqUBx^}D$pG3y?foCB7H zq}Ho=DH?!Osk8=mg=50*An*(g!?*`I>eVUsX2tQ-OZhE7E?iFl-n%YD79#BY2MuK` zatJO;2i>Hz$IXcG8Ji+9$#o?*hS?!J$cnkb{GyWD&s*0hTv11_Z)%J@n)QE&Mxjy- zYE{*p%{{?TsfR+L{#GOhZFK{+3Z$2U2yR1SL>Q1y5<$QmFopjBQ2A}6JYw6L>wM45 z_3xXpTgINWpN7oGtm&D-GXf8x8=H!0Xyts%AcW(rIIz#qWY{`FY64@?Iwync+gnjn zL{es`PTj(;>S|e%h^w(2(G^ImO!gMv&0 z6T8JSUBly!z}$9vi%x5~AHQT+-UU-8I4&(n&83{EOL3`9 zHv<67jsV9@oLKrWY`DFYgpFN^t-D|>ut)lSIVl27$LU|h@qfwL?MeXJGRty1c^NiYo98L+q*FY z?gSC)fXcubAWVB1l78Y3Dl#y@wx%VK?R-xtVzHp&| zWAw=k*i%*&*QS~ZI7mew;r{@Kbqnnhr8^p-w>hHJ=AV|dyE)O6^!8geyD_tJ;!j7M)TB-}h0TQAqjnx#hyQ2o&Dy=g6 zn2<>%IBXr7ez+*sEEIW8JCO`$cF;l0K`H>mEK*|Q|l>`jArH&i{C?5Z0FCgYmw z3zbP%GGw2vZN-w|5d&|ds~1_bs82ecn<-2^i^cx(rET}F_!U-8QgT>X9hlVJR) zFlH0bAD3HNQVq3jnI#|~5qkTfu;8>j1BSOh!;K?UOWQBTI<;k}9}pPRWU2#I+6Xl% zsNM5z^^N9AfOkaEnz&lZcA90(jt)IN!S5VoW)D4GCYsUt2bCYAm39StxFln^c1=Ds zt0~qbDHk1uRUlrGFk23yWZZa&4YouAXVDD!ACI0M^Ny=@mTIAk6jjIs?GYr&@0kAp z;_j!Vej`UTnaM0fmLmW>pKieO9fmqxHs|W0;$9(-PO8+}Upv|Qg4Sg|Jb2b)J*Obt zVbsy1!eR_?Hp!@w8%Bx7#h@1)maaPS5*ctO;sutad8SwJ$A|A4-nWzGn~(`8>{}e z{6$jhQq!&IYzoyX6~Xl>r@o>bjziN>$_W4&1%ycJstQZhSW*`goXo+3C!Wy+#yc_h zSU#@N`v+>=R_igzb%sYtDh@ifX8TZUBgkSr*4mbUu8fBpZ`j&2%!NZK2q@#u^4H2@ zmy8axQry|r2BjAa$iYLF1?jO-E44%VgF4_KViA2^ORCoN?9tF=XNia)L4euDNFdu=GswUyM({bB%(O_jV%M8Xh6Y@E3 zt74!B!j{uDEi+A8`juLXE_|c_k1^^mnM{M}lCDpha0iw*kt^4?R~Hq~R%ZShh}$P< zP@rW=jlw`A<(eWeIyhze9W&YZu5G3^R?5%ti$=+D=$SN^oUyNPU2V6*G-Pa1sO^Y$ z`hi{>U`b4zLf~T7)R>^K6x0v^AaKz!B$zQUSKNMB%rQorTSc15YzdIZ=of$lWRJ@R zMh8JWgK1LY&uu$A%8G)+R$524qKv^m^|NYjBD?hpt}Bg;WfDU#%xD~C)eh~u+*?vb zIa*JF?nRXfR__-`=uQHVrW7zB&g5lML0KS(Ef~-ir9|B-PGNU&CPwBU4oq{Nb3F*Q z_FE?V6!D)Y@x_R=H}7PU>{kk}p>_6V$u(*NGe%@~To85U%v$ug+cS z>BYh@*&3#;=@#H22I04|MwxtFXB~DzAq<|=Tr)*RS_SnNE{dAAD0*Lk^!B1{p1URe zSW@iNzlA9eSyylhJhcDyMy!EBfhs`&iIY4q24jvRxt==cSM-F!CR6zT z00+ri=4i0zTa9g>%coE#T*suhE>xm~k&zKZS@m@4h@Xma!YHRUhMA_D?P)2}b*PlK zs<=Nk(4km!JAj#zGd+HfcsVOMSS`a2pXp=$(kt&ekeotFa56(wN#^8fEDU( zbzI_kkEk>D`ti{lONXRFqLQTJKYpw0%T1M}JZ|wHD99maH1(L+ud#=$K$w2{#(=nL zG<8m0UuyM4;ZF=xzlv7Jdb*cA8gGXBP>wTpvRV~FSt0ImqiVnsl;{L)&FE1~!CxekC23(;p=e*{L@oSoYdS-)Mh_2?k;C>C4f>y zqw4l+Z%E!+GJuYWKCR?N;2Dn6RvI8iHtq+o>s#j5m|n`qq;E#qmk%4QaxF#GLtjAf z3r;fYDAKjVZob+_iio6&ypakARpaE37g?QCNHlZ zF@a>$hn1Jmw$Zlmi4h44z|o2ludlInbYn&{>{(xY%c)UIQ^zo zn_bC|SzQ7+`#!FFs=RUk0JKgNjJe?eOuooGr|EXNti6>3b5kmUTe&B)k8;F-2PBal zJ84>4UDsL?0b|U>4}Y*3_v^a-ag0}Zh2kEu(-=$DvhA^{c-0d}If79Mv*)77nEwDB zO&oo~lOad`2d6)8x5}QwP`RgNR=v@if_IQ{1==9N#0*DZqn@pEr%^X4Mw-PaBOSty z-}m?Hkm)-2JjP@*j#W&yN9k}D4ewt|-Q#;odnKmg>(T-PZh+8)6%*E~~PDbQn z$8ix6#|=@nQ%-p7iT?lv%5IV2+pRB9T42prN5}>SCulzH13jk$o}aF@8W(n^vH2B; zf3GBc4`a_&Px_=>=ojl zk|SLjZ}LQKIds-*RJGEZPtvQc8nkAia=Xy69<_X_RA%&+2XGMpnd_bYHC=|VYWHeL zxOE$5AShx6XA$~tJ^RwbSYlAsh97w^5xm!p+dXBCNT9K14ZU>pS6vn-!)Z~-?>fg( zlo6Fxmw;58Rr{S=;!R%hToo?0nN-vj6ul-w04AH6UrQOLwIh0x0|D~!+cLX1mK5&W z>`4$n5}f+Wg7Nj9(qVH z%85QGh%NHkww%}DO>WYa^-I%Kr6#Df%_FrQqn*p7dt`#Ngx5pDK^5=upPh{)tc`;)^W0_5t4pOo>k=Xp;iTBDET)Q z)~vgr6R3=}481yC7ufOsXcXwtgA@f}K9mXKL#v07Ikk1>!)+z+A^OP}GA z(g}5wBcfDMwnDKgK?H#WXLcZxNre*wYyeM26W%&MTwysz{M7ma_Z-P4)3J+O-B#ui zX41*YWh2g%qK5d%BR;8N8~D@^qnV<(is#)z^TIl=r+Guex~1y9FvhZ@Qgx_k({T$U z%Lt-rF%nOhpsMWzbk}dL-B?&$T5KfL8%u8lgP&abjEs*@q=MY;Jutd&$L#0Gj~MFm z?CW1_tYbw~2OeOmyWTPKfg)`5lUC1rmS*0fN*CL>k5&|}?YM~& zIL1?iHLD{jkTK-^oXX$|ED01**I<7~L$2~kN9 zdneBG_;cYpnr@oa?pPYt<8*EcyL&F;SdUk8&jg6-#L{#mvwedEXPn6#V*(?$zgXX= zr|5^fHp&1#q}$SE{ioWx*w&fF1P?j^0cGvH4r7>z7y2- zC$2oYY(e5oa&S-7`+G>wZmdl^Pp3op)iT2{JCI}p+(&$#KDcrJ08|Y~T z&^XR1l4<=_S050IYa&U(pvGXulx@7>$ZSZ9+dQPQ%yvNBa3TPUY7MCji;MAPLY=yT zNCyMA87H!V1Mh*JzNKJp>Klr_kv#j4q-2soG1z30)n!5O>%;vk=Ykl^ni8tX8FFGb$rzCO+(H0zfEtVAH;A?EE5hx2rPNiqW=)&8 z68^2k_EiMQ8Sn4X-o33_X;iAzwL)2N54kgu?t7eoAb~wfw-=9FKAGs!bEbnev9K2G zDRNj~4!e{CZxVkjK;_0P5Sv7HFAK>K8%jWEf>Xes7@>ZrpzLFCY$`O zgo6e{4jDn|Pet)nrSFzO0;?|Q;Kas0lQ7a*aIT9t|IIH6ii7mWE;&*L6&m@HyQy>hOJv+xZfd*y zmTAapz}u~tDdTCT>((i&poEb73NS{5s)PNjVu?)rM%Js>vwbjAU&4f-6onhdm%04V z<7v%631A9>O3$d02T7>ZO&3$^9%0Pn`cx190A0X|oPjtUIxsVAFL!TO2x+ZO*t1b!|ddso5$5B<|hJO=$Rj+lYCZBlCXJvD;YBZ1ea(1gK zuq5DmhRK51hzyfNhIfxW1u!u2UjxDWVFkTPN{8z9`81a_ja0psyGT{9T15vFA8Wr9i>{h zt#JNc+HS$wO(ZDH87hc`Rv}80NP14yJD_y7mesDSwOWh10XSW6=^nHcKf&fo?07^y3o9+t~b<-7mnnLimw`mq;=gQ z;e5(eQmZP!eejhcPUQ);T#N?<1`-#hI#*`x8qSc~X+YdDyAmKkJAm|zdZRrGVhv85 z&TO&y`$fEghUQ9_Ux~FQe0T9{5t0VmX(~eo(zPU97X|i6)JPFrYzclb*YowgJuX(z zp(?7?h^9qqWk@GtxM0-Cf{qjreGJ2`&uv23t-3#%SB8K=02l&tKE22TFnVb8zWJK< z<(30ieXus>d6-<3=PI(m*Z5MqhQOqoTHC?{ETE!`LX=qL0d>;xEH{WT2Xm zT6Xrfw8E0CqL$sjo%@tBwm_y;h}?Fz>7Jv~&^+2=jU^|{a&QTG$Pgzh%+7E)?o`S( zzVOfPAId86N(ho90DX8viW1oRv=l=o&1JFpui~hkKK%AoX+12>R#?XYl5rB)D%`#KrjFz z6+i=fu_TD<&1&>2pgwHW@5~VZ08AOlIR-zxtLK{!N`LnrI(wt zHkwVe$n7?dN@|&y=^2nG3?;T~_TkyY+eif33RRvl)-@Wp&7lM>WYple*ifYZ0L$|i zb2B%o85oGCOc&j{No`p9?N3xgN|eGf<8-K*AqF?73`)*q00@ClJF_dVe{009qt$YB z#SL|G#(Nx{Skyau+3ib^awOUjh@^?GJReYmZHqwDjj-Ej4Dwe^T^XrSsYf{>+Oeb z?ufp>dj*MUB5i!@3h2$kVZs;VLoscrX4B$PMG#BY!M38?tdRV8@WR+#=>GuV^l0yE zaE`&ZFYz8sjli=V!GpgA%*hN7M$MHP7SxbGCS-FaWuP1rnNToE1`6h3;?emQnA00i zPc4?w*Vw*AZJFF*?@SrBa;xh|mVNBHxetjeZ8L75*n%l9Sslq&@9+nR>uIZa+9mJs z+OpA5;YcOoY0?E$f`5cv%U}jb0ArxEY%Rq@Y8D)Yg9m8}FbKqmj(_pg_8vlTa-HV( z^SeozJin>FmX(#_!_&^j&-q${5tKb^$42ELxywTHVyY@1jcemZt$%ZGccN3;rS^@) zfTEouRh&2`56wer`pU7$Z0or4{Kc!gat0<&M1_LoVg#X|S2zMOHZ83DeXNVBVdcZR zas1~HwzZuu3T)L5D+FrB#Bi34s{zDhVHHgZ1nnbRFM*97@MAE9q=y z+K*XlY>4hM+NQGELmu-iu7xd>5P@C_hV$(Mph${9Dg1<$18tINHp8!+mjG++(=*pU>+FuJyuSP z*O^tO5w@gam1M+f+9-2uG72Zw#2;=`AGpM=aj{etSDlJzq#$0mVi1z23aixKFY!9t z-B4E~n$F3wflZ-b$*A+30LzA9xm*^SDY|+U zYdXzsXiY7(S$8mWW(*miIW7Vshf`4bWN_P=#Kivq1h{n1sDeO)4YwIR$Y~*VjyDL# zSkP&m$%)oyS^PTNy-k+4VVl?8WSaP4-D7u5FyoSfD7Z|r^fn$@Ei~I|NZT!stsV6t zD&2iPEU&g9pi_K=Wa3MrmN3t5moPE|EiBlEM61`;ijOnHCn3CFlki4WTfN`>$rdgO@n!OkQf2Obr#;5sduWIgG`J}kpdSS5MT-9 z8R!cI9}fiw}@>n z?e};_~U*elaw4K~}f?kJJ9TXxU_ozX9VPg5=^6s0uIROUNmf@kmDWK51hhW0LVvGVJj zO0yur)tqMM7MVwsTUW<7kzPPRgJT)D92Y%*`8^fH_5ms=5vL3B7Ryf2sUz35C(Wko zu?Y0Q%d2e!76u`~+Q4KfG0@tURLYk%eM&(CxyD3$j6@uqboBWtzcycrehy=rj}d-V zPSCf-;NjMJ9AN1#f)w^pWy~~AeN$(lNl;Q1^^2|=eqz@>JMd#bwEqAbUomzCmZq5l zY0vC{_vCHkJ${ht=Dm-GDYX$B5k#ErAP@fl#Nub3dgB@GaV$1#6~i0fR|;>^yoRW) zxXUWq@T$M=9;BTA0Dq7Ekv?`7r9>oB%#r=`&(eA0j=4hG{am?GAVJJ`kO?2B0C)QI z+GF?))?KPL9>2n=4fdP=0Qs9FwKP(Rj#5K?(iL#YI74;PW;<*bChLaVL&~QJgW?MG zXy1M+sPzz40Q%(d*hH4V9{hCo;p-=@Zr1dqjBX+fb`#j-@%J5f6Z&a*uNz$WTdcIp zmblvNd|lgkSB<#mR_jpaI`hDfBY*A(9&i-NRRl-v{ULnjtKFK7&1;%ud5%MgoGDcb ze^5V8x*JQPY^bFMQWZcPW@92JfKEDOZ#5RJ!Whmnyq7ViyKY1>ir-0uB^|JIP?a22 zAs`cR5fyk+`>LWLaqv>;R{Lr_%|PIe1|x|xGI#@`HMLrgwN*BNNt53m-BW((%5eRu zy7k5OU4UX1y1Nl-Px#b3HFjh3TnA7BSVjK;vfOe0Us)O&lZXx|sw;mhUx>atrE5fJ zRGHOG3Y$yt4T`(xVKwfu~HIGISVmR68h%Elc80 zhpzNXtv>V2H7c-Ti7UC~H!k@j%WbM^2vys?V2qkqOYtQ==q^?jMhpT#GE5A~9IVW= zOkfSP?f0oSJ%-0~Jk~p}#ci(-6_sx0I56Z&tGq6{TQaML|-kgG~Bq{lD zgt=GYrS^|yZ&ro%JNj=`Ra}KqwKoQ)H!BdrLkMi=KI0~}OTRYa%^^e?NMHc`(J+9F zHe(nA9W!_(rnkJp7?GZ2)EVp5n1r%>BgdIrSkax3Ej*H0t@?%>_6j3G(3J!b9Z&18 zH4XNIsoH9~60A+NzzcP|YJxW^mTyybQdU`h zSmFtj8R)}?VOUKTvd%R&TjWIz9Q?BpvvVG}y{U4RyBlUyw$ZivcRCqKj4~NB5qFdU zMPK7+6XjpxEq7Ep#VuNnki<}{Pt2x_Dm_AqN%aW+a{QXf`8xo}YgItSqwgl_yTH9%TVn5*h4 z5qHz4Bzj4bL%`QH?k*^`>ptZhP#GX8QmP36s6L&=ni;s3fzvPgNa|ba9j}vlB+I{0 z6*Irb@vnHH0X-qE^IaZS?5)Qp*+Tx)-sd0E{OYfWdi`2=)NN?A?INN5WGFvjEgxg; z*H`!-Nu^%erPHn$LjIhQ{`j7{joo#*PRqdc1(Q^f9h{jb?lP<5fhoy0m~bJYnxZK$ zu*a`I^VLyN5q@me>Q=hbQlLzhk~5G4N8U_C{RTRlp$Zgk>L6?Zf_M@}@9EVzU>~5N z?$7$Ky|7;saj8~V&4v+OiAs3p zgsoPaCG}Q^VNj})t~V}Jkf0eGzHQrt0>mgiPrcq~?a z#Bwvz@a#vlenXm5>|GzMv+VWDd4+XZnnJJ{!u*$;a!g+E=0{W$>Yv5X&^iZ2MEm@B zu=o$*2lZFBEKbjvnnuY0sN^sN67j|TM{9bEJ!}%I2}+w8m;SU_g1v+y)=}(yUxLh1i(Jf z3>=(*I_LW`OtVy7F=@5zaLt)2eBiZ*8ZI>&8#3fJK##cyKqDh=pp!_wy>5>RD5R)F znJ{3T}*=$(bHwM(fO_gaPH34iwM3z@`lgs0N7VPQ5`u%%KM8RC=jQwXgJ-%(ZJm4f=LrdFk zTx<%G#1j|7GAy->lQX=&oT^Y4pVJIm`$|g1duMY(@uItOvjfI#~ftQ5wz{mnk`h; zE453ZP*b3&e7bc#1k^xSRN7UTtdIi@r9gF(*k!8L=|N}#>OV0cdq4o0^zF_dv7W=D zmVnu`zDZDR><`H}k}@pD>biyjQ4g`D6Nwo$3^NYq&ivt+?{>RWUfWQgMokc{;A z5eXPxO?x=wXxgGvciua%e_|*hU0L3 z%@bf~(Dm!esUZ@4wm;$WoiF~P7WL{<6*lh%l}2S`5}*_@4Gp-ESeX)vM?^dzE$LTv zqlY3gKs$(*fJvOl0CE7pGu3+Md&hH~HMO=;csl~~O-zM~MjxtKkdG9Y!GrPRxQq8; zBnZBSpV2;qsr~ca_rxF;lZ=s^W+pos$G06@Rw%C*0!cAAh>j#4{Exri7vqNhxY~*i zg8kD};M+b9_Gc3cYI@6dGO#r&-J*wjtqC~*3~oJwi2Zj0 zB+pWHB;J(m*^1MovflD@wLs*aK7n%s295l5%y3#w*X0#gg}5c&O{J(Fdb$=qX+Mcq!Kl+k0RuVovEWC3J92RZ?a(J z5Qz~-{(c<)01CFROw~fP>IL+GxGX2q*b0x4SO_=zbh> zN{`~-hu5@%y{!XT-Mo=fl|leDDfUwv(=-}d;X76m`873gkBU`5wBt*z!M6n^69>terlXDILwoJVxlaQ!N>Y^es(2)@n zoTBSKC- z%AGmzkHEed*DS8AZZ!Iv>L47{bx+Iys7MP{SOx@zE(B*Fq*!aWetNUlQ?>mkY+#L~ z;1L8#7(DaQ^GWaKJifXA0IOLZJAbM1N=I8_U+k7G$vl}Aqd!YdxCs14J*|l!ti;^` zAnvHDsFmVRhgO~lWzp+Y{8yX_f}2e!AOc43E!=|uvXw%2ZIA(Jy461z&3jc!Dq|BS zGxXX?69D0Rlj`X;!EwsXO`Y594W+L(jU1aR`4FyeEg(N{j7e$pLya++0^eG|PQaYV zaLF4pC0>cg%a_D=*E-&qwt6*sPfnFJD2T$Hb!7*AHU$3w9gG|ztgrwL+3Q6FxBLoJ zrh!d5J^)@t%6MY!1XIWMsEigjwp-DYc|qI@=uBA2yHn*@+3 z@7R$)+x_ysqpQ73P*|~0KzUFKh>XdI0!gNJWPA0M4K{1SI9F`1u_J&s$(aBKgBhH3 zrtUujw(b#eZ{$`#s%bKN>CxQ0olsJn?J8`P`f!sTAUW#>+V(h}#}|jxeV(-YeCVGI z{9K{!WFjF3+R z<^8(EBHsj#t3>gLTDdZDnjNmeqPR}rUU6GYRE0W?IdnmnjNLF{b0qVw0f zZ;gfhYSu>C=%qcu$xXDtjmp4=Rv~~4yD&l6;(AV@sN2%2zD+V}wq%hRz%X(#Ajkx; z1wkEJRxA2^ZtosYvdK=QI?4Og;sO%((A<;bgwojq9dJHzo*-Q6EGABUzHIddb`gp_-Zy;+oqDFg42DB(I4zPJ9@KDwe&303ys9ZJ zQLFeBYhBc;_jo2$r3#E0KO=5JK_z2!!3IP?5+6;aqxlLhYBE#;7!_20~)Tl#lU!|slJ z{X!P6mSkc}gSEFp%q>8vroxRtj0n!%#zYf??gV}3 zzgGVMwliAYcZ%cKhmyN1ac^HEpK;Qo$942Mm9>ynmt1O0IF8pkZ#@x-B;Y$Nm$4H( z5F)Df0d=N+HJ|XU9^C3l;?p4Z~-v zs%j<&$hM*cVZ0;bC!uxtbOSpXq?Hm*RA*_z<@=JZe83~rz3dV zJH3=ik4ZV(*vLKL0ua~tJAV$X$Twycj8x~CKr0o7)gw`+&!U{me)eX{gmK+<=%7gQ ze;^wqu8JX#QQ~!f4qIvsPRGn@R}|ZSsIXd!#tJD8pc4y~A%@>loyJAqvRza)lA_A+ z0fQI@3l7I@&lnxS>DKZ7^G521@NJcaVS7tyexMCws5O=JZaZ01jxhXkVYqUJB7;tc z(~_|z@-=Ba-CPd+lzi1KtJI*&sa$zh%~y9~TVeTz;k+|c8`KCPK>#w4O1fNCENJeK z8h37jHlElF(Gl2fVhKESy5>6qmpRtid<}h}wv9b?t!?Fr&2IHFF|4_6RB)2ydj|}p zwk0048aU2&86g>x6g5ud4^_8R*J)heT~b=~-kLhFH22af#+ca~PS&V)x|yV1)Q}F) zVv1H7swB*9-R>uGBa9yANWm}!I6tS|Pmq)?;eIzZ&f3;RwH{fuViZilYQdMA?Bw@s zfdXUa3?h;!7YzO)h$Zb_yXtDXZGCKCX%$wpsT9apkP4Cl6*92SOAWrDL1_^Mmqnm% zu4r5Clv6PfV9Anpt1#T6JwynOIyCv!;B`KmcYo(QtA6W@*CWNT+Pb`Mb)^e1A@u5q{44lU2IhNDo$^3OQ!PC_D~6VpafbsfM zKr?93s{|ADor-{Rl=%a1=}et8n%l3 zM%@p3coQ-E02~|wV5Id=c+*4j zyq8nvHq}ULeXMpTo= zIf5JJ2eTMFf=6tE*NHZldOL4Q+}n%B+@EB4`H4Lz9n6*LX%AQ8sbLlPjI8G)Ds&#M zI;swrM}>j~RWt%jZtB?T9!)D7l{MdORbB9EgdvF&%ornR1QXdy4wy9Rl`Bm}~JWl7$vRjRbXVhW-XWEKZ@3?LwGaSYH)1^as+BI2NF zG?AawL6-I^K{Bc{I1)m~OXkDz_54R+V;L6S#`aE)*07p#y{wj}A&n`>pybEK44LTg zHjT98aa0e$P4IF#a)xdyXJf119U`?oFw?!PO0!dXPN0p6yi);*CwT-CcA*YFP@|)l zcNJMsdY>j{#?LayHs_F5nbm#HKWBxs=-PhPP+D?J zWgJdRD;4<+Fps3xn)QG->udKSA`9X_4{8>-U*X#l-kl)3AIsagRVtu@0R^elB{mXT zST;ezuB%CnVChC9umg9if((c&9Ds2m4tf%`o$h=FgBiy*W$r7cqqQm>hCdRure0U; z;l8HY6b9VuA*Bb!eI1EkF5+aMT~Sun(@C#+UgyK&rN-^cRhY2#xbIM}rIe}lzz86y z-JYRQv$nyd>SYiJByN)@=Iz`rG6cs=jh;q&t}l+rqm2doIv5e*F_vV~ zrLqvAS1JfQB0FO0G9=h_1$kU_0976MnXUXd)*77ZcMM#YeXd!&x(iITLr`T=ow7kP zcES_1sF6~}hu zym1(Hm@_L%N;HV!8-1jKuSEJ`R7Cr!tuM!#ewlexnyYMUvQ=piKr%^Mn+Y36Hb*S% zC$U{O!>dN>y7_F|c9kPAZ+hC|a_@-NAaZ>t(W(FSLC< zuDxh6(NvsAIT00TfPj>fj;r%O1l(8E3ouEhpEGd61_si`7C}-@;5d*(bz%H1_dP!NpybXj7E})%DB99m&fb0(`^OWXe=2wXVQdAjDBYxh2RzG?N!+x=eS?>!BqPTG?={!g#!B3*0^t!)jz zO(k;x@MFw8=kZufXbBWVp8OkY>_(~CQ3M=cg0(bzbTN^17Yy0c*iyB_)Mqo1q}{ZOvx$@YdFtMz`?}lYG2d4j1OP+p%JIS_ZQ)bl{Z7)kzNBhi)ObZ^WJTHwZDs@rR$~p9AbN5S zTqSj_(XB{PstA%vCNfCJsL8}I%mUD4brxqf@&bo7+d9r&Lzs5F!lmBL$hKBR8PlC| z+)t@>vW*@>tZ+98rrAc@<*@7hg0Bd(;;#ni_S9%xR&!SF@5owq)ZtMJ>{Ged)>UPj za~J!D?n=1wGt45t`?OOyb@}VM8eAg z*isab3w4FH!KUOKvcw4W5ioPW{a68#XQ|AMHRDa@A+o0Cc!hV3A3=N&qDRNCU2a5b zQb@B6+csYJGKubaf;iv^+A20GD!ihkQ1R!A?R5)5r`I}(dS!{LO-h=>%%%kW7{&% z65dzL*fxDp=5ieahFwKqfCWfVM0w!&2EzX3yg{fsv8>9~DIL_yu|?Q72Ha@D+{b#6 zP)Sf>i$%YQ+C>U%cCO$UdWc=kBmy8A#KH97Pe_NC8%JZ< zMTk_uezA##HOX*Qw;q~u3HMwwU-uFbI3iqq$B)0`%Jt`mwKlrEspeA!8JL1W`bJN% z5$)GkUummvYNm}s2mnAh`p4Y;`giO+g30k({hp0A7vGCiNxe4;Dler$JFvZZ;dvxa z$$9?(YV-a4KS#t>MOyZ#1k+YBLH3dTdG_iXcz%heO0hU{2k+1H>ZX57Z#Ihs{ZO}_ z33r>>)L_}>aeeNsmTa{aOo!yW`!5$Nims1j>Z93INYm_z^3Sr=YdYI%EOAgSQ#-Wmc-DhNEW?KD{gGo+PK`i)-8{!nd&YU^yROn0CiX zr|GK9?1Mwn!izQqB!BUi9Dq^UMus4ReO2NG` zNIai&ob`0v(n>0o7;ea!JpCuP)22?ylTKthpB$X+P387ik~<&wrkYM-S2W1D;~?^y za&8~f4^`z66qAqn`3J++V@+ihh-RqKxOP~QC+m;b9T3%PwfeTeRZ)IZ-1a};u2KI0 zS}!kr?eX6ZqiGE-%|_>-$1Yfd>Fy$nSb<+7kj)e#L9IQi56 z00(?AR<4@bjde5TFwX#m9Cw4mr5`9Y`;Pi2^Zp365Hey7IjXK}={{W%oE*kn>h1;bHl+?+= zF&l(!B$*;UX~(fWbEVx|l~Yo`b%IFD4kkVL0uFzxsjV{oDWmT4405x`7PN+EHMs6t z)MZ-s!UTElwuC@z^_4B3?3@62Uu&@SU+eAjoxUgh3$oW)Xy4Lgbds>c6U<72LFBGi zf;u->!kSI$`JQoA1M-6a#z7eo-#PjYtQt<>)R5>UXIQ6_K04W7zRYIWv#PoDe)$=b z`hbNxHH%`&5;#hw9pN?!dFnum*m+OHzwpoEW>3R98;TPki6Kh}CRQB`XL6mui1kKm zJzv80Y-=jm)ee&-GY4#Pq=3NS!5pXuo|SdUygl35q1|o#R)&S=Cgd4ZsqMb*Jl&k9 zWs%3Jvvb+B5<1cK=!}XQDmbO$cq_*GE}Ke@pH10-N?Sttg;h{ZT5_xO8BzJp z-B2!3H2n5stV1F8KBT097}&y{C*?e)BR=IYVB?Ed}`$ z_Y||-aV3;l@{Ok}jwE*&1eo!CI`xu-NCrKNUHDJMdY+9-PP?Bzs)7YwqN2SZ0A@to zwNctxlmN>pWH2zzru;qCuI--e(*l~6lE-Sn`GlN;2g)IfW9kbrt^WW|Sh-cMCKpxt z)41fD`FQpnO@&=CX?L|O!8*&Vp;tsA1$2I@)AtS;L5wIu3p9{~Z2LckyC${uX`P{= zRQkcdQ~9dQk_YA;ppKk8HSndD<8G!=f`WE{L<|tl>;o#s0Dw#Ll3xazzq6I>&`6Y?g|i4jo`<%{A8H7UJL zNLl(Fqy2IA&u*q@)Y6ctO-^Ki$tD=)N5Ad$_q=Z%zfS)E4EMfGruH5|ttL`j$*qnv zF^KaVi5oC=#{?T$ezij}Ra0+<$&qkNp`mb!m15Re(1DVy%$JJEtsvUG;h5s zOXC#_@e`H>$_O9J0M#^>of;qpD<8BIj$v>B#K;pJCp9IgTH>jdnHfFiIqq^!FeK+4 zS9Oi{3x#S=CM~ovVmjkfV|lhkkKi^IGh{l=jdUl%F-?+@$Ud#vMrfi=33fJq=)Jm+ zIecfc{AY=+v=uJYRey^ccM^FrM5q8kkIHcdI-tCB;yM-e8Z@d?4*(E3873nWfHxm= z%!wUoH2(mTHhY2tn2u|UT+5_m_V~Z$aWRp#iu*zX+-(^kn8ObftrE8BGL3!sUr7ME zly{AMBDyU>UrBVUTBBpaE(maLxd!nlK;Sm&p z&_G##4^rahG1Nxq% z-WdL+zGe9Nmf<+|2Wt~IjdJ^MIgC$&54n<}gM!dL`KZWOfRK(lqr9|4LYjJpg8~6O84)UXMoeQJ zT7QkRDf9mT607576d{l|6CSROb0S)@5x>YE_PFFRXdG9S=8?50NyG(1H z6|AppykS=U+NQwO-)u>5EAqUM7i;7wUBhe{5~HIOXxh`#n%iuxB?~P8Z!>`$z#EHT z6C*HstM4T?zJS>!14aeyZF#)XPrk|^&RZBbm6UhYrka=yi5svTUt$!7l}({_qE^X7 zhv!oKEbwoL^sU|?G|NHTPKz$btxeZ+G8P~$R1pZ!u2qycka|@b4JX0b+OSt8yuVu2RsJUGb1eXEU_b}h=6c6fmA7h^&Ix1z zg2XtSWC)N6$UA`SF&ozOmV>d`zBga$tm9>AD(rI)iBoA3TdhaBtDOm@X|@(5mW)*< zbq5k!C#Z$B`zazK)f%sirpE4#;w{46GgN6)Ql96M`)X5Vl~O$@eRR!8K9EmRt^AXD z=h9|FwM2*xtbh?R3H1XYKWj1ewy(Hsk5YOT%9O7(7y zC8tub!sTR67-!YY1~`bHqsisJmT+;M39a{y9W_X1_>2>eDvii%A~O;t3t<__A_v{J zJ*=Sv#7ZP$fU3Nxs1FTzCYOmWt^7OcT4XZ2ucYlpldzEt%%p}`+yN&L4_fXo8l}xD z>N7~NBbX$5OdQ0IN#OJJ>WgFJneI>S$?j)hvv2Ir_W+SVZoex6vvt97AAJ$kKx`MQ zZSZ5jr`!8q`T5j!HElZ5EhsHPN}r{60UKA+B%G6slm49yw9>1p1f;6b$t-4h>?6NP zWNVwu3HtZ(?4D&s`%_X|vC*PxMP%sYV%wsmik`skeO(?16-gBlQNlwb+;^~E}}+XswUPvNm0#QMnu%4xY~3Kn%+Yo|d@ne+jd4K2g~pkYY<@I8o;;#v`lX^vWF`{yss zwhc_#rV~9yc&_yJm%LP%+;yQ_`)!9vH(x?=H zSO*KUcxFOW0BXqIXUg1=r*UJ}fp=|jY4}=Hl9^d$WIO4eDsMx#;P9Neb*{Go=T3`4*I`tP& ztK<@J>ibGCfg}ZSwMYc;1Q{{J9}jAdDvL%?4q%LdJbGZxdyJo?0y*&9v^SnJ=X?GA zL$xinwN!g|F+|59Sx9Qts>u++=?%<|hOWkGfRXfP?d|!BiW>3C^xuc?Q&3xLy41&- z$SMZf0Nm0xp(7;0aSNnc2rEe2v>l>`%>_#~c{{cD=m~)SRkEPBeqmxm5(aY{Km>s?^B!hNjoC29evzAx4$;0);rmxLw#=w8 zMsXRFu5Jq!a?ooe6v7vhL+Zoh77O6gq8bR2BcvYGR8>nu!LTSug&;y9L0Db`(!U#Yl!=L{P?CS^AfLGdzkZx( zGA+F}*&qo3cf`Q`BoC+8u3c)k4sEbu(#^NUu57IAE$TBFGF@aokfTDBd0JEc?24ABu3yfo~sL`3qb4}JkL?b zw+GyiS_iPi4w(#_$9#iZ_^Agv#X*3VFC)hX2`s;a9-%3%OhroOH97_ynb0J|8Dl|RFhtuud2 z#WsIZ@Nfwnz=#0wIRoY-m7_y=xxRJ%1AAx1-y`8|yL-EOZG848hY7acXKQ3GvHLTv z%0Eolia$^<6ov{qgNjN#a*29BjaON&_Lq8dTX`VV-&L1-4Z~|9ATPYi?Fhl7ZJ8og z^wCD*?P$=a4h}ufasePl2I6J_fti72JI@Bzns>k)!#1VOF#N+~;m{n#>N6~$7g?FwcY<`_$Lt)}GIRvA-PPo20^62)|R)qwYtP0LbowV2Tg@zm4 zg4HUsoD6iwbFFy=?5!bbq^ARMW0KNDfJ6#lK>`|NkQLk)XTRhRj#Qe9$VYc()W@l# zoSfo*JCR1Ha;BOy@#RT+@a)<4I`~Mli1E%tbrfEB0852LSD>{m_4?Nq1yP($AXGVG zML`tyoum;-wxQZa&{*fBgJX7=2CB)KB2T#7!BnnJ=73s6!4eNp`aI|Uk;;Xg_{F7l z_BDjhDL6g2LX|Da5hu%jD=s+Ati?efms~85){88N4T87{!m6Yj+ZC#6CZ~G!Yg1EE zS%4#86*h*ZqiJe&H<3+Qr^^AMg7xhxb({({3`_{j92tU4i3~omFaVygaa_w&Ug}Hl z9U<&!)m~1uWi|Xx$*Pu|jfXhHlAlVzxKS6LSJAek3#=lWYT_4jZGjbqS3#j`UcZR- z8+SH!0&YM_H82#_dRvNx%#?3SM&hB#>qRgqRdybgaseU^+%YGKnSqZ^NhSwI&lR!B zzE|UI%iNiit!fw+QB(W8sISIu8}?%Cuc$Nc{3LIojE3F>As3o`IO>8Q5WGiaPejxj z+e<-OmDML(BxC(hjR+F%&c4N_+SLsuO`vJhP*3~p5rQ}ez}6lqu&}tl zt5Tho)=@|lXKC{{aub6FRE^RRz$I8@4fdk%apzk$&~cmyP>KnWi5Y={MDf?Q7NW`Ni*@5+7Q*Q6fL5o{jZLS#Pued&-FhpWccH#+~4v>!?eE!a^w*hB4 z4HeaHwXKzGZ`8EON{?LBh8an$#(0&aFzm}tBy%L`?oPjFSDx7L@50Jj4Uw_7ZR}M^ zZV4&7X?2nTAeAgWVl$QM@c0_S-r}>#leTjrGC>~MIC%5{-Zu(;(I^BNt(wW z+plhBBxSh7`uP)~yv(Zbi|%p83{6o9Q9o}5WDu3L6;g1NkrCVB-M5u`WDr0jk%=G= zc;KI~#yaSq7vK51ZDnEzam36-8G|0u(+4rnT=Les_SBhcMpGp$^9k)nbbAVt1F}`7 z`TG)&ciK)r{pz1@om)}WoC$zrNgR81%Qp0!jn%%KahIqf7A(f}}82zGWuEO>Ak@+p>jTARK6{t12T&$=u$UnG>HlWa{k*S&WLQ!fX zoq79mqxV$#&K?lFacg!M&z8!o_c4#s2>L{I(Y`IySMlhyN2G}{pV#$~{m)eMzcvOP zviIh8dcSVcV)c0}kEw@SHn8Et$O(wV%Ptj}aSg;51X@VWk}0e{I<=~BmV5i1kG>w!Kb>L24e!Kk%nf<+~f{5BvlIWVVlji3@Z z!R%LUi%BCLy1+5$6cMW}o)@LmZ$+OF%qsiN+`2fgMF+-8qu%3SF0VhOtgn zBP!aYZKJDm=-&nu6iPUEZ@+ROR?$&V5J-4bUcj&XQ)t&MYfZP-O>{ge@;RPFXphO}P^HN)HLRBE-jvPK9(?mOjzuFya-S%3y)HhGZ(($alR zPzcH7m^mg$Aa@54AfB5{qslA}!E^ilLyT7)^hqm8kJHJsDRr$1IEM4FB$@-R8G}fz zyhtM0y5bioN%E8MZ^3)VT2@-!Z~3Yjm?Tv!N2D@>Rbb(i5?FvlM^4eR7HIdy&hGmqHHg;w1|)aHW6S00316OAFS1hL#C74@pG zKW@rgaGn1E@TcJRo#DF^aLG3=3pAQp&$ zG8J5ca z?*ZA|)TGrJiKfYn@tBDHKV#Lk;#>Mu$|Qdg8!|n){W{ip2d?h&+yyZF651qc`LOLF zSU!!DPDqpV4>cVn81kghqmB;?$_n$!e_t}zDb!G_Zo_Gi-HG&&B>g_U6Va*ua-tyL6#+ma6c~VtRvZ2j!-GOHiC04lLzR`=yZTidm{{YQ8tAE%cFWZ%0 zoe7|5>e@}conROWRKfb4tNy)ITK1?ZUR0>244Fvt*EasetcANC(^ zy)qqo))AHBIeyvVix9^tTew?S-1ZGLrMMFwpo!I0FewfnH`EeSDJcDU0xOHqJsNIikxyT0)Jn1{S^2EUbSBi)uUG-syh#DxKaBR{H5rQV{F|6j7UA3uccDbh&_?y z?nimaP*bPzLW)4rBaVM)q1h9aPw6-%X{~Egy^6!G<&wnaJ%Auj8Hx1Co|fp=N>#{p zAf5zZlkN$a&(|ZU=jqv?56W*M@I4m>PFV^zMLqcOoW?OmG7Q3FVA&t08!x&M;fWxp zd9RyIG1!caP&g{*#X9q8)OXuKC4dw2XMn0FaUgLR?mz_e`{Df#o&DQVsW5;R0s;se zl6W5cgN2D8b<+-@{V04x!Zx09i$R-7n^Ws@OO4O8a)(0q9@S{2!xYs`n_|vGlfFuf ztIsyE+I2-4jA}e8CatL7T-IB6sSH6SMnWm!t2Buu{ItXZGdonbR-TWhSlZL`=uwno z3nwnZ2?((Yi#cqOfKKBA?xD=ly8BLUoRe~Ee3Mc5e}Y1fCoR{(VvX5l)~3L%eP&&1 zKh14(bQV0gRC^g)#DM_G#F>?oi)B@qmsF3h-TejBG!p{ZGRN|1|>;iM2=JGl~g9D#rd zWi4;Ttd!D)q28#{N#?7}`ibNNj!psYaY;T!Z9RwOCUfOpQJ+^(Qsubj0}B(6L65~4 zl(>X8Vm~!0Dx(UorW^)p*n|Ptl*yOgGB+eTWY{ed)|j?I0Ta2Luq5R2c$3L9lg~&s zZYo~Y{8e98_n&W+h(Bx+2N44tbf9Jz*kxYI!82^d?6$cq^)(cV%Q^`SjJP)~Rt#wG zC^|pR%0CescmYJwwQ)eZ3L>drP+F>jcBto{w`0!-KlbSLjWbNR3B2Y6#DYPI&tiV@ z)x%(3YHv*9mj%+3w!W$GmWH1NfH&8-6;@L6yK1S?jpv=KXc!k8(3P<*k%#su1Whvq-JGN zIZ|>TDKMuTl=U#td)jqdFU32F35lvAa`(jzP3(1=+P4TTkCz5x@? zAgNJ3Q$8=zwD+u8j8<68n1~Pteqqdl7BMm-tL^N^n%1bYDRZvDy`T(ksC$Z*~5G6?hloe~k1m9^TscZp9n%USki$R0I{<9)(HE zF%r^11vxBZto%QrTp=%T{(}GjXK=}qV8lu0PDDmeNY9*J4`sR^$qZ}8owL2HU{B1l zi#(!@BVxz&Tq{TsY~ng1D(mFhEO!&KFJ?cKxE9Oh>t(6mXml>_+e-)VG^x`rYLVvC zCRjsH@b`Me1GKX$4co^{iEh@FlG%)qPDJCnxW;GYk9EulJyxb|;ucMct}Sh_w#_3o zQtg%mM=cwcGTMe9uPVC{MBI*L-5eH>l{&ab$}ijHlc0QRv%K@D>9%ZL6LAT%X=&Ss zkgf!6W*}q*$j?A6?pE>EjY@>~6WC;*sF{(B$tUY;zBfbg{{SV$D)7vEcn|ii5%W|0M(!$TBiyK>M06*SzfUTIWWEXYeEfBQg~`A`r&$?1!x*O+ce&L+XkS{mdWu!i zWUvmzD=Y#akQ*xngim48-7P>;(kiP+*$PP;cM#;MCngBm2;cz#^#{g$tI=B1##}zv zSK)K^9^##68lu=vTT!CeMRC$Vkl7e3k=}I?wp$@-TSIMqi}&RUYkvrCHC?D@at*u9db!U1dt@ui0Z#g^QwSEsEDY182oS{76; zg=ex>6smbntg7q?l&B=CjG@e-gMbMoW29WQ&*7>mq^!%h82qyMi3_;%EA$wipj7&1 zZsN(YOd8)Rq`>L*{ak9b3n^-j*};BuVH4Q{#{@QU($=S_Eh_&2{lpjY6a_!zW`Y(-Bu{QY0Ct|Mk6$u5W&ZEQ zEfy3gLw55p+;rKtuX7i1;gFTm<2dp*ZGBJzC>auocIcmBM7#V+cKUt2mEDEt7PRE zu4Slko1DM9GHkw{6ER~%c-U|FBep1ljR2q`arXZHKKLiY8m_UW(Y&&~bfb{6%*;Sz z>SA(OnI?J%sQ9z+wM{0Yxw$b40X%>Lkpt$)}}&@sH+A zD~)Q69YKmjxRpnov`GTaXV8R~9gz{|8**B>29eYoB>ID4O_gyJRDgUx(sl3fD!O*J zds4OSYJ!)UMS-ZK9gnu6sY+pL0_z}(NWp4BkR|HX?Q3178fYn~0N`NaK>+ehMmdQF z4?!5V*k-WAY4(*1dFFuL86`xu$L0MaGO-)XerP;0XVx5cN=0j=Z6ra4KE;pNkjQ@_ z`EuN8S9iBU+T^WUGJ+nx8! zf!(shXu^yrRgME?R0cRCmd{PTht{GotLaLFO-jhFHY-!2#Wslqt1W6p_L2+H4FXIP z)AX%5D_qlLk1QF%oznoXrciDZ40vEZ>jmHG<*2eupIzYhc^(%U`r^Lsaz90O;oG}i z5#V8wix`{eF9VJfrjGvr1B`YN?yVta~W!fRtyt$)RoeOm@xbUPBKm#K=AQ^0t83O=yuH2f7Y-aPvO6m+x zed{k6b;Nmhkn1mUTC2&CE~UFFQ9m%j#s)ja3h!1)4d51gk`kAHlQf@-J`=R2Zz^3Y z*3?-+{u`)aOeG)@LYYAb3rI#M1|dYb4wUOuLZz^AF|_u8f+R%!2nUhW-^bgHS>r7p zQL;RZo#v)5tMV9Qjbphcr^shft_u6gMIs}sE^@gsr@e(C=r6QLib{#wxplRCHBek! zik3Bz-2-`}YVI%T*u&+)wt#_&|O0;TKMWsw+dUh36R-LMw3zH>D?tWgS-}swNqfU@&X02L`&_fk&53Pjo zCLoVckr*XO7LakgbM%GKc;3X!vFtYqyTzd7T-T(tEn0K8(qSeWn#;(7ZS z>Z`Dwa|=g#4Ul;~K_^)3-yI#N%IT#_!k%^oO{JVnYHX*WKLT(h%85vk**92uw**Yv zIPSdKr&Ldlei#?N8KYxCy?%Y96D8Mu%`w=)!C@eQ6CiY~^c7TAp$@FXKpRFwNI#ii z12dT5nd-&r^ybFc6jq6wS72MD?)B3XF~{}`4ar!Qzf8-pou1bqW^6jZ6VcjiTt?Nm zx|eY2OZdydlq_D_^G4}7bc}R@GHjcxlOf@5O{v7> zAWnUMh*9!&w;TrvdJjz3AN&@L{p(XNPs^17;i@?SYQH1_C515n)b0RSi$6*lr^LFoJwpEg@YPjanuDs-MP*cQL29)@ zP*I*q#Esy`TP`fCwL#^QLl^JbUpuq>23-+IO4`=Os8!6q}DZG}6_>%+`dOi6Ww-GAe9=@Lq{@#n zpQ)B8l?W&Q0LUUj?NieBrE+|;O$=0$2=-7!fry?7$s!<_o~QmaYy95`nD!w}luF8N zZDY*5eaynfJ94n3if=4&YOIx9DF)d#jgUfC(ur0@0-B#* z;H8Oi00HVK(YT*W0zE=CYnj_n0JSri_Kwkm0Fe>~dRBa^%c!$_J5_kOpzA28tlu{B zTbQ`Z%O#9awIe6nDJ8)=-*ZVI*>xsWPzeKuvo zafKpYSB|O5sw%4E@XnU{O?6nyRB}Q0+6E8rKX0(>puBxw_zO)GECvP#*biy{0B5Qb z#xh%6Uo^w6s7#t_Q;o<6TWJ+tR}4v0sw%3Y5)gIc`bGPHOY^7=V@@i-BpLqze^J}* zp1Dri(7QDdVh95y`bIMYxD%dww?EVB(mPK;4G-|7#RX2 zhzk3Wz|?)8Ig7)3Wg8$Y@BK7OZ+SQ#W0AC(4axh&k;hjj#6J?#wX&;t?Xj9wOp%24f`f!Bl@-(pTGBPTT7~UqpixYPB%HC{D)9gY?Bq*)ySC&EEG(+AQ(7QQKm%~#2$FO8 zWCWeiXQlqo=B_1K-DFo)@5a7@@~VWG;!_P06h;lA_eO3wIFJ3D z>>@pGZDiM~m46Xz1w!A;1|tdtWcskiSc8KT3pcc0)fU8304aj(ggnH=laBHrOJJN1 zznIDHU}E%GMRq%5OPSt!Dq_vD7Thnakr~ImuXIJ>)OodOM3Fj?GONI70PT0>Tc|xT{19S6)a2NzBh;FiFOEA8w{uMKxvZHZK!o z(!G6GTF6JpD{m^*>q)M;6;-xEDT=t!Bk0$#!+{mx2)OFM6Z9KxL(i^sx|=Gq4=AIM zt1ktlVTQpAB4P}7=+agcm0qyI2q59I33m+X z%ItEtB*&q~wQk+gX-#1%FHSveEOn4*i0Gt%Yq9;+I|JYc!@Il9LZ+*zRA)*fXcYmE zG@aX&9Kz&-F)+Xaad-Fz@~t;FHxTNus6hlk0!)FE$jId6k|(MT^9RL!&*49mjA?z* zE}J4b*DU_skXIp$44yJ{GA4VkU@;Ql+AdYKU;L3#SFbg@Cres`{HNal&zo^h zpkhHIC+;wQ-`hNO-sguFRXY<-WH4ho%&09Ii(a0o^sOi=v?$wS_eA@NqJR8cr#*OD zbHMks?=9-l2j${10x&Q$_4@ShuUea1iggI*C+cT8Khvl-)5hyH?gMF43g}~J_bxj< znCwm>=^d6;#C6X90Ea4qM2Xw~02EKREAc~DL8sAVW{S@w3HB2{+)pv>)2@^r_P3a+ zG}Z)=GD+ZlvDX9G;XDD+yxvf@rYVFVS`y$DYEFjFTcpFme+rFo#GHQ#} z#AT9C%d#&`d^@jEw0n1{GRh)yU`R7D8HkDZ#yX^YX=6>bTC~c_tbMWsj%V-3u*mCY zw=8S1T}rs@NR+j+<*;<+A&~9wM-4^O?7W)0)E*@y$Oo*8Kk z5k$HBe`<-}zXD>PhgQ8&3$%}}2`%jz?bi}~Wh(mf(^DkDp3=bJeJA>Tx}dB+k23QM z$cX28A=Vzane}#ZT5VOjxDARTmkNr4AP9|uFWFT^Kj)P>b6vG7r9tUtFg}7Zc+7iG z?K99ZMJ#PSBaduk{^$Py1L@VG!|^+7dGok6FND4yU^AB&gz<;e5tDG|xCDUow+VjZ z4nOh{$}wMSib{w})K({td|hc{Y`S%bE3OPIu=dPqYdGOm>cn23Q{XhH*&1sW+{@3;XT6s@Bv}!iErEGn!Q&+q8 z7F<8bMmtU+ih`?!>=h{WWkXt(b$anu^~a=gwA7rPyzTm!HCO=wVMVQHN`p}qRbtT$ z0V8!r98PlC%u3Tze=+qmFs5PJk3nD?A6jdQEaT5?gFo28}{{SKhlTwvdtK~TYs{jsR zX;bHF=aM9uJag(SdZe$`>&eVkn)}AD(aTxv`FVX#11d&$K_#5nz*4&+HQf2m1 zH$)zoPJRCX1DGw5DKwxjo*B_AiaS~bTZ1p&IA$m800aD>a0u$G@s7B)3)ZF~6Vik2 z=|P{bKIUh?T={Dk#`k1n`3`>2jox84R^7@Yk#z_-<#0OvTq95E8gNDadcU4H;j?mc> zTRJ?eX0btd~|76FqGDlQ=~Ei zoOj09{{UaVR)6Cb9YLz{oI3!yipAYcP^>EJn>fI->6lq0VqVeZ8!;E0X;gR@1pfe} z?Z?WK#L8jwfKTi7j`7p~0ER28I3+~K?H}5DzEJRs#a}5ra@P94aAVnnZn+rUpv<_F z7WuR#KgPa8%n>-xSAQt(ata@G1R)bZmhLGTQxo1XKS2@G6=0>ura*}kJZC-n(Rpq9 zWqEbym+DD^Q|3>>#5@|H#4);DYb1j`vU0Z`ZH5u*=rDVesc$Lpa81(yXh2(aNkyjH zCUU^qrL6%N=i9d9^^5_;fztcZrne1uRLJLPIVMl1{+Y=<$GPf}_U`S&^B*~UhsJc@ zjXH`gGkF!J8;4~za-D?HV-aV(iu|UzIPbKPm_-SF5kl_cxOA^dspbt)GZ7mcaa z6c(oTp$gzs2(-~@HXTWCnx5minm`6-ht=(CUEjM#Sj?CJC_gva1WaNudFj{jAIN;K z6vk&`c-Ad8X1T)NtE|SdRRpoVUQYOoQ7yw!jmKdU5qTrFvRo+$5u+ONK>j73!^bOm{}O@ zBZ1s;)Z29CUKr;dA<%1_&}CNT7EHS1Nn0g|#YHKEByQNj{{Z*4o%*37F9Ls`Q6*GC z_-&xy*y{ClDjs3Gro;kd)2OUL6j~(Y10i6BP(eM$Uu$-0W|p)NmRZ7xDnKKCOc59v zEe2wE=l5gE!Zfx`gXHlsta27_ila@mGOwbecCwj99gQ*Aam2o%sR-gcMua2(0Cax+ zcuv*uy&L^{(&EykRyOxDJ88V4w&ipc9F2`mHUL3CDa7SM!93Pms)1G`0CI6NCVPTR zOmI7O^v~)KyK^edgRJ*%*a=wNm{yNQk%`qr85s?Of(*A2$*UZQYyE2Aat)y(2%wOv z@}>1Zff`LFw$wC>PvWggWrb#Frm8aG1FY2rRs%6vEJ~h;y*eSQSzfWKs!5Q2F2u%6 zPSQSJ0>%L8z{>vsOb;bCH;$D4N9;?_8#ETMMInP=F7SbP?53XiP~( z5J42Wsw(_c@b|>+Cr-DoduQidTfJ{pTCGeMWH92202!8;+}p4ukcF^1DSvC^(OZj$ zT5^3L9GUrN2QeIxftV(Ga5Ppe=M4Qxd1IJ2iq1+)TAG*fjF&Nv{LFq7cwkE{yFe)f z+ixR;O|dOWq(=V$7X^6~id@=1fFvaDDTTcHOTTgF zmq3wMj(!EV)>_7bX|(FI+kyZ=B`M-qlG6l&BWWN7AjI?l+gx4Qz0JwN?te6x1OPik z6UJvf3okrnhqq^*dvzaOoVloqg(D+aPbjC`hgo&LP|tSa-){IB|uz?y9U#&{zOAb~5v5eJ-@=??NkHo@@y zNq}gafxr5M#w)WWW5p<5ah7iJSgn!7N9-C8dv7+A&4EB|c=~4tq7Wc0+wiwRxVZ5p z&xowf%6AsaR01KEyRa1^k!`zNQV!m^nt<;h?(1fWM%?O+bXI7MtR{0L$R`-Vow)U#lU;6^rq1l~8{OJ}MNb0ut5v?CN- z`t!wf>sZ&UprQiwSg?qyAx!QtRd+1#27N>W)57W1Y2DBYgbKscBpt^f1BnL$0RZHC z9gQ1c-(1d!bFG%DVUE5#bOvYDF=jf38hAa z$Au@U>9!T>-Kx-1wVeo+QMd$YoxqLz-Ps9^tLZZxHdpYqv-)Z*6Hva;LEFsWtj>8* z2;-qnvC4K<CA#JQA^+{9zTaxF$@Uc;`(ZX;lw7Bsc@0fT^x?05^6 zAX8pt@yCX*blZA$^yXHpZmCK9*#fP*5CATuMNoDsxMR3s;1LS7tdg#;TE_X*8q2qE z+D75DiHPsCa5BbZiRyK&v9HtL{J(PBQ*2D*P0iCTz;7RWVBWaOJj{76{abL~fCR71 zktzEIP8+e$*w>{SP+sVZT3z>w0@`T)C$LJbsH6FYh%4pQg<@(YUz8#(J&YO^gKn1E zO5L4J3C+cgL~20rTMa4{Ob^VbBn3X4&pl7E-DRP(oO!%oUF9XVb3NA<(+OBc>7?0lQc=_wg+ z9=jFoe+`z@{r=hN&c&|?0p65-c*Gi>8 zh3V5IWlU{g%F??|IW0AGJ8dr5)C^j#>0abcFfl3!p2VEwgVIUkw%pD2&c~_TIq!nu zMetK)?qE%I~WpYw%e>Ec{5ru?;zw#P;Gj?N{penL?g*vE5NkTsZ{(?i$yE7 z6eS9Z2~yP+4qz&&IaMZ6AecT<;Q_c?P%1o0EhJ7%92ZKpzQ0bOkzaioBv(~Xw~4$L{yR#x zu}R9+v{mwH%IyrFkPs*MfJp*DU^j3hR;5nP;a2A1+MPl|z}&2$D+51a0zeS6x0BOh z<#q*zY+oEJvELZu<=FPIp@8Jd8cY^iw=wF74m8q~Cfx@S=v*sP9c;K#jQT2|kJ&Tu zCYeiBv7tt|6~YjzOXv8?F_`5@!)*rj@Xx!X&KAajMM%!Fe&)Y|0$PCacH zImr6eK0)}a;(Oh1Of~ddaQ1?q;vTaSqsm!&bkGQrrCa8bMlwpCw|PojP^f`OG2FKA z=E*oSIL~}XR(X4l-Dg>qua4P9ORqDHW3rrv)=^F)>w5#fPg@My#g!IJcbgYQ0pp6x zgsvl!k+T7P;`x_@JX+N0QF5wUu^XfaD<7FiBXVLGdT~@kuZ7b4cq=Iv6kxEZyU3%lbuVfs($5E^_QDsta%+RKu1~h`(Y9 zG73u|-?6Cgve0{hxULGT%{-&=x53wTH7ynEZmHx_r%h@(4D|{jQq^!5&H24p64)!& zXe-}omll*rQfe@c2c!XvlY(T8pn#wPd!n1q2)K5HtnJvy<;r>Q&8!xTyC8gHD-^(To!%l}KO<5}<%PDPa;CpCp>XGJ1=gFJSImqgQ3{?3bYSbp(mz1y7Wvo~Ny8w=C8gaBEZL1*c5;g-I{E zs+xdpN5LpIs}EQd{QjIzVd8?q6?ZK-h^SG%}wxZxlph>e;7562O%UftW9tI9=c%BfY7 z>Ph1g$m|9oRBnPuEILWJ(iN*xrk<4mk%w1c5SAnWB{KlD5fNbKa zaKypOY$Nh3mYC>uVNIffoUtWH;z%Df2$96`80tNO-)2-*`6gdJeJNgMsO-|aipp81 zsl_FJGIs1-x9xmMSMvusUi^>VAC0dl>UYYjge|Dq<)1*1Fv5E@1{s2;L%Obn6s>vLmnlk>dZWanDQ?VGWBOs9UVC4E{Uf7}O!I+%Tdc~AUL`u_ma z7MZA5qhmxUkje(wDp!n0W1QpMb<-XPv!PQ>wyeIGRXF-{Kd<|U>HYmoku!=dcd)3Q zMrmYXcy(ac69%p$B^Jrv5PsaWhZwr@tM>x_kdv4n4(`Q!C8IzePnb?ShE*~4kZ~UW z08Xth7uz_ZDpWAryBy@tC+$Ces4}{xikNfc*+g`r;@0Uo?^9fx6%zoxW(GfWM&9ZQ zi~TFZ_e4ch>D@NvZtNAusfQr<_x+B3=RI>?r*Gt5H69Xo0uE;$l0ArmbMN}x=jl1F zwiT4jJ9b9MX)#<3?AxWfw2{ZB9U_R}Gde;d5(HMAH0)}L(Zpw-M3oYb_{V$rm0dQH zZm2eu`uc?a!zL#Hp50vE3N+-Pjd(JqWq&b&i1+&UjE=0!dgqbuw)F;}*0ST^HQ0C5 zSmMsV79dK1&4qJ}IF80>Nc$rwr|eWC9^&6WWaE?mC+h~nkfy3?QzUOZZe?IrPXv>; z0Y3OJ4^>yjFBKcTPw+I@ZKe#tF}a{W9ih7c+{S02wEQa?sKk!uz9!Sxn*HeWAXr`6 zO=fb*j`JYdIc&pXjrI38%DB=fBE1!^s-?#+N&IEJMid8Zo&I-2^3f^T3sZpypr9lU2EDr#qDa`I-WD-mso9}I@ zQA(9)s?_vtf>>^Y8RUWq#6W;Z9D=`WsnvUO1r-+6uEH%gHGN``=Cp$)+d1X*5#tRV zggI#2wh)n*BeagHwet-B1Dd)53v5Zi?Cs45@tgf609=%yPEiH zSjv*gDi-bfsra z8Fu=3GvDvqo{?YFc4c;5Q?(=Kv=!M5V3$VCEu@ycg96FxDDc{S4Og>H2h^IXC;P-n zIaEYXjGC=xTUvsslvHCsV1Mz|i=^xq2~v@XB3I}*{{ZK=SL5TB9QF&07B_~_Gfc`^ zxgJw(wcTN~goKSU=iGfs-AN0uDj_F7epBUDqG>B-Ps_GQCIRk$e__*A{qkJ_QsKB5 z{{Z8y#^1$hC+zAhg6lV?sf+4x9IlZfIUJL86bZB*Rm9`5BB3dLkhoRlI9u_al$9@O zTvVtO0UJzaW=Fr@pQlZ}6V%GsJqmQmGtPTw?fnPWu2k@U8{%%S{-KX5yll^8H~SvL zrn#yq?Wnj_a~Q`f?Cb0!r}Tu&u?0|gL{N3m{)v8Do)!$Y)^uw8{-6l^Jbyv`BfnMW zif+=K?OUW@PSh}cj@4oQqwAUKsPbH%7R~ZA$n9%uV;JeRw1;R=nPGi%Y}RY>oml-$ zL80o&D5()A1gZC5zsFA-QK?{Q+7Uaq6Z$V7u20k3p_)x(y1IJtG}Npa_dVmkU+EvK zAX?OGT~`vl`EX^$qOLm!TxeTaXw+d>8+)FAG)@%0>ZnV~DyPcAf>uft7MG-j1fOsQ zLHiHtNovJ1Xbt%0M#OW{{Z8-z7<{heiERK!7M)G zaqfN3_Un@VDB7h@6x65(gu2)xcx9_P)V4_R8=Z^liZ=((J63V$$Zjn$}`Yu!RUm*0HJHR3A-z zWCuxPkKeE_SV1@pHWw=W6<5rNr6KoD{OqCj20*got@0CeiLMe-WAO0?+G z6SW4>yWGr{V-cUQfjvs~&LyGuKH$%M9@KWlhW?p8JN-^szB7m95H8cnqAIyC>?ET0 zb}J_p@Z+Ann38GAM~thzbb6GkuAfPZ+*kEgbIBMGJ&E}jK82XbG9C5O6}1}55h?m< zARd+Ef7yLvQ$^6k_Uk(VRV4so;zGX_ZOA}&_m zM}m3JsC0EovQ z-e;)-h(m8|!`8&RXTK(W@^LuFP+eQCWNmL0G3+9mTX6C_ZJ}(elPgld9rsjTg_#NuW1f~^87I%I7pDk~Z_ z7P*R4#v`2m{{U~dOd5@GL}%1bv6(*7d;8B-Kf3<_ThBTCw8#FKL1oce0!eMI>^C8kj$G2D^lR998X-t8?)g-K%oV4R!?1C#A1^yxaa zI=7B#J{5gU9BmxQ>?7I<`i_@OOHk{FG5cCfgA>*{WC}Wp`uIQ?`9~pem;qU4`Z$Fp zi714kii7=s&kCPEIj{Udd0$emR99tVQl{n=Brpy@fCMR~a7ZMX2L$JoH4SE{W~)Vt znuVi0D>TR3v`h|1OWv6ZBEcz)JnJv##%@uF!_$)Ju?774R+z^+FM;xc8Y>b zm^+lffdc@^9OTH3mdd=F_U&;CIni3yHYa(K3Q)GT(+;+eUSl5=tzaHS+-M>{sC*)~n8eTC6PB|LGCt! zIPMINl}*?Bd}0}04UHpsMm0vYuT*7Rpd~K0C^Z=Nrm0i6w{KzX+w=UX&3<6Hlc_J~;O8Q+&O!rEI(gBk!Sj;pD zoPZ8{;2cSo_QYFb;iy`>7o&$;~h|6vltcXlSN7w?Ss)%0{{uz8d(rRh6Ev^|VT-Tzzg9xleLd>K&lEp-T zK_Q@+9Cf2yu&r=ftES)`w#1l-z|W_Ueg05Mj+1ZME(FZRQEc(3i5{M_42s*k?^+1!rG0x*%MCIs`|@00g6JAnT9HIs~dsz zuRSbZ+F#eD~b5koOW|*R03p_@0M!ZH015yZ>BqsI9<6m| zwQF1oeoUwhB~&zkOm`~;2tKJ8;KcOaGq3KlEnQK8?CZ@Rn&2=aH;F=mM%7Y!8KMOEk)7l^g0&1h|^(-mdOtq0^%z^Wfg5w&u)2$G;l zGGx8Rqi<58(zhTrCJTb@tYpnYf)Idn6S_nko}yk^WqwTTdz&4hv6_jJW0@=Cgv!cm zapW zWKdyEc^rAj?KI)Md^GfrM8#=>>g(bkf)XzZKJUadF6zCVI;xD0RgFa@PQb3^MmKES zfUuQTKH~~r81S>+T~nn{1HXmb6u>ZfAO54c>|`FSfa|sP!iTW%tVhNxyW2M#pu+E= z?Yk=cZcYs)mgPpQmob)J`nzBiKWaZ6rB{uV5;9(bzFl~7o}XIQ{u-5di4!jG$HAYzrshX>i9Zg$EG04fX%bCgR;_8EyAsKVp~@mRRUa8niaXHyAue3g)@*F5Ub32$ zVAXBs&43^?wL_MtwXw6)v;u&vo}<5q^m-FU>BC$na$1p6tb1UHjLF9*By_`hgN^Q8 z!Ik2hCre?QFKPKg>0AqW#pPs6dK(JGWFfIzX*x?y3sRqp7}x2+l>&W~CfaQuGAeUd z_?4mflTxi|u3sY9sijNG6-rg!q_WjULIDco!v^)MWU*1!i`%LfwMD(T<1-+PjiOk9 zGBdV4pbwa)SKA}XEK3r^5cDsqj!!a5pF*5$ZJw6S5euTd2{xv@)v~M? z@ha5nHrRkci91+lC`1A>Btrbds|WMV`mG7$SB)_6%C9MCB;%1nP4&GVMBPKUSyhQg zc0s-_3(^`u27ifEy^c1BqDZ}d4e$m2uAUsDb57tUrBt$&sDo=dvrQ!fD=L0z2h-a< zd*Tb))UBz8%Bx}zWf9mM$Lw?M(jyaWY)>F-Yq8BwhGSam8;^01M0-4O&)eI|?1nvy zlEH^NDqJ zChs1ytVl=>+CWzmmRRW1(R~Zbq+yQWlZexR-M^uDlG*$=x-AN{#@bscf(QuWb|H*z zPeV7<5rZ42FNrDq>E;UKGX#SwWP=zAM$_~&m_1s(M)1^aVc)#!bKVPugxO#y`oWA!j=AExCtP3 zAdh~NF119a4GP2oowK-)P=;VQ1bt7;2@q$XzmVA{keId?swrgQx=!0i-B(1e$Z93y zaGuDoti7tkldE54u#getJaN9BQ)CYdy_{(}iaGJu;P;EI?exZ>N}Gq?{{X~d4Ke}w za!F#V$Y}>6a6oy{?r!aiB;>{yV(H6cY)*ewu{qAC(6cuM}Qy~SNJ zon6sed8p)1@YdWAyF^q35LAiTh-1-RC&TnEstWg|T|iQ2)49oSbNt8->6w`w3aqnC zJ56{~u{I^_RXj+pDl{WM^k`p_La3oQus&0 zFL_5))wMllrr$YMg%ZoSieqzNDBRok5Sd$&IlPMwFJ2l^`ZY)_*-E)?~-iOfDwC=IR1q27~%i&)Z zcy^YdQo@mc##E;Q0W`LtUo*>L0e~!}q{@@ro}*m&St`|cwg9POGa!j30L%c`1Cby> z8IqRx)H$p?D=)E~eS*D510ZeJvCIwwbyc(~^>jzylIu<)y5K2EW-5X_LPm$!1xM~u zl2Nm&fGiVEcT^?ah$U7DFuwRueX$)x)VwgZ7Y?pL1Lgw-eJW32EC!Ve!4Bt6JNYga-lL}xMZX^s3`hPEedT0Exzq84-?~9hT)|NJORyeB_ zvfBpTM29}O-vA%K0;G)CI4FpV_?IZZe}Oy?u_|3rMcPr!M>}c&#N#}#*pu|?+3}SU z)>JExm4tup1E0S=SNGP;tdi>#22Bf@`jHvOdCBbreGfeNvWN;R7z_yRV9Eag$5w6nU+zadaIDTEXVg-z zH0;@t>nF0>Hsd2Twh7q8{{Ue|)wuwVMK*XubeR!O&WN_+Kg3-fE8T-lg4IGl0i%-V_xy$fupFumim1 zj^P9YCZ5;zIu})1ojQgco7J=_lGqJ0OyCTV4s(bjWEZs7RrFWyjUH*T;YEy&;_mxg zN%3M$?O?=a+68aijj|6LhK{soh1C;+Rabp#>c*uos?_aH;ka!I8Hb_VlObmi2q3n3 z=@&+`qgD5z4_=WC0!~!reY;5}cW3L?c2kelP0zMYX6_lY=;y_vmyp_1-DBkaN-**a z$xqhJ6!$Rcf+ux0OS^<^qM>^Sbxj1RX^ zEjBWlinG*_#^n=|RzE}Kv__jR$cahM!`ssxOgPR1C`zxgtEkqYMinA~Pg| zi0F0IiFyS$?+YeOFbX|eL6NzMB@B?F24*@bJ*A=Rj6Pmm))k&(dWjg7i^D8piVPVM z@7w7mBHKnMT}3{Py&<`1NN+d~h^Y2KI;z^|Th=V=>r~lmFPeg-O4S;o?WhStjkQ=w z0a~z9`cI#)*EZz|RUoc0`Vad8WBq!zbn>E_GK>Kq?>%33lKoBg zf0@nWIy-#UWAHX(xjsE)Iju6YSsHXGHVjH8>?4AD+IdZ==r6J;-zE9B+NWYz@eZc6 z?5hP*#nh}v6Ec3?^ZHLsx(hW+v9#cSU#D+)>-`3`qnB)9)%EeRjGgJ$1t!2!p}#{h z)qf#Hcu&i9!$2vYb1n&_$mn^ihe4JtI8)lq9+Qqr^HPr>hhviq`qS>B1Ylu{`+!q z)v4e;Qrg;yp-}7wW1YQn738jUvv7~sGs#@D9kR2=?W?VAs*U)sqC6})i${d&32=%i zLT;yi5q|#wWlnx{ufl2!bxS%m#KO!T#0EdEdZ2zQT`F2tt4!h&2;|Iv->UG}aO`#G znI1_$4z<{{Hy5=tUhLCp8Q2dA$pv)P2|)?w6%~J_Q6)4aPNd86#?_lpH30dLmHV*U z{rVa3va+>^Qg8?dv;`dd@z?qy*du&Z#~^iyyLShjkRt(1$6%a0R~r}TBs1htykupv(}xr?BL6#C3dWmp2-MnuHp5<^UX%9Ou4y_v?_4)h@o9VfiCvgG-^Y zg@j1S3oo~jARvoh5*udcMd$iABocCo{RuDrm48Bf53Q;2ZH*K@w^94c6Q0>P>x=wT zr`0|sySS)fL_qJ@EPrx)WE}O-ca19_^yK{vbAKaavReDdFCm|dRcjp4w`uC6iM0h7 zK~(j9HA_<^_D%^LUd#C}z#bNFI_kCaG@+HJ?Xe69{{XG`F`nJH=+>_5=2Er;3F>L? ze&i6@_2ven{}zE#9Q}wFmI&?hD@vV4rDb2lNB1b?5S}>DesFg5Knu{{a1jrGm7(E)>h`DP#C3ekGn?ZJ@}v80r`4LyqMON z`4+$>jUpS3a@jz{NpY1_sASRAkph=4-O4`f-=%_ z5m}Ibw?O3h=sOIgBU-Qaopv;=i8n7eXo~qO5U*b z+&1^;pPY>5AO#cKzfhgKO!f=Ys1K37_xp_D}tM z7QoTam4E)DlllNh`cH1A+ot_)qn;H2{bX_aAM4c5#LY|_yTi=e9iYfcgE_}D@yVb| zWd8t?vPwX0Bf98{_eM|D`gb3=t13y)UaGN2)oRq|0i^!X{{ViN-3Q{qJ=Q1n>szt> zP1^oJW;pfz1yx%cqDuV^YXRwPveVWrDmC?OD5neVQAJb)UP!@5p3B0G=AgE!MQ_s+ z_3e(CthCbQRdA#4z%kEOGrhcf^G`m*@EYGMD=M|Fxz~8y8n&e4tXNsSb1fPO@5}lq z?l@AeRj@&D%^7H0CfBf|r|=G)t6S3aTdu-nnGunk@fbJ*>))eQ^h(u!I+D6P|=p0wgS{Uw#}r(|5 zVoo^znCb_XWqLbKWLb8{cVgycBN({2*AlTiYay9B?U-_1X(M{gRT}Boo@vuGMN#X@ zDtzL7d%-%YUw?wxS|(gncTu%cVq5`|A8ytP3{3Xxk#$WrwJNo3Y5;dMDeNGSJwQN# z{Y><7#}`@S8GVidxt6c8(HTu>o+}<6MiVD9Db`(CQDDK2+AeoTJ^kcAStSF zmB)zcUkiGAf~7@tW9E{Os7k7uNC}v94<~B1I!;A--zl<%yG=3ELqsh2_&dZrDC-3lK`W_yCjW3(7PjF zZVDd>+iTjx>KoS5{{V8uHdiX_pl5ukS8hEj0T2|iGFnclV^)f2pUAxt17o`poXUEH+q01V~B2rz17F!o{_2r zHP56$!H@y@w@d@Hh%*O~)gRY+3Ar&TSe`|UZQTC=9<>V(@)&MKvXt90rlGinD7h{S zh?Ue{JzI;QL4u7!HFt*-2;)Iz>fZbT#@3kV=c07OCb;Qe~=+T2qN420|h zWqzalz|W{;amP@9@%vGRxs0jF0rZmV$cReopzx>~x?qLfj>hw7CPIR%{VJ%h2mb)X zD3|;SF5v)n0t}6y#5@HupvWA624o2O)#z!CtfO~i8wbdJMbKtt? zX=D(0PDfKwmtqfMnF~lED9$3v2Uv{MhX}ek*q$Zm3Sirhj|wJ8wXUtF>Hh%YRBY|- z7kxL}rz^_ClAsSs0YsJom?@Az>&lKzyZP>23@MY&cWvBro?0`v9s0X}3;d(iUQS|K z-Mset#=mi4k*jO3Tgfs<7Cqa5A5R(D*huQM>Nw+wJ=|nXf^bC$yCEkw{7CQ>{)@iK zkl$leyC7ANqDyRZ5;lPwL1iidh>#&xv!nQgyKk9D$=rKFfHDD-8=w(5GEYOOcx;Qx zJ=wlCmchKj@Fuc{B*dY0=!{ZIvtmPxzT-fG-_QMX~rbz4cL+}nA$EV}owhoQEDe>#agF?KZH zz)-0F0EnQcWkn<%<^v-^^t4Jd?N$TStswN{XIoWkVX0n-rl12pkpqPi12GaI7IQO> zw0=QN*O-37-?W}MOt!Mn86>#3xcx>w9NdFX75KvAq4e*fKG410)dXSD^{5aRDm^}E zv9dRRg1gjq3z|F8nxP`26=+#+l$3!!Vz%HzDID}B{<#b*JTez-Vs?=uaKr;AzXP6$ z9xdQ_Eta^P)>XVbYr!%omhvLXugE9Heefg($rZO0)0U7-MHB9#KxnJVFUrH>zOAVZ zO80n)+(QPlNip^Ciw2(tg@=i0v7$0o)pws>=d2i#s z;PC4*)|mzmT~oAj7!BgtRx@`N;-I1@b0^FsOWcw_SIi)-5RA?Xw9N@k ztU*%6bZMHM#f{izjjR}P5ON2xiGT<@gh#O##rlx=d7*4He!R59$2FN{3n6{k^;5F* zubpO}M*A{dOG#kiC9v=UKUPYPD@enJ0IFXsuLJ6Ki+AR|V^Z><*}2ee1z0gt8(C3U z5wT~>mfEaOR(6Z8t^Mdr_;#EYJ6b?6Hy_MTuAU-+5R>fY70 z*V^K>J*!FHDTa2Y$i@7CR-H0g3YiYu3EaSl=Rc*syiloAth zOPlNA_xwyB6zE!pg!PuC*OgQwuoS~A0qRec2@DVgBuOMdA_;1>Y;J7)ir}SSrFSfl z;DT~E+)wBhMoe{nI>$Wv%}0M(r>Sy{g|e~w`2`LwC4(&$eB?eHRgg!(OCSM21XOfe zB0(WnIr+#x4m5QHi=-ZN@2H!U?N|eCVzDP~6$}|*c4TzDqhEQJ=}v$rX#*I8!IE+h z^@Gn;>E(vF^CdNw-SQ&mO5nOrT$Xto6`}pAm7K#XD0a>`l1jTTkt~CbQkYf3WJc{azhW9&p>g5z6s96@BxotXPfv9FJ=2 zzQkpy%Hsq4s^EeTBqsaC8U@zP9+fw&Ycl|+YpA3YdCpj{ABP^0#fI`(Ld@c@xv6aE z&dkfVJBWk2PSMHFVHiLrAxSo|y1bQgOPcy7XDeLo42dyHNkLKo7i6$_Zi(vY^qA9?tts&x@+pT_`G`G5{ZIC!>bjhY!*U}bA1)h;~s9)4TP+Cdp zgH+Z6nk#SoN+^nbOB-59EHD8r#^4}{j{Ogr@^+Uu)tRQf(zpgCQ~Qir@UQT(VgCSC zU`UeVFG;9zrUj`*E01$XNXdyd;+mm+sQ&=|6j#%=iW;81a_{AoYIWsh${=N0!JM)R zUn9YFAg0br6%NN*S@;Hq2u%`1SRgek$UEDv~c` zBc}Mt^=&5l*xLRY>XL3lO9YZxLhL6jtPhw37?LxNg<1H6Q5G+0Z&8+)br}$1a6to{ zfE4p5o}B&Rlb%nW=h?oz!r)SGyfy{!T%%sH18@7b(NM~=y-I-@Q}E{+7!^)%S3 z^+V`C5PTitdR6SHem?BAD&dh78jKdIrnB1ob0I*3Ds2UCF38!%1R7 zwpE7E6y&km1~}-gL6JF`=av!n0AB2B{I3%QjUvY2fi3;hWic8XvC=bP+(GA&nGYjM zf`(uIxL4#~4EVOLj?`}wiFT=35rl=!4qBacO~m_GwnUHu!~*QkBw97g3!NSFsx`>Ip}W0dhO3sQ9xKy;>jzPjNjKHGhe7Ew%k`lQkP761o2XB!O(*P34rZhaP?X97mAhAXpI5 zt6qdI@0gIQxz%7Ns!2&ZS`{KIxFs2I&kRD;s|(mc+>oJpgxSi_^ShrrBE7vd<~o__iOE zS5r&a(yL`bfs$UEPlb(TN*ItzXdX!>^XO`3ahLuD1ukz7T-Lks8eCQ?uU?Cnr%dlu zhDJkDrU+oLh^0mgK$Dg)3u}tkX516ykvoi;VaNxtCvnbLDbC%!7V_P9lx+{v>s@6y zjeUy0hXgyTM->oAA{S^czQ6ll^=vAq*--&Y@5jMD5V`U^S955r0jd}eZg)rYAbn3= zQQ|9q#CU#~URD@>fP?)c{bQ<4ueK=p{-dpCzDtk2mdADRk=VU}fJoq=eTYY^i_brP zQ~o}5{{V%{WX1;3C)}73`hL81%>E>+=@is@kM#m1{{ZLq9avU@ugov1wa6=zw`2}`0wM3EhEeGDk!h(*a-l+MaWqz zpHveuCOPUI-lbm3!mA+v0GWsrF*!fHe}1g829ueNRLiNM%4J5%BhICVYmP*U<%IYW z&7ZAy9A^>r`i@FGfd`O)V}Z84)p+NQ&&Hc8yBd`*_N^+3Q_HGcK~i=tM_sb82;7iK zIF8*RTzGz!!y^YZ7?4VV>S7mgRoX`<3}kJBWE^$m8iNHX;>Zm5>w-v&rKoWrXq8`(N#C_!w^4gPZT`D42Xo zi*KZ{N|tgkp9!{2_A4Zlgf0lW*?Rq+vR4gXFTmR_Rxi94;j4{W%kY*$ol1;>fM=t% zjvAtb1Q>7*-M}E(^C80ZYs>0FT1R^_OBKA>c{4XZ9Ih-%YZbyoiXD;HU^x@tA6T+m~(g(P++ z7`E`ciuPTgl1A7Z^d9Yz=rzKy3(Etz9c&lG%)Miy64%7zt%hXd}x~WRQD0jUu3`seFg<{EKT(!?O!_tYo67AR@8a zTrnE~4ynH+ERi{xb#)qbO&TVdaJbzkE<_00W@co^H~@EY{CCK4k0yL;i;rh`))8r2 zU5`X$Nyx~tB+PZ8Z?K}En*Gb#Mb!-n)DBU3U!Hhs)h*udO{odwGqN#&<8z&$!8uZ5 zK{5c&(;Y>rbSoh{eq0UEeLxTDCng3@zf_mxpXn7txihVWaiwoD?KQR-$PO&(8$~bK z?Ix-^U4(#0;kZNv{D=z5uPR8|uiy1|!}sRu!i8F-Ze&dTNE^QS2k+I@V^AAfbs{85 zf!-sz{m75&)mLil17LXNQ@XC}v?YfUp- z3oS8{v`t8tS2wGV$zenCR|o`9K@`PRIqqL>c>D2Bcy5|oB3p`*!bu+aGmmWj{ra>k_I}pxmt|%UqQKSSvb4@Ucf{N6@QR*lPM1$A2B8W(- z^04tgiY{%nvsTu)sHc?#;D}Ni7|wAx9a)-Yg-WKD7PT_020yG7_n!X%Ub$4+8B{#~ z0QEcbcQc=57_M#dyqxOW2N3=7W7#zjh!qt+=-UmiAKy~{0FS!-?$3p(O?5+FbLFUC zt~2_anC3IrBYab!O}L@~fWm%|JN~^byCJwRJhGBgj$1BG#OlCQ5YLAY=SNf|PB=~s zQ9j*Ke(U|O!+#dRdy8t`!H4z#0Do@XK=^VzyLyy>E8} z#4&Z6*?+h|5GZa0r$rIN>OyMTwu+B)%Jv>qf3KXetm+i4Ep9F@ePJBRz&k|Xew>5* z!0Vy3i#pdAbm-7KWn>xTZRhpkKAjJIhu#?0cT)=~V;=f5k0c^0y&PnkqKR-I`+O0i zcjtvgROl#+!XkXyF)Xar%rc zK4ZQ$hM>mSFW)C(Sf&p$WM>u9eqKRtZy)lP3)mtQ7WiH`Ui^Ky=e2w!m90EHpr2hO zs7JTBk6;h=pMJTQTnlrlvyp}%a56EE>D8`(^-yegb=@b9J|pXf0;dqiwdKRL@fcMB zj6@JAk%Lh)fTPqYvjkx~+^-uiC=`ku)x~|b5#W|imP5$xq z=w1H+)DyI;aD4~hZ-ZLyRV`V~+0`{pz->_q1%5w_)z&bC$||ZfGA?I0JpGi}{{WR9 zen#;2oV2vhDfudk_kanW9TIXUZAwW*)Qnyc!9&HI!7oPD_KpDl5ev^uHRaaD%I7*t z4PmwKHirVWhS3zhq49D%&Z??<*;wrgCs!3p*j6I>FK#2ws-@$yqz$-^Pu~k3{X)Ok zZH28l6p_^@yEo=Pp~uyv@H$p-OnOLunOg#MHd`rII~o*Tp}{!+0AHp=L{GB)h(5{x z0PPpw@9+(UNYiUQLlWv3{fIyAIyGN=YV_1(1tbsNf24lhboH=*N_w2f{{W{W#&03D z9Tfe!@wT+x4F0j;#B^ z1ia2RjstI$Pu9?}u(KMcPCKh6%b_YY{-&#yFkscu1SCQp!^&~UqNR9_y0A20$&a@^ zkG?qe>C3~kNg#$91~Ze1`gPP6$;7F(j+L_5QS-d34#w)9D`LBBJ#Zs39;A}|;gU@o z(cd&)8tSOMz*LP@6W}{*VF7KV&-dMuqY71>jp#wVE|@|&C`ZyK{{U#oRWeR8Vme1}c5dg#H!jX+#>}R&z;Y+rt4jxI zo2Z{-X$_QiS^YcU3lY;lV7l9#+H_tZMKn}YxpXZHM{OF?w}{cHwE$aasA{6psM~3- z9PN{ylsWjueVO7IUTb-ZyFp6_ zBYKvRry{=1bAt1#?5g%0`=boB`@%{pVuAIlf~bkYUhA*eThy&%PUJg^VVDA@pb&P{ zBl8lfV+VH0f@h~Xwch7UmOF(q5kZ`fn2GjMOBp=5?nLR}-(FF z?3`DhW7;Z?FXi`FfSV-jNUEy8^Y{4@=T5h{7PKfaRHe1SK>+RJjBOx;1ODA9t>=^+ zq;Ha@WSp6ioX0uu2dKV9ASc{mG}kd}+{P&BV%El$S5V-Kk&~19mzqu$$4K4a)R8+c z_4oUHGo{igM&i8^eCpL1$affSHY*+!1@wV2-=bFz*AKRv08C_K1kC0SB<5tCaUEvi zxE4>gwk0MpPjO#oX>~i)0&>B>OCqWK?~3vC>^2Idq=ZZ3mP=Jf$5 z*Gy6cNMd1BiBq)g$sJD7yggE-vs~A!JLJNrNOI84rV6hf(Hzyo%hn z8qz$8U%Sy_P-~gH&F$N0yR>Y#7=|Job!vVA=v_OwX|~M# zb4KA>ml30OTiEt#p2-Zh$%7^YpNw_%{YI6J zgRxxG-&N`b5Q@Z8L9{`fg)qd*!1mE$s8V!lwsexzDEW@pVHwLfBe2fJIm8^1zQynw zpKxu>X>;Tsm~wZV=~$ePeNCft;k{f*8L(Otc~Qq235^r+hM0rc@ROZq_vLCkz-*TYmvg?yAuX@)E+)E+eoFglPQ*5l%@9hOQv=ZCWKjPU46^ z;n)0HEzKIVHOhPH3a9}AQGB|DZ!HE0rtP&jXF{dSt8@!h&~1F$mq|>TNlri+V#*>1 z`JiCLawm?cZr0-;&q9_={O1J5Y%6PG)JPnLFfl4=wAz0Y~wRNe-`yVw^VClM}cCxBB_4%Ua%1>L@4G3S~~w z8TEfFgDVmU0QB?tpjzKoc^dbP_ysm;lWi=vwmpr`RezGO(b`E;aana>y1k?vzou}V zMvS;O*+mjTRUUEp!Zm$o!z0AnjYOwuZ0xk?)1<^G#^L5J6jI&=GU_BN!4sXjHT6pO z6KPLqouGz;f+30LGw>s0a-`v$RZ{a!0t@&fL zwcSzN$PTE?#8C@^Q*^myC75kN65VCv7HW*^L5|R*6*6WZ0(TM*B!d%?5uUCG$DOB( zBUSq6AcIp#RCxUJefaLA){$btFH$!U6S9dr>tI2&R6}tTL#Xxn#JZ1ylCGrMh0Vs= zHOoPCKQjg@7|uyxC7XekB=ax9OtmSBbyr|P1dNCuO#On1KG^9|^F=mR)zy@scC%}B zlbIB$QklXdm6V4mQL+8C*^*o~{{R;pZB5Tmwu0oA*+VcV2%SCyww0r64nhXI6p#aO ze6T9X^Ol;ZY^s=D#femEgewID3YS#MdG$u*8NrAL5=_DUhIr3L-voDbzaJv!cwP~# za!Fbt=&>@$874TckB7?>x&wog^3 zr*0g>zr*p(znWiOWSCA-Tbb4tB*{;tlNJJt)!}UFhd)ryz2?=PQ=BxQ5ua>q^oQqBbG+4xM@Ye(Y917j*p! znQeaJt<862E4GqtLFMfPWf&3xEip4OoO|U}YL88d?gC74I3#?;9kU0BApLr^%_-uB z2UVc)EPkjltGwwbZku{YJQgfKxq0%4ZM`uY5;SS(y-}9LIVOyF`x5-*4;uVe)o%Pp zTIGX_b5e{5G});t`HKii0J=2pV$vCN!0F=8NTg`*r|76vhcgU)23j+~fdKLbGt(ud zHA3niBsA_Pww}4U*7mf&Q!er7?N%ph#_w&2(*4)ISLVWR+%(Jd~^@T(MeF<1qT&?LYE?}^TO_-{_* z`%lRIxwqh3YsX|-NQn<9zG4#jurgQz$LIO(B5-xIa$feo52hn@I?R4jHvu?bWdsm2=_Y5l zRx5*Hm{v)VM#?Yf@$7pPvnf$7VWc!CAy_#Co*3^7!kjcODL5$Wf64xs$FKMEo%D)@ zuIcGlRjM8~IA94)+f~$wl0+*NFu%k?PGAiiF;3*wD4|~w216B*gP7fsBb}!NXHmVp zY+G*@vQ4{1aZ`rmtS}bTqhRBrCtk_6^2~^gx`=Y6G`^2n`v3vf$y!weQ0bq9b#*NU zg-hK@Ma3ffDXS2y3G@oeT4iXoA1rMw0}#+e*%gJ221<0JZ~$i^SP=*6kQ+z;H;?Y%6ggLc@-qAz7JgJ zi+Hqk8m8RTC8@XvYC5|U6@FGHbr!(B${cSE#;&B!#_$=kAC9<_rzz;)Mm^C|Qm7CSn}yZJ&A>Hu6NTu@ z--@0av7vRLvz4Pzs8QysY`7D)iZKs>(^ zLl`D-V3W}|NV#XK?5%M8zgl?i$=mxo}u>?s! zoWz4T$sB+O(nLW20M1>twl{*Yrl~Bl8l7<*>@R5P&5pmlKCr;uIBq8a>}BYWIY1E{}x&01@hG^xFOE$Y)UgtWzvPkm?EaxL_8qD(kht`MS~J8gEwim1G18 zPXSI;tB7Kr?c4w&CJ7|;Sn*R4u+DrE*x1wt0&`F6+3plJUF-M|l$1hKR6%o=!Fc}w z%k9ej{#z9;YFl`rDvUC?nfBoI`V*#G)2XDT2lYzh>PSEL>zNC=EJoh??xwAg8A&2+ z<72XtviGEcqV}&H`t{{L-}CAL~C@ z>#2_t*8#(Eor7h7+WmH}osd6Y7D5N4BvwO;k)k@|1OiQ>qh}ydQ3+MibCe|&`S{=e z02o@W_4kP=TGe0T(V{R!`s%T2pdJrok=b_SPeQ&T>c}-Ep-7WORYVEyF@v7i9majS zWxOrKbr$a3NuFEl?3Sk|oi@fqD_Jhehb&S>NHGz}zj0I*Y6x=Ki2$2~Dch3yT-j+g zP4%aRFRnM*)IyA?P=M&wA0`{rD!79_pcilg2TQaotu{-Fe>zB*A|zx9iO)QYpKhX< zChODMH_r{duDpezrPw-qEMX{d_ipQ+omppg^KJAqWmBWfL6Pl_zO+{3xZ`St-9H;g z;cks#rrOZdt|^O;!HVLj5H>6_qq2e;U(-~AOSo1l2n)J0YxQ2??dm~VhZB*z7$BVO zXkpf5rDx8VxP5aWO3)WTg%z$ua0i1jNd5n&b?Bhk@ zG|)AqJU1eZur@#R+ZQC9c@M~aw$tkXkwlfEUtqSV2#M5PE|tCUi#CZ` zol+6&hAaqZ-X+KYld=xr43MWLWR8}#pn}hB0tz{%0Scl(w9I#|S+(sE_$vbca^KS4RkCd5lrk!EDns)P2p>|#wj>7@= zup|bMUnK1+#N(!~2-aGfmg=q+h*B7g0l5i{z)z+yPB%#a9P~8Yo@RK=&z6~96!ue+ zY0674U8Ws*n_0$2?V4}9M6xVnBC#4s$d4(qWzy&hq9o#y5U1(K!28=e{vM-gVDD0$ zx$@=5uYlmU5(=;?(U3vd-TixIO%K?ZrYgylaUda{c-yBz%g&R6`oz`Jl@(vO&zVxv(}uptu`^N zZ@l*Z0JlB5>!-m>I!Rs$yN$SM~AReqth# zI>8t^Z8)tuFE!Z_zEQDMAIqPdjp6}VCEYqp6`YxlBw{CyIFa8ybiR#RnXPX1OrnUv zC++pmanh-)ww2!H%|Btw@%srOj-f^~{k2#Vl25kSBWj81H&I?~Q9u2pUR6`&E2-%9 z%F+eFd0YtHw{YYE$tFKY$5wTHLWMM_^uZH6@$#Ph#C1+PFJ9uB@Acc%-ZfC%T;zDR z9lo{38r;h{9?2IDS20?y$&^HhCn4DdDZ*4lP7A0a3J=cp)~wpoPx5A1fDdR4(s;lb z!1nLgBT~6HH~#>MDik!B6O0l+?bC<<0Mw_lac4hNZyzgj3r7bUZyKfcu*r|MTz~VU zN6-h3J0nmFgkQR#{AbjtJ!@|)aNET8{G+AH7mG!N@*siwAN7u@BlRNMa`t!XX|Fa- zflg(M8(A0ZHQSF#J8?0<4i$eM1Q`YY0Q`9S@QLw)`lL{#J17J8kMG~0HmVt&<0n7U z`wa9w99|}4O|5lp;JZ!Z#=Mrf-p#NjLJND#Ns4f58|o^KI!!+cItp{^M_(fU0B79Z zn{aB{i*~|EsZjkf1Mlsb<d4+CEiws0_J;MrLC-lPQ7O8t0c=2njg=fN&*T3D)k@zC&L<*^(tD8O10Pp+D1?LL;?K( z`*bf$(#2gig$rezse$*C$Ll>?Kj~HB1|j5!=o$Kh{{V#J;hy=0isemTQp8dhov(`$ zJ!QDYfY1K`+)8dWlPc%jjDyrG$0)V6rm0o#Ue(+9YrvdKFDL6DjPV$Z&4w%~tr1i} zYLW{^eJ#ZM3>Xp4W(QVJ{{Yh^`kdnt@aMlyjjxdvZSqf1lPG{D*V11_t^x*qo^!|D2 z`V{`2UPMC6^Lz(hKjTK=wPdzuETjM{DbXqsV{flj-YU^>wv)dYsZc@&lo=S>ja3e+;9sdAnWfUC) za22$1#?;BQX^)z8{ZiVUA1zKt%s?B-P(oJ}5YYjC z1Gs9p)JPDj)5tr3J-wukeW$-u?P*%s)egYBsKh{4KIa>tAJwC@$5PKX?XSF}%lAej zg|V%|JS^`keT!^{*~TEf0d8eN1u<>1QuWza#S!YflW#gae?{|&f8wv=O6dB>;GUgN zEm2(gK^csY9YAx4UE5eeQld;4>YMQwhphDrfkxqgWmIWmR0MKBG9(kcDFE}hfIIa; zVYYWRw%6HKuXeokp0a~)VMCGOAqE@iXOTw&cEKY%Bv0vx*p_Uv@ed{*j>*GfUlXo0 zT_;(&w!9DciscfmD*K&w(Q~$oR9a$h1+8BQTv)XoQj-Bvk~gK0OA53f1?kj?Y55e%_vw!6f~B{Z>mUa7 zs4XS{3LqY4Nz4HvM+L7hyrZw*8h|km72wXKx5%P36lOmjGg7j-lSLrdK#t1yPo^fF z0w-M{aESpy2h_Z+d^Yd}mWip-udmWww*II2qK}s~DY0NdFze|6Fal(HheY(-y7fY{ zDPOr8n7k_p6AB_^nPdE*8K>_kwFchtyF9Yjo2H^O85u%u(a8_I3&E20berqX22M6$ zK;jDb{J8t_T}AMh#@Z)}bmY|Z7bcKmfB<`CL7qTT2r5sfA849}megw+7XX(h0CwVL z4+B3~97&$PG?g58q~BZSw{W4kV??C{+q7oC=~a>k+mAJZY)IXGsQk2SlA)5esmU)1 zmyYk8Ejl`S6Xn$PN;A&jRJAq?Kor@b!--M4VR_zT+r5=;Y<2oll> z_u$Uh=o{sKoz#9v?Cot^X^K+#&5JPGiM6j8~zfTEq{#th#s>(z0~+$ zzdvu3r;k73JH;0l{{WBDt|?UlOjIRVFc>2I!zN;OfO8R^fzYDwZ{*Yy+Ej%GI4wD! ze|YIo^IOPjeZ?}Svrk*wyRK*_6A36(!JLrQK*-K2l6sqHTLd1-%8R^`imE5ed*C<2 zD*7Edm36cN>bip%CXfJt1Hs%_l1vx`VtSorqtR_U%wg)@LV{;-Fb3tEK>>y^2n5d- z!=U`c&9s)BweeGac=fooZ;-h5I{H-HNmfb})}A#;2Qin-UJ(^`J4#KX%Bj@)qI~90 ziGKlfyZvGOMPqiAt!vdn)W+m>AS+Z@3Q&en)fRSS#GG`&tiA4;LG7++m8hzD>==-< zFk>(|Bz7HhyylSEGHkCKwXv$j?pd7kQ((<>+csbA*t()83Jcv7RX)m!il1+vptSsd zr6nq6inT;43bMfjLc%DsbZ`O`k2y5xpG|O-f8*MIwPcF;hUn{Xf2|00;+~Yu0Ia`2vG2@oc76ZYF*Yl znb=B!g=MEsc7-YemSW6s#~=Zu?bFASz?MF)Aml*z2QXyk=p(0VS!)j@KTr%C0=LI@ zRSSCOR@Bwd+1OsT>@|ZmVyly^Sa4C%en7VCP4Y;Jex{Rw6JM0BxvO}4;r;dMJ(D%X z@vB@dGOP_f;b~J~N)*^wsxVz zHy*L^Z%j_drDU`i>c)dtSZ*le$kdbv>g?s1sx@Ff_a~o2B;egIy7v^~okzjmBs6LG z+U)s_cUf9Vg3R)?-51h4whAes$WgLLj+}Ju87(daI!vSt4{}KdX(V$5w1XHR`*o-C z-#Wo&ZTyoZtIF~k>CKO{aLP$Bqm}HbB>DiWKgsnh^<}q^m}tEv!6~=dJ2+a?rKw)s zTnk{dYP%masES(%1cp)-Wr>no)(KFpk{30d8E$I&n`!ipK$1uR$&msil0K)XR;1s4 zBxBiDufwuC8#0*nZLN%$mL&8iWJ(i@VAK-YhKp3 z6)l#fFxz&z?H-i!*z%(rp!&ld@((~X4R`SSt%B4P$TA2bSQ7++GZ}&~vODoH@|R+1 z9Cn8mzQeHk*tHHEiYl{i#H#CTteId;s%6lf)v&`919w(Sx(Rb>ha8f1xB*iPmcp110DRVZ6E7I0~9IRyHF4FD04vOzw> z83(1;2mL~~U7hUg%F8IzwRkLB7}6~9O591Ym6Fw)V!=a#KC%ZogDem7I1ew_(8*C% zEUkO~8gv>q>tjZhcDQ9=m71|DN}wgT)W{-BG4!KT{JTIRR`kt6u&BTg7(gH(0PrAy zIPDTA++_8<%RK$daQkQ&ewWAp0L5<-r4DtLO8LWjj%$qry%UAteFUi5xaVYWh*1$a zMIqWZ{5e@((QEB?r<+fIr6~a7q5?$ycY(Mn#?T2pz>}riRHtwhA68_UP&v;Y`TCFF zt2^)~cH{UqM}cdIGw=zzcJDM|+6vcYO3aWoc7)pA4B*`o+gSao$p8*Rtc2+bWA zK2skVJT^bYS6;2WRHBs4RccJ4r5Y?3%pa7xjk1DCMH^tF4xFfKg0)b~w`;J(fE9@3 zPGIM@J@-B-8Lyol5G30?G zg2QS?q3lskoYZ_IDCx@7pUk_W!k`GiKm&@3LEfP~MGDUCu`D_rs9n^lzi1v<1VQy~ zGN*&VF@iG?2^s3xe0#vMTphVo+kIgnhyKW`a{}tDFy3 z(811~RMmcded*U)Ua6}Zwy13C5m?E{sJo>Q01Ix0D6aD$s3efG*sbK!^DEQ^00d7Q zXD1Lq$m83dmk%oQe;_s{&(3oEX`L};udm}qal4x&3;zIpe06rUnGL-iKpA=Eixfm7 zk4BXNTyZ)GuSKWD{SN-wt#uWtQtFx6>QPOAT57=&Sb7x@oWiq#3L%@R6*X#)Lwyi{ z9PVg*WDJ8Iq5xG{1A<3Vy-Aej(z2Ksv}#;_-r}i?NHSWqb)u_>J%^EAW7;XyTvTks zhReG36&}CtPI>VUh3$NbS4v`?LXXJ>(1JlSN2G$hkR-&CK}WH5jCW+_8V7#J%wS=SLaeh_X{<5QgxCN{WSJrv!Ss$8 zDVMEWF27`Z?bCk>JXN9Ub_YkiL}5v3G9xI!P(!jbh*^T?k_?bYo|cxzom+!(wknnx z0H2fy?J@%A^6|*(A(rNuuG#S-(>2PS%kr$Iw_h5?kuB*gHBm5QA_@d%`Y`O1ep@mK z6|!_1Mp-2UA6lo}Yd3A;+g&31s1|>TD!5a*cNT9^k`y5F_e@WzMniR^X-i(HxNu|{ z1nvSP`hXCpJ;0N|IF5#MHlD<4;x^XJvR!Qg3)L0!G6}K3UMP?zSVxTW70sIWDITfD zMB80jY+6?Oh>Gx5zl5~=>q=G@$x!VzQ4{6O5bmY;UAuq@KBg_YWRhm<8fC$#YnrOz zRE7Y{1;l|ovu+XuN6U!KuzuT%W0V^UF4fs39Sk}=P3zk1j(t$y)mO3rX6=M{U7K&R zg9*Yr->E7pA&PZGMDXU6n&qWCDki)6VVPaybwc}9Y666+jlw~|V<(QF)1)X+4M>Ej z7jR+&C&a7GSCNu?%Blg**fTT^%MyaRetO^r~8bsmj~6EU@rz^rH!UiLU| zH0TkaNO?rmoJP%8?Zt)hgI=wwXlbTcQQGuPKxytRQ29iu94wUpu~h{?60s4~M)6Hc ziZre3xN1TU-~^0eN#w60TQdWWq+hA_+wuPZaY?~-yO_lNlaj)nZ$wn}69%;~nly|r zSJ<4cq}ZIBNQSL8Y2WFaCeZ`G=VPV)gXqbrXg5OJ$Ym6i(giBhz^Z@+}wd>e}eZRgMyvGd!4| z?nHfh<|k0=E9}=g%(D}b3K>LTtJ;0{MW!pssIN+O#V@)d07H-{pWk-TKj-IQY8urG zYo92C128km3Iul|K|a$xy5-v~J?`k11P`z3#OEY;k^1}fbf2e%R$aPrSWM!!Rrl>y zVz8_7TKPodAXZ}{QZW_6A?k{414Z`!kPQ#2mp?x%{{Z6OTes5ndbRZcRMo7_N!AbW zwo?q^445)9B$5b_I;d`~>RjqlO0D*e%w;neIiV9MdLBViq-t z%#ty5lI>eSC&o8;EguggV(4KQr}jnkf$+92mt)b8ly{)rgn^xkZjY${{SfbOxQS0 zCNqP>iI44SSdrhl#;=4T$*OEg8*Wnu<7(MLaRtv?jUoxQtRWyNI3mm8zX|EuUY@is z6M3raOS#^a42O-xZ4R6ja%`Dz*?JAqfXid zx>2cLXlNxGs83BWWR==lAbLSz>`7j3qeJl}CR`1`3`jX7@DCWw_KuhBqvGD7%vn75 zKFDpTamdfNfyP@IPLpoQuzp1Kd!%l%A6W3>PGlQ3^%BXC>?8(>4Ts?$jqhma*Oh#< zEleY+K?ivo2JOY61l zCZ#%b?fk+v1oJl~PcTUYBNk%eWa2m-Iq7<5_*oT}2si+lQNJaRG3i~f48i7lQ2zi@ zf76y8X{-(15xnuuiJ9OR2R=15l!&#nuIsN%N!M{{LS7x0%TsEzUEfQ3^EOcN|PClEc4 z80(^ZC3KZ)TD@t231)$l01v1K2aL>g)PAYa_N6a`clbp`<&IiqT~7*NQbceTspszE zH1B5w`lDSW3rdJ2M6VAe`7g;{7PV`7mfC&AK>-+^KnwwB_P{bv(|1SwMRuz~waqzJ zB!Q8U5%lB^{@roGv+*q7c=+)}Z*{KaVVh%L%D06^^j5(aA*YKe!<_-qZ|)X#?h#4o zT}kNcA;CrUlCMnZ{!N9$S*evVyXZ*4{{W@9#|?weTP@s@PBT*Yr%E=oPQI+^1N2X*?2@4{{Xm7DCochhYg0!;1LcH zRL$OaLF>Yjrz(lZ9&5BJ?6$kJa%t1~wvpHm-hW?wo;puUtbuA%y8i%}#}YI8eZTqZ zdzxX|FIHt$SIkyLt987ZovRnzj=g=aST)tA)lmo5ZYymP^Y#+uKikK`8YhJ9tLhZk z%m)l-fdn=O1V|l6*E~sBY0eBz(gbsmSN(eA7s~ADF#iD8u3p6JH6gveF>JjA9!EhQ zed_XgJEuJIsP_r~00NwSkv?^whznJ>XJQFe9-a<8zL@9Sf!8|Fx$^E+6l0IC2dMY| z08(DjgP(c*N3f|RH!8k_=i_Y36YP>!9ix(aqNnzqr5LCF`u_m?{x*ew!zwo>PwyXI zmzuAb;m^yD*mwPUO#JqxWVUyXyGA=^vDVM_$!@pzAs?(6Orj_E_ZbhOC;tGlsq@;c z{{W`ONT2K@`yRAYRo=hKK>q-K{B%9?2WM>fxNW{0tMIF`(>T6X)xK?$H4y%u_as?L zU0spKL}8Ow;{Ye!eLzM1f+3{1bg?$nfGL8;Burp-fe=3Z=!Fc@@S{#6?90 zqCShyKV=^hYhwPOu7hc!!bkH&f_}nC9q>A3&~#<9xBM|XnSqbAf(P99`kYTrmy8?R z9Q_KvTAjhGHdM)&w}V^R!I@cX@`uyoWbET|BaadyCtBIEtSg^Sw@A_$eNjad_#yBx_8zU}lzrC+Ml8=KS*`uF`V7MIww z^wKh#@`x@sIp8t%yCEFz)2^_-r#}Y=g)>EgL)THL5rv2(9L&g`@$df3yURAUM6I|T z(>quYAohYx5$_qE-C2%PqV*P0b3*;iHML$x0a4anfj@^Ml5&cTFWG+FmpypwguJKQ zmT0FvY;or8oq zAb-=TGTM`qEjp8C%m5$vI?1?Pb!g<<(5G!oTvk4wK>q+%_8-*s3cFUisBP`mNyLt1 z_EE_{Tm|Q_b^OS5r{5jPX+9FA`a2!bJ_ z;^Ul>A}Ib~{{Y4Honx!5=t5c2nQnJ&H47*N0ucJ4iNR77!N*CO{k^ML_qjlhe@g`+tWi`CZ5q!3=%yx6pe~E5JXM}?{azG;<%_NwO3&o&me;vhjYa9 z%=L+{bXLg8@HiTVEG##3_`ROe*iEP$Rhi7Jfv=Gr(SBIjdM3x45L2lqQWFk{j<^VX z8`b<(Y`UP;sU=%&X40am^FlZL#Bj?`$Q3Bmr&F8|P|0LQiMBO%MWPnKhc6^SF$uT% zp!yf)my)1XSO4`&2= zyV(tRE(C>99+s!#{bN$Rt!f2YwLH3vuL@KpPfF8y1qMiH19B705z?Y-^r~75I^}{@ zFiOJ^L@;6uO0NPKkWN4Z9;^QV$bZwN_PkThe6qjYSq|&2#+-uI4$bvzWiEX~?vp7R zSps)*Xz=WYg$RKWq6YyKxlWAuTk&4vrSe$Y*(H@at+wOKX4)&m5XnB3LJ+IqF&?F1 z05eO{D`alw3y=pr*nmixo(Pga%<~;FF_6-wKsVVj4L=$DFWz4>< zakLMlumM#V{{TwRE2`iNjG-fF;`9|$6t(?dOSr6poj=3Vt5&-(EESTll8sFMZR|)Y zO1C>fcnnrP9<{AewE`JvDF6>i-%|nuKp|jmZIw*z-cKVu^fvqAJ#9kihn598LB%D&hT6cKK$bHYJ3)X5l32W(z)v5%klS0XPTJa= z05dt#PcWM)$q?w^ReIY)n+aY)Hl21^I~>_V5OjOEhu^BWwAY6J0OB{q_7p5?SliI@ zReZ7-oz+5v<(1%}MMgqK<#yUc6CFy_MHaoQ=K`!)l1~7{vhqgrxNRG8+(%I_Ds^w^ z)j!MXY78fQ?yO&9)lb5TrjspJpQpB^b*SFTqqvUINM=DW2qPrGx}1)RiNY7lGeGfH zt#76^=8a%0=#{+k>~UV3%NBisl^s#Z1yNL$Lco}Ue?}J7@6gm{^AXeuAgmRQvL%k( zV2!4BkAA9$%&l|(07rM#r-@Lq+x+&Q5y)K}E!gc>ELUl5Tp6(4IV_PIuM}x9y@KH) zvVGB1QMDhPBjDQ9E85lZEd)eMlm?@2a>UYIzc0v{1j5NY5xDdhQqXL-wWSm4B&-P9 zpdH3L%*g)$z#zD6>q?5R8ST7R+Imw@Yn_jVY= zK?yyLi(;+_D4`ir&*Pd6ttPi%^{X42Sf-=WHo#aF4#2Dw)CN)al8j`9=)S9^(xs;@ zr9@bw%nM98&j4VO30#my4$+C~5jSk@%ttE5rR=(#t8idA-Ak1>A4!owysfmRjO<@Y z)mt!*JUsPmh3ESdW6{3J_V`lM;gznlZ*tmW3RT&|2H8@bM5tB46=|^uKv^4U!n7CK zM@u&>x}CwTU7Db#p;&Ir0yrlJ6O+0Z(iqH#`x5;)H`kE(J_)-u{405w-b+x$yJ-Aq z?6(-5>}taX@hLvreUY_wKNWBsLFEMrYg-*pQ?fNI*1_s6HYyx$8^Zc`LE9UMBt(de z%z*}ugZN5nmqJ;9Zg%0a1ZVs7qj{0~apwDnWN1qbUzOhNjQ1_1n-XR*QxU#e*k~t4@yls<#h^cY$?~;C4sG7-Bq26fH%~b z8-N38Uo&e4JxhH`&1fx4KtXNCXp@s99GT|_I5|C3J{^wj?6Otl3-ikx%q0T3W>zx~ zyqJ~i{F0>%kI0*h+eN~1y+y7C7yYZ!o+;NfyJkwVtxX|T1np{oDxwwOxgZa?lNkba zo0h3{_+aIcz~qntj0qh5Cx$%ZtCH|0n{H^s(f&qjoS(g!O@^-CJo#-Ektxu;5?uEcq&(99hc zo7810T~)z!J5L&0S<|%2Wfq#f%RvMN+yI_TfC0=8QGRpz)Z)KHPSP>I5J4wL=oPoyP4q%w+#PSy)#_*eMW4LLt zd|Jn2LZ6ZQV}A1yg8E^vj~$3U@&^qhB1n(-?3^^;9RC0+{HJ^gqOJb`hi-JIt5s;$ zs+&khWKbJ>IY|?^?uneqgSQP@#-vdCe%9tGdDN-XY@iKKb3daSHq&JVp$Eze;cG(E%~gNJQ~@$d=W&_D=LhY! zc{7f^weG;jwv`@ltv0?qxf|T#)>SY#4(bqMXcyc5gD}b`f!> z*+T_sRS;drf$tWzz1Ent#T%36QmP$Qk`*G6ZNif%R3?&;b`)Z)98XgG>W^JQ9wdVw zGM`r%Ro#+HK*UZA)1JnemTR1zE)S7MdLC1bdYQYZp6JPs8eot(M8NO{(8 z(O$!7+{VT5Eb^ZP!Syy=8D*P+mg3HxbMh4;Hbl$pwCb`bCoxQ21WsEr0z^UkrrUT* zgWcTe)$S@?P&8?SMz9qC^{@=A${fh21xYaAFv-Ac%fVXJt&t|86wlI09kczx2RwBp zq>;2ddWEs@t%Zv*j^i1~(NSJ8l0{hZr@~t%EgOEiVG61?@I)?TGDZg5f`6Y@)d@9g zZBc1nY0O=zB~px@r5=M!hF&)-L@NNnm6H;~uQYo{N~-rux{xDy;FXagV2~tWi2l7j zI;%@HAu$Fu&bx)O@9*j!a+3ZwZyta?q+rN$MN(LYFFzHQCB`=uL-`yw8Fd(NgjbpT zXX2XcZ(93Pu5GPo)d=X+8oc_`ZBa$NR7^}uZ2*(% z5wvCwGZUSq$LY!Crdu`aIh|{7Nd^@I5~)tYd^h65Y}FcawM~~1Wcr>tBoYU)y4z#G za^R=U`ftZA0@f~k&Gl+K7YdH9z!SE#IQ|~+stPm(bMp|h)ZI@=ec|WWjDl~-I8=6@9FH2fu6*Th>l zsLkX7w6R;B*ST(q6rnbg>EMz!oK;rl48kx zY}#~@A+L5@A#J1S>ypWfsAi%@v|2iEiL9^nTlyiKTQi?RKtzx z85a$xD9Lca)hC7dK;xta+KLR9ReB;KrBU$5#VdW{4=UM3Iu#TD08uzCL{lQElMEYx zSQ(J81Z^`b+od&RQZ}fC#{`U?M3Qm_BO-H(v&lAlH2L(uAM)JaE6DY=7*!iGN#sZu zQKLM?m7|{42}$2`_K&?O!~9!DgxpgwRQb~$D$sAP?I>#$X@Oj;fVgI*QnD350bQV= zrmIW>UCD`1)6%8RobP*0hEx+HvNSWYCX&8ZaGJg+5s6Mh%mp&{DsuckxyEqqhDRox?5lX+8&gItL6Uy%&b?` z&K+2?s_opv(qMHerIMR9xvH|iF!$X1P7iEg0VHD}^>N-2Z;X@5?03xVN1<}PO{ey? zR5o#}b|w574%Y-JPZUq6j!Y>$_gM`%-(OO;${S17(Q#2Km-sJVK=Bo&O-7*dZmF=U zLlEy#TAA2_07hU#mXgJM%qdyxMg7e>_3l+F?R~)n2r8jKl{1nt$bfV7>bq`qEN>XK zc5{nw`^((39g~mE#wnVGA*s_YXAGrCv6+V)Ki5Y=WyZjytYia6R2vUyf%wXtCu}ZG zVmBS2k;#s|{AkuYI>wLwsb~!-&yJWA&?no5SA3ymlw}gQFZ4%~INCYTiZf2Ua9WCy zi3AZl{%H&255=uFNi_7EkSnt~sttguD#Eoyq(_z+Hx)%Y_eo+%!6#c+uWpp6=@!XC z*ocq;cF3L1O!~Qn3KudbJu(~9FBY^O8{_?E0~+TY$uSE9u}7sVk}<_P#Cjd8avmb8&VWFEFvRq{X1{E5L;Mk z4iF575nXXn32sZ;7gsc{>fJJ-DhA;oBFr`<%K%6QVT=$42TPPI(zdif{*ok^6PW&K z?TIl5+ur6h=A_;pGg7tU#zBKj&Tk{)Zr5koZYv>!cOJZ#B3*+86qJM}0Jm=;k@YXR zltx|Zd~x&hWBw*IYew-CYWI~^jnA4Y)1dO{R*(rvgKZ7vnWU_DN;_^zUV7)PdZo#& zS#8&GDglq7Xkca}gOSPSk-=t#z9a{1Db7`UQ=WO(PAr*% z@44evq8O2*pJ@!Q+d6OE~3 zO%&>GsGeC^#25xh806=D&cc$8xa%5sVYx`D76?PG={J8QB{n8pd+=btFe^tu?i@syi%> zn)Q)(y(dg6MCduJ-sF^-bjiY8x=b)A6`CZTglg9p0?ad**|?H22$Hz_jE;Yl80lfsOR{r4$B8|aU+d^sI`Y0=K^BdD zvj*C{=6XF*o07^kA*jYe(kx^Z0_6!BPq)uLBHZbkcZXWu%H8%~I;&N}koyBGRNCaD zI)Zl8!zqwnXQCBvE7nQ~$^b<*0Oy=20QcJ*M2AeAF357&V|Pur`- z^-D_o9%Cm5-?WG$_QzLe`fgB2&^bnDtZ}Sn1r8xb^Y!#lm5AzYeL=eL5k9@7zR9bq z^KCqCdXU=z(ULn7X4UwAVQ*T8nC-NlVERDE z0N@_d4+rVf6Z(L^eM^nj<`tVEF-9^OQ*Hy=>}hKR>pg1YV97WSvVae|VK%vfwO+34)JWb4M*G}6hK;xy2@uCjzq zJgg5*KD$Ed=AAWfGAXY2Ga3H?FcFeu0VW{eb5~I;Kk8Mvt@PfFui7oxMRrr0TLPIi@pwp4wyek40D`~n>e3n-FJ4fWsxRGb4~60D zSEy?eNJcUU%m|Nf*Mr}rFCN{STTBTjAJ%8L`}=jtzv{&kfbLs@s9b{Qm$N{OM~n6_l&<-`^uY)_S9_hy+vsXa4|^`%hb6JpeXOjaUZC zt9i+-MwtS^#}DuPGb50ZbHac6#cP%S0NHc@06z#>-}$N)zG3hFNW$YD4U{ zUg8eM()Scam2D1onfDpZGp6;n+q; zQmi`X^y2+RVCEQan>vOss;$9w zhA$td2<(e?aGoZ~xsSHUG7>wfw>lX`k^caRIL-+~(s4j$oR|lKME?M8M}9|cz6Z-b zYDAIS`~5S=F%Wt%;eKQOr2hb+9BgArc{@PQnLYz3HC=^dOEJpt+Tsd+5UcE*7k-KG zLQz`F6);3?5<8x*6(p^@(NJbk&OZMD(0-Wvp10JqTZyYkLfX0?yauO&qw zWE@^cNf z)S2|}8(VOfUY(Ww*Pc;}!i`9GAL1NwIU|5Nl6h@qkofaoq%5;o8J-cZ@ybWC zY6%X!FGseWAl5U@Kvw?%2<85e8&;fF(SGT|BBH792>4G@zp_hXOz*v%HX(OOsRtwy zGZNCFk4U~HTdRAjD+Hw_E)2+$z%d@eRtWZ(9W7a1^P8h_;=WEsv!tQGqhk@$hCFJg zYO(LA6(=5T*BMY4k38F?i1XiqI9(0K(1B3yiKi`&m2=^Gss+QUZXXRvU7H zvQ=V7s3|+TpKY&HxxD;cKoq6|g@h0@5Ju8TCVsi?4>qUR+ZSNC+bEW0bm5@V`Ot3&;hGvK-X_K{N zIbjSCM^^5YaMzU`E)>gOSET$8VzxBtEOwM!lWm^5gESa%ozH9~5chO0Z*2^4_9IsZmFnOsgZZhl0gS z7JxSH#K7oBifddws#;i~{52#15F`S?fMj>>IGN8;T`e+`a@FcAvtH?H?USF)tT?s} zWiwVP&^IOZj{g8i?}w^jjC6F|QtCw0;w>x5_V~H+7R=}mb7y<0H5v*-4<#piAl`tw zw&W$Ygd$WrlTabgN?r`p>5HmX`+a*rE@X%-0U&pQB$)^D=b@*NpQpc-xwcibb`BLg zUQ^+=(;l;hj22+xBxjJ6k;MmM409(NQ$!VBMOUh-uLP%l8h^yEgRE@rG|Tm>_Y{;P zRq_TzL`u~)09J`T#zryIEzOHF)~i&FrJ0ll7%bD=K_zkT#Bc{vJAVi*e16$p5beE_ zpAqi)(P?swD;>PYVqCN#3)tI1`=J9KpYh7-y_Tg;$4^nF z%|i7zmEGsnAUadp>QJ|sU0lfncXAoMZ!KwGPzaez?b_D=z zImz5X!h%W2J+s!cZusRklOXZ(&e|*b#}LaBCO>S=%oc)Ge3>&990}qGNZ7a%+iauB zQ6eu-E7ig46T?0^b)%?S{{YXqw+&SSGi6adJ3)gW(=4ojjiitig!6Cs9@jAOI`O+I&baBSpb{R#BA)$`0 zHu`i&6+yvxSMG|dYy2-ueOpJTs8q3IQm3hia6Lu|kj$oY&d?7qC!t<0u)JHX&%Ox3 z!2||n+%p*3;?_~+s$krmdNj_KHYCuQkvkztR;uElFAELmKF)-wR4KwG~d8TKW~ z`lWPQfXty5TvBWK5RtL;iLYwY;!nnp4vR_}W|eD7=G7{esPz!}D&)9zrc+}Y%$~I> z$6+$t%nprfi)L!7gbaajqk_?sCJYH#Fd`Nw1Tz{_Rp&b+{Od{ix0+UO9X9-^`Au!6 zKTHr4BcCFAH!v-bL}j8h<1ix#vS8P(K}lTU1LalY9~Rr%3L5W#ZQj=Ikaen#`}~?~ zOci=0pDWg^?n|pMc?uRu>UM)$PpMbRMslD^`+7=-?Yd@tfXqaWf<8s>e9Oj7s^)>A z)mqj;L!ygyS$QFcpNC&esHi~fU@in(`gh}(*#Ss_Q9r&~J{WvGu<>S({{Ymt7nMfp ztxc(dp_;77A;`&X%HzBS1p6u6cx+o;Qm9C0Vn~4`K|bd``$&kHJar-cK0JfgG@1V4 z+Zpi83bm+uZD~4nv4kwuv5z7vahq`;0&+MgslFtD%Wo@vl-IMb#2*G#wyCGuGMCy& zAq7SxeAL;Q$Cgw(fB4LoW!ya@Zh9Shlt}Xi!bAXlB;;)~5s*kGcroqNFL!x)r7~PE z9l*04OO=(@F_lZVk&j{c+f|g=JXfU1jr7tEOUW@68F_+qS!@y0K2U)X2_<+x;T7#0 zi>+4D>?>T;M5gr|x0J{c+5Ix7aaI)f8Kxu<#F5iw-Sf4A`hCik!r}-%k&%OdWPzB> zTn~u8U-+ekZJm2-c`oWEil2lzZLY2^-(}{aPKznOucKDo?C{#S%dp#F#~x2$xgoSw zLsI!$crU@pOHsW|MvxVjv{gXACiD!IWkfv^Y1BypLN>=`1egnUDztp4h=1bLoKRTO%;dJcaUN#~9mrMioZvippynI(ZT4D^g{guygmx4T;Am zT4HR40Podg8$hOr3C~b`LesR0uDWF%s&1L8x}%}0SRyq)EPTOT(RaWHU}B@y&|OPJ zxN64a$y%OaZ_Gnarx0dH?~e1&S6k(0fxaZ`ZLfiOKd=0ny2~jXsh5#ubvHR2cG$eH zk494(RGiO8QK^Ly@cK8EP3HO_7$+n0s=L*I@XeQoblTysu2zz%G|BS!GNZ6ug*2VK zx?&{=mke{!yL(+J+J!1da1bE40ElN2ah5U%bMmZl*T(4ZyT_j-d{?@s!YzDM!=8>1 zGm9;j+$bp~nb|HR*-glrZZh+v<4%)n?LWvEBj8avN)N!EIq`Rfd_m`^t$#$*+2jUw zf&iq5h`^1=%km5jjA$h-Hv{BXThI}RXlZZbg4-! zb&5>E%rlm^-vFvP06LXbb!kO^;xDG8bT3iTX%E`Txt>81Bn*z4{XMH6 zrSU6QzvW)|a|^YVNpFnNVwO{*SXEolvo1NMRMTbG)uy7!b=M-tah4>+dSVbfyZ|qr zIPq4cVX59HhHXEGQPqt^QXIQ4t(Hgum;`Es?x$5$v;!xsb?PSCm|esIeJ_?Ek&@W? zOhFL@l1%o+(bGIF@waTj+W8liAGl|~NVx7juWBl!Sw^pG>)L37O{>l{$TY6^HDo}O zk$;y}#Nd~_ap9j4c%#9!EdKxwR-(6<%*X+Av6^5KRkrtrByEHWaR!~TkwUK4EKds? zWOjp`h$NnVgR3;%pQtXl*BDmFxWZ{Nowu<60A*SA%+f>p%KUa1wynmSbupz-t%yz` zsEMkZy%2a6UQ?959Q-QPbsO|uNTszZjI{SuV2;c(^zG4x>h2adZ5tPoNEsz=)hp9? zprkU%^#}kANyy;#`vOGuQaOK~zE(Ga;CUuVj9Y8`f`R#STB)5;Dh@qw0@5l$b+(}? zqI4ja9!RJvDJantiQtUfs|$6L0-HU%WocpzyHL5IN5%+66aG-mix&F0|W9wCUD2 z0;qB7XQfT4*C3eOHu_c3z-9!lWbRo@gsLLs8B)qri~=J#_W7hh91uGVJhjxi%M;Yg zQn=(Sb1XW+g*B>MByGHkLvtFBTOK^4MOh?Kn_wDf(G-M<9VHgf!heT;B-~wV)P;pl zGT6I0-UE4RRhjU)L|6>W2_e2fNeV_@U8>&O`J@g^WG`XtdrUx>la8o&Tx-jHi-zVn zhCd{ly~XUVk${)-8CN*iwknE7sE9n5-@3Iuac!&xYKyrl5Ju6s zF?RIC$EAG5B%A@?9UQmQ*5b-3&!AI~3R6Wv=??uxu)0PJDLmA7j8)_ZT}A0k-26e&?JZK<$0XZ@ zsZOd;aB5WtbM12Ih)QkR&Z?}`K?v=%?dx+{Y1U0ql|_5Smd?R6muyn@|#A%>EGo!C3AmR{IZ5DnzQwXDx@VMHfq|i@Cu+j zijjUHcuT|*MkCb-Fj1!9sS}w(FU3N zE{%vc2tnCIMDd!VOo0t^hgT)FebdT+e33$!giGKr>39pF<8UR66RmMSFp zRcmT@R@T4}pnzsGBpCAsRPD#f?6YL93TArPu(1H9)#JRvE7GSFK-!9Hf363)zUf&Y*>bE8C zRBlQIRw7Kds2^|xZ6y6b!0AKB_GQGa@se%a6Aska$Z9Fozv8El)&wJ#WpwmHks@1! zMsgi}_8)RWp!FmaP64*WSiD82{vS(SIbFBbM=hBlkOvSJI17Q3{+0fvYRhMJRjO|w z0-(eaGqebi#t+l3ru=tZYnp30n;R>S7N>9J5~^n9a{Zs{s)@NsMC0+?E|JtAZqMslLZ(mR=L|v(QRZ~sKU91oScB+pqJwc#=JwWYI7MDqQ%|I0Z>|Agd zo&kf7N2ef?M^W9;5AT2fC17m-cVmn3LI}oI{sHBk87P0vc4B4S3TZ&>r z%$WAgf}3tOgDIkI!BX}1X7MM%%`(o`%B2*iQqF*^RIuJz9mB5G`AJeF%9F5zi6rZ| z(bHAAO4U>?G$b@O0w{@$P6-esSQSBC#%?Md8g5zo=iGTk94Spg20Pc4_8L3X@o!;SAol+IcF4w2A zw(Kl~DMI^Hda_aEeX85NTEvwbeJ2s=J=ZuVxFC!X^^xbBJJNR9)EmcdVp%?gJZ~<| zQqaq@+sKACVz%M4lQ*502J8i=7n@xG($h| z*YNxI7ip+io%@QY2o8BAaspaYl`mu+$=8E5sz{QAMYJszYFxkPfx0;k{Cgb(0#if`*g~Av*boS z2P)PPuA11iwT$E04nbVpwy7s~w2=Eu!;;emVIZGqqdZT=j@g6pUyukcbvDs6!MZ|R z+B4K_HAM|2!t5aL+`t3~douwQ0D`g!Qt|D3iZ4Qq!mi)|!8jji$;1QO?kB2^{Y&sn zqO);r*%vtl6@lJgwkK5! zv5P8$xU4J7F%dEHs1n>05y2rFOK7&IL1cg@>}1FXzhZs8@;X6r%c$`1YVCDtcn%~mS$u|tJ^uh{{KL0n+)Q;X z>17u@#|r~W9i#1n-4P!FEGqI~E-g2I~As2RbKM0?2GexIk%o~mz&5Y)oP z1QR{PnIE=#rg}|dhxuRQzJ$y6luXht9{q(|b8O+(l#iyG%z=X`v?Wk%yRUBGri3Cw zN%s^Lur+;J;?9M|I|8j;QHTY$%n6(VL=5m}+6?tn-n}zyYQXg5VMqyIq>6O*zE5I_DyZ}EpKNe>Y*p9TF>@7`vO1};+iDZi;QbLAL~=Xvoi-9f zqNLa~t;j+?Ru!(JQs6Gn`H?uCn@N=$n==u>iJSq%%XVrbeZt6N?;?NS{rh!bSl@)Z zlgTd(3qW`?=68oaV(CiDNV%4$T)O6MPR`Y~ZMfT?O97Tq#X%;)*3GAZwuH>h1(Xrs zoxMe-=W^hTkG^LdpRxM$B*|fKRaa$AjUx=RKX#I1{{U$}+okJa)_DW71779%jxVu1 zW&Kq2{{YfIUfc4cf#1SvT!z~w2~|&nkrqnEGBRWGeWL9iLqxN!*(#$@-NyuT%&hxF@ z*2<0w`y)vM6@c+FZnxM>S|uixRY&qAV8qQgF)eP~E&_D&HwMB{DkJ32q} zAQRp)KGD|OEmr-&@@g{-nB61qpYQ#8gs z0sy%zz+eN?Uy612p=8L5v78m}!3Io;+5qlI=iWNAZy$2Jj~JxKHVc6kmo8?uHbSx> z#%v!qMU0o0t30pM+KIENOp1+Yl5p?R7+Mu@+wOnl8NoCr=fJ_2*lLKS9vDQ|JZwqs=&n!kCiT`nI)UT>#f^-ilO2q!_C;AypanyX_-s6v`~D z9fe8=QU>cfSJzgwu4ynKS&I+PJdW91la2@=$8+{4k>q|s4~**n}%V>#ljv* zT8>b{Vb5dn*mjx0RrMRH`3%DqUhj~p5+Wc1@x{igWkqz$8p(5KK>Avn{{R#bGq$pk z>HwY8$7P%o>e9MdsY&Z!FiOnkJa}$#=2dD6hE27vfW!h_MXE;39 zSb7W@FrQ`wOgz2iAXSK9ic*D3hSoUrZ=n}F_Ua`E{6QJcLk;}w^U%*AtiIk4G) z-Q6^{{{T2pTO6*vH*8}` zk7E`>5S%4NQ7CV;tSB5+0F&$v-1R|H=LPU^)9QJ3tVQYo(16PXS)Igo3}ZN zC3C|XO}#6Gb*#%@)#!p@K!80_JcnG#1_uYJ?){atHU1s6U|el`_HH4w4MEAZ(c6m} zYh>CB%|uq$)UKx}?3yTiH7mtm2bMBy4nLDp`|a)BqDA0UOTo z5PCWP0NZXhG6+^yLA#h^Bpt-&WT!9;13gwf&xaegNStYYNFzIQ9>sEtd2VBG-4M#l zs{X8^tfwU^8n7}A=)@+!%D^N13K0r?we{~9={8!rTG~?bO~Rnuq5>2$P%6Q~qmO4L z2{5On3(Yj58=Hx0vogkHNX)|!7?31-i0m=bCo9dJ7fa-AmLa{dTzdh}tzuQIN)UWfd1X{&&S=XTe-C~tVdzLx$)|U z>Mfi;mFnn6kkkmn0pUkY;brNO-7+x}{xnqlMF}mvE8!-id!txudsECFT}|Nb1taBQ zgC>|A&vEoKG`s3`R<%c@O4D5NGRI_+KPs`@1j+5+s^!$aZfsmL66{PTKZc0&}CjYf*6Hwwp!(>zvZBR3RhZOJK@1cb z1%kmUHm{`Y3Rz@HAlG8vpOB({XgH0zY>;L?+@IV)JdE*gS9v9x>D)fkXJpm+^ejS5 zc20*Qh{W8Ile=!d1oPmn%!~@mi68A%AVpP9RM+KE@VnxEr{MZmmlf?5tlqklx|=dn zs|8V)Ve~l+smunzH~?VO>bnbc8@)1rZq1I<1Ck)b&sEQ5t>9-_mea)Ts`9OktuQ&3 zc-Ftp=vt8`eBp$IPqFlGNN^>`j*}6|4l;uvxB+ZCxxja2#Z|DjqxfoyzIvl7asiGbaS@RXB#zxNaCN*LN#u6!*P7!d zq0XoppV62Xc3Dk~rlmI6AWC{863#3p%3}j8op~H~EN9}8i%xO^zplNdT{_zC{lz)~ z1e8iDq%ieBDzzF=`Flf+#5Nc~CT=cNS}K6V5ta)QxWLR}Po@U)FnU%fygc#`c5F?- zh*V`*-oC(WE+S0|NjD*I{9E#}kTC`06hvdG$gz&w$N;VguOPf~nsv{NnkJP(+Unke zT-RXASrno*9jUq|3j#$K+Q$TsR&tH03T$bBNOJ>{6mAkHypsfv%Onm@Rtr<${>1U? zH1VG~!7Z{3*qOPRYnfsAO3D@PRMjdu%k2)PB^xvF1lZzQ4m_P{{X~~ z;@t;O(URBy08+^mot*_;>n4;`ri=VqZMlQYZCt}KA-__$rAvj~Qv?Lv5V(>I$OIXf z1mJQ9M(MsiY3Ok!)GCx#R8lKb2(@Xt6{j_5p#-y1AcDjKOH`?3 z_X|kM1!nnzgWJ3nUU1QTNRjpQI9CgqZm-aES8>z ziy=)LWyYIqUlJD0#6AfSm$hN8T528~@dY0d>38Al7h+1EGNeB6`kd=q+7~g(<@%=*t**LR@mowX1lPT7G3p37?Nc) zsmij`?TgYRlv?C)pZ)>u)Qj#Ysw6#E;r{^mhIvXJKB6lqdWtExqz%W@>2{Ud zyp`f4fds|vHoCVp=~4uMWadEbU>@H{Fni?m7n!Df9r15%(&N?i`rF7{r-=1AZDvf& z+I#Atd52k)RZ_jn5G6JagW|-12Ha&t+I7_vKt14J7x{Ktny0Pc6l|h9CneuQ?!$c1=NW+0ChLkFcyW4@-5g(>k@25J@rA~zUgr7gJ)Jt> z&|;N0P~EfwJj7TJRFyysk_3ujlyoZF#1_Q)Dha42Nst;zfDD<1!9PgJo|fM%@NEkl zU2Dx3jmNjhGs~*lccT*#fo)?sCMhgr7sXY#Id-lpI8F*Gwqi*)4=+d`JC3rxq1d=Cn9LG5VU{ACN0q-L) z+`k)#Gsg@p?RR#~!eO%*GWv{ZiW;Yu>J*0}(>}qGqi&OO+LaxFad`a5i-!Y}8gqDm zNZnHAu%$w(n$*L)HAY0+=GFdY0st=%U~L8rN_|p|ww`o_L%N+hjIwzy8Avhr1Oh;r z?hi(P(rb3oM%`Od2HnUp8tkJc#wufsD@S9TTbq)TCUb%6GyVxqNeHIf1PR%olE40| z?i1r#qowJF?I^R+6zZ);*xr#_X2M|(YPS4l&@a~eftma5$Ri_RiG0{;G=FCO)P$48n34Z)= zyi@QB$S;UA+Lo=dp}2}_(Ys;8l0Jd~JZ2^df%dd7A5>a2X%dd0u>jx#epB|5_x&Xi z(YlKb*4qC7Wo(?9*7|<^y<%0SNHt{mKU{$GF8-!QKYJhPYb$2)Q||=(IKa87*QXX+7?!pmMv8%9p(0hf=npF(^Ed*nB>L; zWV-$s&c-x%kvoUSy=SW`*ICT2$Lz7^tK+yUCQR-EN7TLn>vl>!PRUsftBtnO6m%69 zy8Pykk2cGw-D%qW(ELl(^QgTyCvXKxS4bqQ078W$EevK)Rll6Z?e{5Cc_3gAz(h|O zC*KEpIxLKG34|`k z;iGN#lYu{-5AeIj)qF)#=SaS{LvKY1sjNX@3=2B%fR^}rmpWf@)r>BEr>rr%o;mWcP^ zWA6|<#t7&a7s6euXF!Fm4D`!-OArWnLNWl4SFj+&j;Ze$+S}5#rCFzYu_Fg* zfB=Kv21z&=j*NK!0FzklO?{+{`(Rl!fZb!z;XOh)ndBb$+~Cz0J{hmyx2mQ1scUqyZQB8$rvRGDmvqGhr) z>Z0i)m?-v6TRsTabWKB7tx}(x6v{L%YEr5f%-9@3BXDL_G75+c3>B&qaZxH8oOOe>W2IjGsWVXo4d9iUUn02R352_0> zNux0A%(sxgwp?z(_+)5O7h0aNO_H5`jJ|9=Kvjrc#sh9Xrk$mwR1pA%a@0JQqMK^W z_U2D;VTi^6JSpRo)loC5;zbODcG+0w`J1^+Xz=T6UD!+_3Y5ATc{i5mKQ7l`$okX8q0@PzC4)t>TKc zX(f$G3jlTy$~`ckda5qscQ#ZLB=j~P8T_D&wziL#5%mrqlQ}k3B_y%CyswEqJXfH$ zlBB;_j{D4s)s8N(t)aH_iamH_RW9vU#2R?glE%GlsLEIrl7yDwI5CnG!2t{%q<~84 zcT{cF(z}9cU>;#)}`1y-sdkpuEGp`xB!>nLEPn5lpLFL*^+C-^l zp2rwLc&3{^=?{PULr!{y)h>k5{I~xA;qO&cw69IccBD4|$JMkT+5pZ35Tn`yNuH(a zHmoWC01N^M{LPXCfydMVKcVWZ;$U^uwSGg+jV8k*ti`A@24Ngn@vNY@PNOgykfv+O zA_TXcM?_IsRcw=jHAG$i02-rtb!A1{$@AWu0Cy{$g{t{xBa(`yNelr55C=fCl%+|k z7EYbk&SBxXS!V)=cccGahq?s+m= zcPZI=KUHDa%-NY-dRN_rj@ZSTR$}Cys-!5}Pou{7MQIy!Op}A-;C~4C^Fp?J>i{g+c{^E`f;>PSqw_K9dl6BdT%o zqa~%zH~#0z@mqP;SmU=g_8~e;r6n1TG89albQ7R7(t5;~?46ZYmF>^V+rzeXsoC4o zP*|-soO=$#>}Cg4eU{o(5QY!}%yA@Vob$o|0KZr|_s5C*TT<mxIJJa&mEj>h(UV~VnF=<>WlZ} zy-C)Fqg4~#fHRRN{f@fMn+LW=9Bop0_UcXMb9Oln5q++$Xc)*}mv2zZVCpb2A}h^0 z<7YL+R92$<;fqc@N&I5+8vY34i{6c`RJZ;yskIZ-L`fixi~t!el0Z2kW7yLkJF^v3 z8G*PCOd)v#bFcxU6w4e z^NGVEXi81nnwGIb_M&PFXzm$G)H}B&AThKI02pP8@Fsmi4LU8TrD0CDshmh2%h;GO z2<9hu_v%|=p*9DOHyQro^1`EdLB_VF!}$ijys9?kV_@sgzcc7cTdbUD?;1Zb^oG=c zl&Z`9*l(b?WprIdYg^lk3PEjYpjLK(SSsyU3UXEyHsCgb2POvHKSZr!{#pfaPFiG$ z#4#C@*zJal7zd&Ei@J9n#rJO7cC!u0^1Wr9-oG-ke1{>zi;vl}8JV9#^P(>sFC&sr z3BqVwke^P&Y9}bYVti-f_j+{2W(d^BsX-@jZOROgFn^Y04aCOKdikwhjblx{Dslvm z-v=Cf$dT=kp8o*XK0)hGH1<9Ll5Gaq+IG3cqj+XnnJY}uYzp_JpcMv19Mjhu@+D=j zY70V0^J&qwY0$Df8LQaU)9KT*^eQ5PqGbsa=_j6KlRScX>Jr(dKU@+75P2VF?f2xL z*EY+i{{Tt9(~HfR`4mqJ_r`7Df9iFO!I)F@c5?WV<5^8`m(>kzhfti6LDu^Om~tOj z;DTz}AQNceXGX5iF5voz&v4k82aJrwPrnn^`Z|S{>1t33Ia56SGNXoYM@_ZAqX(6IG{B31OPwoFJ~LiO?dh(bu%@}GiyXQ`{!q>9i1?e1gW>A>jH z*jrR$vGqUr_WJwx?bgdA&EjfYRz_=>WY^iWxA|(K3#i%He{fw7Qo9&vjlsknerd zl}Br0=8S~pt(7oBu8Og-Hy98kRRjR+=#rwMHlS_&)J&8!YX1P@7bb$sJB2Fko+!fI58F@|2Pj^DUI z*%{dj%j{`PR2=lh7T!@rUHgZ=2bZv0AXk9 zc{s@)*!uNqU!~ya*jiwAH7HoMaT_YRtBI1(*rSYF0!8;EbFFPrv=*MOo-B!>lZb6O z+|-EI@~8efwJ>~F{ub2L6FCTj&%)IbFMe z+do4BGTk=5MrE2JHlxdOTw0?B!6W35vG{n^0@D;LN_?JNX6IW0H{DudB8;X@$bcl+ zNR~tb1ZJes;++pqt)bf2N+Ii0R0Wlo!B3d028Kea+ew~Q0D}r1F1-9Mp0sLH3s$7; z1PKxWsevGE=008KJM@;}8s^sv!}le-G{3sbn$2QbxLS&ah*SJA^2<2+S{*$s00e?(4+~wj3ku+mLWG^H zLv7pxWXHS+ZgNN+L-vOH%=MN|=3|;tIQ|4zX9hb_fz@t%(ZnPwJPX-?BniwZcTrE| zKB}wA{DI*g0$S>}2TjxK6|7J@0!OEGpd%rhG}tT#A_TzdCyA~r+}{5HiJ+QA;tT+G z5`I#7h6InPGtWiMQMa)jsIW2&A1tEEamkKLlCxNB-iq6Tf`=LP>)E$@uL1@M*oW-D z?Nu7S1h1ptY}P4xEk|kFQ0?8xLLx&cB1r}|f)8=lUL3P(*G*C5Z8ImBl5o6xdWX<; zg&KYS*|@laD)J6Y)n(Ha%Q_XqQei6z8MSB{d=J*)Aqj~h@`9>E#|WwLzlv(rwA1O` z+?FmkgSlIAEX0!xH$j3_j#p_Mj-=d+jYHC`8)Z_Yh6FGmFd)n^-6Whw2h*c=JA-Wv ziHKZ<2CmZ>M9QXQVwpBkR}rYQuH%J)qwf=4)MOM^KvA~`AG}_(W}rGYAA|An*afVNobaqB($-> z#D3t)&7$#q69e*pU9p`!-gk3jZ#NolvbIvrip%K*#E~eRXn_faXGrxS7^)9PdF2C- zmWRX*TTs+|C3M#6P4DV6nOxP>X)9RQb+=n(nZ;RA0&KDtM!6zzugU;U&a}&szyy!-B41dN z^TJj?052{zyQ{U-%NtarpuW+%RnF8_Kbe)u?+O8E0CXe7^+SRpqnZZ!)mm|ZI4LAQyYn3O7bV5+5?}&{s7uNbF?-|F7$haOp4&H$Ynmcr+rFqys*dUOX)g~XYnND*VRp-%p zIUfE~?aG7k4d%MHZu$jlns&}vfN`Hw7ML-$NF!?YSjp->siV`YP&hAV~O4D3H1!U9b~hMM1?mQ2Af$Q4j8UkF>f8FLR*U{h2PpEgHi>t z0!IzTnl7l}Dq3GtTPk+xOl%a~KH?a@+rlaxwA1y7dEk6b;rGPp9v@uCA%S~ z9riK_Iq7npY0f{1wkzwK>MLcWSkR?$PVN5yiCKVm*x-*aEQ#8pOKv_|pr%6lSn9Z? zMx{ofT_Ky90t&YPZOG3MA!9MgXS^BNsf6V@jLdrs%k44ii_XUq^|t0+Mnn z$Zkoq%)xoWDDFp5bkLuUYAz2u{6O&iOT5lHrKM(vcH+!6% zXX_$)9DRDJ{TGONJ0A(%Q!Z^Ru6C_Sy5=z5Mn4K987(su<&0o;@5CJ;d>J))7(UGl zVs0-}cB%0{!~XyZYBzN2>Ii94tQnkdW?@i*SdhJxsVa&Jne@RS02^H`l82Q|kD771 zMh-?nz|2S>k8Ya1b?ZAHa**Z$t=&SCbR{k@`m>>P=} z6NE^wk}D~}plMzd(=^(ac9kv??$Y9~qtd&>3Uj}4b>6G#N`Z#bz^d(a1W38l>!rF> zbF#S^?lBlDdyym+BW!^u9aKd`t^1bmJu~FyE4O59I#^R@$BXrBlu7WxL?cRpJR5D8 z{)Xe5QBfO2Y?&85Vv2*uMEIvw(uR?!Xd11dp;n@zk_coWK{VQvOBo~JX$rw^?5AX81@coSqKSM!Lj4~xL003U0Z%6<@U;y3;#^C^i)uU%# zve=87s8wnXN7oV#F(N0A)REP2+Gt&IYl2`K3pB;5wgkIrSJYLqBrxtpV-c}oN(1t) z+Yoz&P?X67YzqPe+;kB}kj$@%d|`QHwN8Oh+O0Q2${8uEEU2lnkpTe&$n|eA<`QI% zk$(i1YPZ`$qlXHh$jCW9{-MMibKW6X=7;bjHloP)erpc1J-{*ugMvw6i##U8Nh9&4-QVhw%C3UJQRdy`Wl`4(Y z>QX4e0@NQc%&iKgvgz$;X#&8KNe6b&FaQLPn>&D#2+WR*IF@y-%V_Azd~-)q*2>2r zOTSj&)3}l4gR;e{*b|jp{l0uj@zMJ7d)f}8ir+jK@>4tvFDTp6x~W`Ms@1%@fRb6% zAT6X9;r3(&zFcu#ZMU6HjVtTAHEyxA6SrxW zW|k@p`c6awKPgq6zy~XY30|ElI13r#G0Fab;|Dky=~DA^RI#;d_Z{Z8$laghxLnZJ z%l*d1xCc`vGQnXcI~lVjaT~9ejW*kA@jR-~i7GTAg)ElkJXKEXR8sb|ZJiNHsVrEQ z3*HiB<*-5Q#C4$AlX5H305M&=jFAm8ID_^2cj~8ctSb`Go=UNiWz;z3RqWSdjA@Jz zl}k-D*hXeRDJt-$%d7&rM2J6<@``21Z;Lnj&b6joY1Em#rFQh6oWz~8+$jXa892_| zSDr1juV~&?Wd)tpl!$_W0+HN-Gsq$jw^tjmc20MX;26%N*X^xN&D(LT*{_`Za|-JE z_U6cV;X5g}MaCg0zOOt?r?A>#8)+AlUyD8uv|k7KW{$mdK(4B&NRKw1Haky}2rK5- zV5_}`Z5s>pi^>4cHnz=iKkWL^aytdm0y-MJjDgS*p~i zRo-?E% z?3R-I_?|qbaIAKmdPHVny#_oGb+{7VKp4@Dv_}Xc2P$d+Rh7~1Ft?REXkAg(ivFID1kIhI87JRgP?m|wo88x>J$Vms<9Oa zXm{8Pu__MG6rd>VWRg>HnCi_MaiMniK4em(iBlDoeE729W#XUeUb4AXK5+t9(9%B;6Xue*x)$nCjdQQ_!r_0)&7#&JK9uA zbl5nnQlKS)I8Camq^RYVLax;0^yBct@hjd`H0gvyk~t*F5O*;wU|_@oa~%=)Y>aY&v(cOG#|kUS+npJ5k@UWxy$&>|)djI&YutAVlMFf%g>?+$u&!rThc& zQs&~$;=SzwPLgfhJjhgH+Z$y^J6RWa$Z5-MlM;)j(iJ?->>8UC$>qI7{IFU{PzTUK zfzT4e$Be4to5!p}8n4B!Vw|b*FLC;KQzP0|+p_w6H|3sZ~oT?OssX~v?4@I zJUOi`&b6vjN1CHyrB$jUQK?9-+HXx1gR^n@p-Tt(fCs2rFNbM33lc_RGD<)u z0Gyw0bJd6G?ADtd$zV~AduL;YUxU@~Z>}S_%!yWTV?%bv3-Qg|Bdxm5o-IkMLVT$TWPWHq z-<7tJ{{ZSZ=n+2^$*`;%Msti6J_nyalUuep?VWMQ8<^nKaZwnqFf0XWq&Fgf2@)#H zXOR^)zFgiFyi2sFWqG=(6s2kg7$#Xx?Zb6UhbI%Y#F4xLS}vJV=V6F+6&eOa>}C<| z9`k~8(|04q{eP_OZ#LJAHU%EaemGXx^j26(^pyyUmm73BL-hl%%mVj`C_NdsP|QIQ zdBMDSs@zxq008k#F;WiUS{YbW`2YCTu2e@OfX;pTTjR*K_xgRWsE(r(-Wo^fSHlB}Nt+riJK7~+?4H4>|0QwUm zLw$Pq@+S_W-<~<(m{i?0wQgrXy>Zqt6hkK760m9uZAhC9$K8_u0Mab5XxebTtQ1-k z1!$UHitsPQ8yyPH?b`7uvLo)O8kqq?Z`}lr7!X{KN6P_B^h)PKuU?xqux#uCS9d2W z0TDbHAjHX>^+8#G>Fu+va2778u?+H~A&~*Q3fyVDW>3~lubAWQF%CqMQ9*takXFzRlM^xA^dDAhdGD3vLNa>}3*%UKVdP0@<%!Gf*OJI@8` z6xnA z>x8E7VKF3ZM80yb#orL=_SZ#h$*E45I}{e3p$$!=a^RD^E=U*yi0a$;Wu&zyG;2mO zGbh!6a7Z15XWx_6?q>RN&0XOqoO;%Rw%2moSYrx$dCc1 z#Z?oki1GI2e-0>oV6EeCik=wOFDb3ErNuGHV1aANC8Kc|n2Z^W7#2PKph`*H5m3Z} z1WpG7CnT83&mD1-2gbdC-X-Q{z{&6oqZx%&jzDU*2va)wTEBOY#BMM}j?-q3Fma>H zLs0(!wgfx?Y(SI0rz^+L={ncNT5D9bN*4%5*J6Cd8+Oy$K?ggeXpSmQiCzJAdGj;1ZH6K_3Nqh+KQTeC(MNkd7eGLuj}p63(KONBF7GEDXek)(nq!y zIFb9A*~nN@T!@NGz(;XpvMnRr5)w*5QBgAFUb#}?s-+8u6zQxMV4ieNMoD7ZLy>7=j3%2Si;BbCc{%Rpl0Kv!!g9+T!l}BXcp<`K1eU zmSosc#GHOK_7)%o#5r<#hdqIDS#TSUWJqtawjIW(+8xyjG*umTC@hZ3uAyOff=mFO zvm_Ccr)lbG@!_YXgI=7360x14Kp<`aoSXw9ay>v0chFipCyT9Z{{Uy*8lQLOw3f&) zqh>WSQN(fJio>nRb~n;KM+{4_4@GJ42gb{Lok&$quVQLB{{W<#EWOJvvYjcd_=c5Ldq-xaQNopY zkQvDU4nf<=h#sXg>IbN`ugFcFTB`b1BP0739kNg9)yVn%1Iw$A1M@9cmF%wpHb}{y z$W%hVw3yyim|Ong>`B$ejyBs5B0K1AIksv|cQ+50J!Fah*q%YS9JZ&|Sk^fnB~Da% zH+uUQq$ln&RB2lqNjC6VdW!904agy z$OVFqB_u}TH$RCf(n^(Rm1R~Uc|R!PIfmrV80{S(IYy4abAKjrOn=4vhi2tjR!Lmk zM<-cJL}eO2I}NQ)#}L111Ya8yBg&*9gMbz9v5FFZ`hYN;fOYAK{+ zV*$Ch78#I4pGZ;M$AtBt#aXrO6d;KNo^i;QJ77qIfOCn*MTN$;6--?F5xm#B&wkcm zQ~h$Uhck&E8cSE6M$ny_h1up!^&?pD(T60hXK_{<32qzDhVB#1^W>na0W!X=yeI z#m2I6#-!KPFt9;Vx>-E*Gn(<8gFsT8R971X6#;Ddw_8`JwW?a7A{7e2m@T_;Ja!9@ z+Irb*ZB4e-k+4ke;iO;!CODFCV+4$KW0qR;S8LsuuX8;$sjK`ks;FZLV$WN{y^C*; zzfjBl+Ijhmf~=b%FJiwa48Ebq$U8ibBZv8s@sGq6d_m&-jVRhH(xv7qRQakattD1w zGqsYbh(j41yISxmwM!#+s)$(%H^^VdkE--%kx5M@O(($LzB??6yC! zONfyU#xy8xnv;>^#Yk)J6;XHGJ(N(F<>Rk>B-MO5cc$Ij(-iIK2TIhHw-P;jYOyd_ zvleIo6%iQ7a--qrt72a22FEJRB1su&f=qD-7-5nRO-)4~k2HHj1j95I2=ol|BZv&o zv4vQWtM8tL4eJ9h;c*yxYC~u{C^zg?QAJfmR7%I<2ZL|5EgFp*Ym;4V(V4e4;u@nu zs4UD;M3NMk91M{xv~>RfE|XHEgi;6yW5Y2M5+Yk{9srZcGZeq1vW$OIU1XIxHd9(P zZD&v-wr(}`m94lHlO(c-%AlG$PqZDyITL+5{tNfMymR6Ejc3E6^461YDZpZmL12vo zu|TBf@~H}Ubyn!q+MbSUu!1Usm6?U80QVt@Q~G;#a=3qy60x1lg5P5yiolO?UR5bh zl!nU>{{R!h@F6gQ!vy0`q9FD5IBhDRx%W?;XQ5eMSccSsm$9_Ic$FCdaMBWksxRduSHd^y{_LY{d`w5wC zH6kg;1V2+OJkqL@Jr|?M>MuWKP`Z|-s_GV2&v9Ln*wa%^nM5FjB_4MG%*yfu&&jaj zNa&rdZ8p2sdMFJ=au~^pAUC9l8(0}CCK^FJ9;BFWj~HeduyUf;*n{|u{oy-{*S$>J zEKRh85TugEJ;`-g>UzE;U_+-ucQaW>rgC% z=`Ni&r>WI#f~$H4(y}3d8%MSYa=`q=ksWJ%tnsrhwbObp4Di2EH-ksD##(+|AWV~V zknCSJUwzpJD7glWQPpuzfc%v@iu`@>f5g2GuZgPO>yB8cK_Gx!pmZfdi3UJ4&`DJQ z?qE+$TG$mUQT#P6w9qjN$OVd@Q8SYfJa;1e*6-Myg+DnSesB&CJm(43=^N)M9pw zFzD`|MwKNLkdkxik8%zm3_ytX=6c^-csXfj$7VdlfOE8WT`y^hD0M{@ zGb2S*LR3G?mF0eR7l5uSQM9Q-wPYJzg6@ecf<9w7oujl2M;#xxYIFfarpyT^90@W; z2e~Kp>VSt_?mSN1@qK5gZ8hc|6Q{pAi~^!Nu8*Ll8_&db=gK@LP1vzoc0s-z44FJK zG6))G*ZgIoUozCF;-zYVJzvE;n3Vxgg&UZlcV$Ig#Hs*U7FG3M2H%RN-~b#EKBbYE zgAv?hawKL!CH2xe_X>mlHH++foNHm>SyV>==`$R`n`W%K$mpvTn7*)S8-Lzyyw6a3 z^IvKwQB`W%(g3&gN0*b2Ez&!cBpu>JG??0bFktmBN6`o!9?rpKbmVp@0P8789Nj5A7j>K~SD3cHuI3J|PO0KiZhE8LR{{Yj> zqf^*Z)#UFDgVgguCDk+C#tqj?vA*kFkv);qg;4s38z2!^7Jj>PM#ae3%W$w%G7<^E zFciSVdVz+(Dj2}h)WyOEpz1=I$&f}=oX6$Dp5{8O?;y551--ULU9B}%+VOW+>AM!p zvI$oigi8xQr(#FZuu>g45}S3fchMmjZ`JE)Trp7Z%CcJcWY}sH^^Hn}-D{2IX$7Rq zNjEQ;O2*O)F6AuVmZ(BOj)ZD{86vx1C2B&VfC99YAVFb-KQNFdf&e`@8bQ3VjD~*A$;<+V}kHEIVMv#cpjuXZ`1K=xdLYTd)QqqA9 zP%#A3Raf&GR((zsK_r+sU=$3@iguJm6H>ymJu<|u(sylRB4i1PkL4yJ4^~NsLc?&{ zdYjtpigc`Qy3WeR+3>V=`o^2FuXTvTMyO=ttw(lo#)}yR;U?3t2sgnj=~s2@P4d(A zsYdk(3j=67dqYgfc9V>Cw)W6cq-i4qF&^ZDBmo>A8e{3tQ7rEY+Sr9wqQBewmlUTv z%UJmRIb(69J5c1oVN$*k8hZ+8IsTdDCps9INi$Uzx%h$O4+_`1rEvOv1xpkWJBv2a z>sH)J*v+|t1hjy$oOKe@MYJ{9t6bnPkOX3889)Gu8J-D`Xw-Q%T+TI2JCpvVP+=N# z5S-mrggH>9cD1OA+py9zU=4j|wdeg}s>+*&4l9hCVu(lsPrjw7YJ*3zv|9BkBGaW* zJvmlgtn5KxunA(U&=rUbG60ctXK!C(wa8K+#>YORmKcnYfCgjUC!m%|t2}e^D-Rdi`tHeDK^`jn`Au!RGIFpuf<;!uJp6`YPw+Z zlDT(bQEG0LDiOAm3dHYp`ILbY(0W(3(e$szB~x3C+#&nO+#`-75(g0-X!6N%CRW_u z>fDbY)Q3;8YV!9dt}$?M>L)T%B-*#>c1i~+AdBmSoEYM=T zQuKgC^OTB#U?Xk_Lb+XyNQETr1Q2i>^*d`Tlnqw9?4HSx+kxP)F`i5x(>*OZ>tayv zd~x3&vR@=~5w^dUk|jHZ;t^rDhd@>=9g@|ww`RTc?+OGkXuJeJ+@&jWp7=R%EKcpqfauRFsXyl+$EcB(Z?K3un`=cU!f3%!(RIQ&2f1$=pFO z2^pSFR00YbFJ5F6l$(=Y?Qh@moI*KRQ)LDCmxwKC3J6|_qQ8i^s3{g>utB#(rUI*zM7}o=s~K2&RZS+94=hw_ zfk^dvbiqI6kx_|K2mp>b1dMb?(|C5C$89&J>%_O-QH8sTMUzP-D9$Sl;q~EO<1!+b zt-?tTx=bU@vLs3_p!&&4qCbtd*1Fc8soLqb>XTYpY7_iMs7s+O!os%2B1>Qp3`E-x z59stRTBW+Wtxd9{Xd8}r*)b3VnE+=UGcRL$&X*&HwkBn{9fr@kuZtd=B|=*dd=zi^ z9Vlw5!%FZCfUC}MqRF2a#RVGU=IQbt97zg zW<_FR0}><+z?}ZvN#q`m+nvD5v6x#L1w7nJ8@3Yd!z5;gBu8xhF%h+q6~_fzlIjCd zh@Ei7R8W5*HCGXzN4=|eXlhi3$X(E45COJFEf5bm`L{{vrJcf z0339X-D%nRX7V3YP(mpT%u3Z%m*5PQ=VQcyw5}~K>k1b%n1_?M%z@nS6vwbU3i~)qf&9m?#AR> zF?Zy@5_nqUSG=|q>Zzxd+7<(rDTC@}YLNjXZCn}LO7#a+x3pr+DQRCyD!OE3Z5qAFBY%^D zwT};K7Oz(H>P=o{wzVV@0A<`1mWE}O0suaf6Ch5v)pYlvxoG;PXLAx^V4TO&N9Hh3 z1E_`9iCO*^oYCA-=}m6es-05~%FXyB7^4m70n$Gk%9(>@Nm4*NncHg20tB7} z4|6$^BsbEvZk5G%R=clz1*NL0xTq<)O>JX#Z~n^LQO#?d1{!%9j?;l(^v_6-+4dY5 zO}3)hA91?fg-u6DYI>F1ZBq>a03^l-r0z07Wnx1syM^7iX)RAzPaxB)O&ej3IR*w# zd}T?JK#3h1HJwIWcbOZx%q$Y_`l9$4e;|VuP;%BnAuM?W+k~bD*D~Y0(xM?KwrDM( zst~IU0@B~i{2fOWSRhfky#NN31%#aXgL9RVNa=^+t<@7=vjhkNg;D1-I92Yydl1K^W9>+ABR47>TLz{-^sYKx;+hH%3Qc{Km)g9N@%G`a+fS)UB_5>i zP)KMz$;ckiCOh?Q+*EHZsDJ{nkKFrl_5SnKSou9AGb|&;jjuCYY8Vj<21K;atnl`4 z+{Npw+?d@|RvdMOb+eFBrN(8)TQFfA7ZeRyP93znIJI34qg8KHqWN_yQ;=%{&cc}+ zb}$6(VJRpHRv>fdigh~LPNr?ZE=iI~E5TvT(hel%Fbtiu(7lYWGtQaVPh&a!X!`cI z9$bR@($5yAV%nl&NZ?24K8X}0#E%u2Ouj2{C60azt*Wq55Yo^<2?xZl>SPIq6 zCRGKR0I4jl((Jh`KvpmZLG{lURA7d#)!I*}r7}+A1855aXeDHU8DjyY>M6Y8$msV@ zq{mpd!szh~=Odcj$*;2=wXVqI*b^>&Wax}B4l1}UeLF@y9*!s~Muq&yh&~AD>!u~v zlTG*AgeS~$S?E(y1S>NzriINyygM0!p;w^PynTIe`xNH% z;l;c)_mY^-2b$)2rpd6Qw6(0Gg9@+`8{+WSBq>)G#U4C%+)$kykcF09nIW-Y1GA_< zAZorEOS)mS>If;TrBC^eSddKYQpJcM#JOOKeO!q4uZp!w?^OkMGsqwalHL1>7zgEp z?~P7ru{Lk6rysM(^GoZRXQ-=*+1U$`B1@4YCw|&Y*MwXa-)y7TD(eEOANU^`^9WwwaK z^R$_45r8}Nv3{Z1bX{?^bIqe3-^ix6-ZPfhSk%tEpEPmoij68ANVV~!utyvw42I;i z&)rSng8DeEuOfYEq-azwE1fMU(rbFO!m}#UO0e zxl>xX7BbmpFC6fuIXTRBh?qDBsul7pNpDnWWt1!*3%&#aLFma9W5G{^=lSG zC>UTEA4wkY43UqdW38X*^`rJKZHM_4c}-bOlhk8z>9PwPS&lz_a$RklSO495T{J?!B zSC3(n_b06V$&X?B#}j3r*-B19mFWymC$KW4SkUtu1D9m!I|LQZ=l zu*V``jv&~YEqb@2*0nL|0-z)|;=BMM@XErORE+POZZX$BTkBQn*FdwiTNwn500vLW z(ExqG9@A}uDo(_}x0N2fi*HYw;?&7E50_t*we*pp)qP6Ew2wX$irX#7V$KqP8)l0N zY;bwPLhK6ndL26pns)VRp;j>Pp_KX1&LHhA4z0BIskn$D54V0Hxi(h1Qbk?}8LnX>yI z3sxj5tB6@l+>(7Xdu#g#nv-DTzPSq=94OC|fb;CKMu_nWh^i`Vp`<;vtvd^Qs=MC~ z5fzFm(}WPv!(#vlQ8E@(s3WRo_g|=O>Ri&HP4?g`U>xLCq47A)?65$ylxb19~Wn4m#(|(|3qJ85OaU6NmZSdtibrOXe zd!;D~>ne#*jtmpDG}A(*<;gHifT}UnYH8IhswGQdARH?YAVgr3`Jw>806_O|^-qyB zQL-hmw1aVW+P1_|juKO9YkI!!)`TDpt6&48(3BYLy!&*SB&^ z7*&!)ZVY58RySu-(xVnij2E%noWS5<#FBdtVhABF)_YpVCbWA_Y`-Kt1oF2w$0kXI zu(kG2t8XIZRg6ZlX{D0w!wW4Qag{Z3;cUyP18s|rlZ0W|ejwMbsHfv@bh@C_DyvY{ zM@L^Lcu>E?VUTI43LoZn00256PR5s-t48W#FlpnMB1UI#21>|*gFQbo@Ld^2o#8KK zJ{|ahplYqNn7K5#hkW(6UzN#asp{R0jJKmUj90NN;yLu?*{LStp*o(0W!nincTSF% zPK()8q_4F|Wm6~=78J*s=@|-l07(RGi9IpeSu$PIRjvSo0YLyrBi90c!f_H({* zCTblQQ&zM80Lk+!DUvg3<}leNZIW7(L0s#=Y(y3nwiUh|=r4P|!^)8_=HH7xA<(#5 zuW7c46^Prl;3}Q7wPlLHC6){W0Z7QM==fo*=&cJ=ypg+=f=*zP0D>_PJ4v2En?qON z4~LU=5vb|wPa+Dtn+#%sYoS@#$&@Y3t&J+Nr<|M>EXq_r+o63hnIgL9)(Z`w^?$+t z01&aTx36(gYBRf?+elR#n79Oj7tlh?vX~3$j2W`BsY=XJ*|~!=7>JgRKs#`F1i%D$ z5^Jkjc-NTjOkxFn-W9U;W>}eo2@PQKD@9@4#%?RIidzw;kJ8MTF9*=D-%ZURJd_ExWOtZOHurkDEMk z-=l_Gj(8_+h2ok^4Dow>;Jd=IeT&T{n=69VCD%|3Mlvw1Ud_Vk1~?>QWvApd3`w^I zUN;m^i+pcuqENimZl`L~MP*jp@aDenL=;ODk^@NvxK<={ zJi#Z^&rMD4{l_;>4~yW?=$dOPvRGCY65j+0y4v;_i5^Q;1r(bDoH3@b)NpY^IyQE^ZBRtoAmKAUpd zHOZ!zWTw&%OA3SPNmx5fNe5{nJwWEHD;ktkRWenGg(Mxo0HY8HP*gKOnKC-8za#KW zCsqFdhxnyKj1Bf_lhwjoOGSJnOUW{FpcY=bWr1l$rpfPP0Tf+hoy5vnaD+*>O}8q(-xeA+%nx4jh0*AVWZ5 zru|Gfj=1D)a*n3fud32YO7+^6HY62qQ>`Fr#u&cfGTTg+8>TwftlpryTMIgPqzf75 zL~%0>2XxXl#ucf@N7>kJ#QRh}l`X!sHi}@Fy(!5TqL@aMjTrQ zT@o~J>eO7|oHPnc$Da-LyQ_*it(!6_2xRk=U9{ z2|Ksd#@i_5LWjp9bw7ss?!R;`Sr^HstG1t*6scwu>UlLb?nm4=ZEecua0IF7UHyQx zt>jukZKTf7IFhp*hy4h_IT6ugYv&$hWP1l)O_Q5ec-JDyhF^zUCnbdxpO+d+I?Rf7 zaJ`Zd!5}0a6vRmYx%|6Vei^dx#f2-2how^bwHBW-X;hR9u@!cWw8|04AQl^zF&ee4 zI_ij~_XN|aleDl9%GiPr%mI@G;}S%UtruKl6uWB5mvng-glpXAZeG*JgLf;CD2xg= zod>sMYnB)D7ej&`T>Gf6UyB+ii0(Bla^PLosb1Ng_U|PO?ehG_*|4dA3=_5#7E;|c zX*5w$u2=(AlaMi(>~SI@dF&5Dt%bL>zPa)de155>uL@e~)~>7Ag(RMm>u25BFjO8y zLu;cZ>u)Qo)jPCEC?dZKUwAoa)c*hzw^^bpvN3_dfDZ6MY~l*eK?KVVpeLBs{G|c{ z?#H%g-ZT4mjC2RW{H?Xfa;y_=SU}3L?QH%doLa)9q;ehAox62XnjfrI&Cn;oW0Ubc zY$7_`h|ltUTX2V?sC+iJqo*Y>pxiU4EXr4Bqj-s(szU-@h*nTY0DwB*qE+U-%mPp{ zfOs3@)ji1rY;p<2N$G>l@*I~kzIQXlsc7QU+O{(SHLQs&&w{^jSkl=>O&XBOx9KoN zUJ0`P{{XeuN5h8rekE$DkTN8K000niAb0bW;P^u7De^oWz5D8=ID6Ke=0D6xT zJvw^#Xja^L0kd-KZs#eVk`+8Ai#4Y)3m0`LMo zQ4;lw`c$aXy!jB*8&;qP)Wtvx6Xtoc%n2J{05VLlczW-9DJistBLXCIGcle=KetX4 zy_a_f%oH&wVc|9FT~a{Lnx#v8P?C2D<N+NO}Cdmn%52Vx|Xk(0s4NM-?5jACu&a`nzToLA=-Hs?}~Wc4HT zwQCuZl(q8f-Z>2iU}zB;lIQcBz7fPxaRi@;wM$CZ==zI*l$L!VxMl!8=`3I$$_QP# z9g4cWdJnfG!Sxb5#w2$zbNY2D^3{#oeW`2`joc$lP}jv`Mqxu9<}8~0eHuqUbYj{( z*McI#nJkvaK>B03%8`2KLZ@{Y$%=6auTZ5bh1MD@ikEjDXXVn-1Osn&aJ z&1v_c$&6E^10-s&+eXQK&+xBvt!Wf$)}wsI4${)Z0=b5Q4#N&1J1C5p5}&42rDjEy zlX^*Gv_RRv)es~QNFjK^;~g-NGaY)mr^ejI%PO?OZu0iB+-7=3yPiIup^){P)Hfm%zTKtLe!3lQk)GH0Mw?Wt7M zDco+_@e*=l8@|VgJ)wXRBdy+FtnT#2%)lV{(YiC*{4VCKA~wwF0QgbPNdT!W#^p+I zW3UfMByrZ7Y#bLwr0fV?Z#_`P$Jnh_y7dxc-Tjd)!OtkeEUb(0n zWsCW8B;)`NdBBmugN#mb(FN=$BGc2dIhcf$*wQJ}_xwuQTZZI{(|$R~oiJCFap>-~ zV`kGmL0%wa8ty!y3fG3#^UtSF@GUxpKqUYH+GSuw1qDXpU>27OAdZ^28Ded?*v!d~iVn69z!NH&{z6wz$5dy$1LT$Zsu> z4`?LG7=yS^Zlazy?`#)nuC1!n*{zPU*7(cPraxzw3nx=+0irkLL~><-IP})U8Ijcl z6~-Jm?=oU7xWJ-oUk-H(2Ci<=Us0u|>%VxM$2&U{`Su)SVMf6|H6H z`ECJ-C4e|26^;y&XXRsv>c}oN+%0D_D&ApdkY-d4(j)WZ#JovDCCp?wu;n=6GN5g^ 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

9|XK~Y5);w2g~ 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 j`h%HPf?GiIOe8@u` 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

JO)KMKE!d5KDD`bqhGuc!({?n!6J;4 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�!nQVmgH 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 C;nJ-D diff --git a/build/darknet/x64/data/imagenet.labels.list b/build/darknet/x64/data/imagenet.labels.list deleted file mode 100644 index 23268724401..00000000000 --- a/build/darknet/x64/data/imagenet.labels.list +++ /dev/null @@ -1,21842 +0,0 @@ -n02119789 -n02100735 -n02110185 -n02096294 -n02102040 -n02066245 -n02509815 -n02124075 -n02417914 -n02123394 -n02125311 -n02423022 -n02346627 -n02077923 -n02110063 -n02447366 -n02109047 -n02089867 -n02102177 -n02091134 -n02092002 -n02071294 -n02442845 -n02504458 -n02092339 -n02098105 -n02096437 -n02114712 -n02105641 -n02128925 -n02091635 -n02088466 -n02096051 -n02117135 -n02138441 -n02097130 -n02493509 -n02457408 -n02389026 -n02443484 -n02110341 -n02089078 -n02086910 -n02445715 -n02093256 -n02113978 -n02106382 -n02441942 -n02113712 -n02113186 -n02105162 -n02415577 -n02356798 -n02488702 -n02123159 -n02098413 -n02422699 -n02114855 -n02094433 -n02111277 -n02132136 -n02119022 -n02091467 -n02106550 -n02422106 -n02091831 -n02120505 -n02104365 -n02086079 -n02112706 -n02098286 -n02095889 -n02484975 -n02137549 -n02500267 -n02129604 -n02090721 -n02396427 -n02108000 -n02391049 -n02412080 -n02108915 -n02480495 -n02110806 -n02128385 -n02107683 -n02085936 -n02094114 -n02087046 -n02100583 -n02096177 -n02494079 -n02105056 -n02101556 -n02123597 -n02481823 -n02105505 -n02088094 -n02085782 -n02489166 -n02364673 -n02114548 -n02134084 -n02480855 -n02090622 -n02113624 -n02093859 -n02403003 -n02097298 -n02108551 -n02493793 -n02107142 -n02096585 -n02107574 -n02107908 -n02086240 -n02102973 -n02112018 -n02093647 -n02397096 -n02437312 -n02483708 -n02097047 -n02106030 -n02099601 -n02093991 -n02110627 -n02106166 -n02326432 -n02108089 -n02097658 -n02088364 -n02111129 -n02100236 -n02486261 -n02115913 -n02486410 -n02487347 -n02099849 -n02108422 -n02104029 -n02492035 -n02110958 -n02099429 -n02094258 -n02099267 -n02395406 -n02112350 -n02109961 -n02101388 -n02113799 -n02095570 -n02128757 -n02101006 -n02115641 -n02097209 -n02342885 -n02097474 -n02120079 -n02095314 -n02088238 -n02408429 -n02133161 -n02328150 -n02410509 -n02492660 -n02398521 -n02112137 -n02510455 -n02093428 -n02105855 -n02111500 -n02085620 -n02123045 -n02490219 -n02099712 -n02109525 -n02454379 -n02111889 -n02088632 -n02090379 -n02443114 -n02361337 -n02105412 -n02483362 -n02437616 -n02107312 -n02325366 -n02091032 -n02129165 -n02102318 -n02100877 -n02074367 -n02504013 -n02363005 -n02102480 -n02113023 -n02086646 -n02497673 -n02087394 -n02127052 -n02116738 -n02488291 -n02091244 -n02114367 -n02130308 -n02089973 -n02105251 -n02134418 -n02093754 -n02106662 -n02444819 -n01882714 -n01871265 -n01872401 -n01877812 -n01873310 -n01883070 -n04086273 -n04507155 -n04147183 -n04254680 -n02672831 -n02219486 -n02317335 -n01968897 -n03452741 -n03642806 -n07745940 -n02690373 -n04552348 -n02692877 -n02782093 -n04266014 -n03344393 -n03447447 -n04273569 -n03662601 -n02951358 -n04612504 -n02981792 -n04483307 -n03095699 -n03673027 -n03947888 -n02687172 -n04347754 -n04606251 -n03478589 -n04389033 -n03773504 -n02860847 -n03218198 -n02835271 -n03792782 -n03393912 -n03895866 -n02797295 -n04204347 -n03791053 -n03384352 -n03272562 -n04310018 -n02704792 -n02701002 -n02814533 -n02930766 -n03100240 -n03594945 -n03670208 -n03770679 -n03777568 -n04037443 -n04285008 -n03444034 -n03445924 -n03785016 -n04252225 -n03345487 -n03417042 -n03930630 -n04461696 -n04467665 -n03796401 -n03977966 -n04065272 -n04335435 -n04252077 -n04465501 -n03776460 -n04482393 -n04509417 -n03538406 -n03599486 -n03868242 -n02804414 -n03125729 -n03131574 -n03388549 -n02870880 -n03018349 -n03742115 -n03016953 -n04380533 -n03337140 -n03891251 -n02791124 -n04429376 -n03376595 -n04099969 -n04344873 -n04447861 -n03179701 -n03982430 -n03201208 -n03290653 -n04550184 -n07742313 -n07747607 -n07749582 -n07753113 -n07753275 -n07753592 -n07754684 -n07760859 -n07768694 -n12267677 -n12620546 -n13133613 -n11879895 -n12144580 -n12768682 -n03854065 -n04515003 -n03017168 -n03249569 -n03447721 -n03720891 -n03721384 -n04311174 -n02787622 -n02992211 -n04536866 -n03495258 -n02676566 -n03272010 -n03110669 -n03394916 -n04487394 -n03494278 -n03840681 -n03884397 -n02804610 -n03838899 -n04141076 -n03372029 -n11939491 -n12057211 -n09246464 -n09468604 -n09193705 -n09472597 -n09399592 -n09421951 -n09256479 -n09332890 -n09428293 -n09288635 -n03498962 -n03041632 -n03658185 -n03954731 -n03995372 -n03649909 -n03481172 -n03109150 -n02951585 -n03970156 -n04154565 -n04208210 -n03967562 -n03000684 -n01514668 -n01514859 -n01518878 -n01530575 -n01531178 -n01532829 -n01534433 -n01537544 -n01558993 -n01560419 -n01580077 -n01582220 -n01592084 -n01601694 -n01608432 -n01614925 -n01616318 -n01622779 -n01795545 -n01796340 -n01797886 -n01798484 -n01806143 -n01806567 -n01807496 -n01817953 -n01818515 -n01819313 -n01820546 -n01824575 -n01828970 -n01829413 -n01833805 -n01843065 -n01843383 -n01847000 -n01855032 -n01855672 -n01860187 -n02002556 -n02002724 -n02006656 -n02007558 -n02009912 -n02009229 -n02011460 -n02012849 -n02013706 -n02018207 -n02018795 -n02025239 -n02027492 -n02028035 -n02033041 -n02037110 -n02017213 -n02051845 -n02056570 -n02058221 -n01484850 -n01491361 -n01494475 -n01496331 -n01498041 -n02514041 -n02536864 -n01440764 -n01443537 -n02526121 -n02606052 -n02607072 -n02643566 -n02655020 -n02640242 -n02641379 -n01664065 -n01665541 -n01667114 -n01667778 -n01669191 -n01675722 -n01677366 -n01682714 -n01685808 -n01687978 -n01688243 -n01689811 -n01692333 -n01693334 -n01694178 -n01695060 -n01704323 -n01697457 -n01698640 -n01728572 -n01728920 -n01729322 -n01729977 -n01734418 -n01735189 -n01737021 -n01739381 -n01740131 -n01742172 -n01744401 -n01748264 -n01749939 -n01751748 -n01753488 -n01755581 -n01756291 -n01629819 -n01630670 -n01631663 -n01632458 -n01632777 -n01641577 -n01644373 -n01644900 -n04579432 -n04592741 -n03876231 -n03483316 -n03868863 -n04251144 -n03691459 -n03759954 -n04152593 -n03793489 -n03271574 -n03843555 -n04332243 -n04265275 -n04330267 -n03467068 -n02794156 -n04118776 -n03841143 -n04141975 -n02708093 -n03196217 -n04548280 -n03544143 -n04355338 -n03891332 -n04328186 -n03197337 -n04317175 -n04376876 -n03706229 -n02841315 -n04009552 -n04356056 -n03692522 -n04044716 -n02879718 -n02950826 -n02749479 -n04090263 -n04008634 -n03085013 -n04505470 -n03126707 -n03666591 -n02666196 -n02977058 -n04238763 -n03180011 -n03485407 -n03832673 -n06359193 -n03496892 -n04428191 -n04004767 -n04243546 -n04525305 -n04179913 -n03602883 -n04372370 -n03532672 -n02974003 -n03874293 -n03944341 -n03992509 -n03425413 -n02966193 -n04371774 -n04067472 -n04040759 -n04019541 -n03492542 -n04355933 -n03929660 -n02965783 -n04258138 -n04074963 -n03208938 -n02910353 -n03476684 -n03627232 -n03075370 -n03874599 -n03804744 -n04127249 -n04153751 -n03803284 -n04162706 -n04228054 -n02948072 -n03590841 -n04286575 -n04456115 -n03814639 -n03933933 -n04485082 -n03733131 -n03794056 -n04275548 -n01768244 -n01770081 -n01770393 -n01773157 -n01773549 -n01773797 -n01774384 -n01774750 -n01775062 -n01776313 -n01784675 -n01990800 -n01978287 -n01978455 -n01980166 -n01981276 -n01983481 -n01984695 -n01985128 -n01986214 -n02165105 -n02165456 -n02167151 -n02168699 -n02169497 -n02172182 -n02174001 -n02177972 -n02190166 -n02206856 -n02226429 -n02229544 -n02231487 -n02233338 -n02236044 -n02256656 -n02259212 -n02264363 -n02268443 -n02268853 -n02276258 -n02277742 -n02279972 -n02280649 -n02281406 -n02281787 -n01910747 -n01914609 -n01917289 -n01924916 -n01930112 -n01943899 -n01944390 -n01945685 -n01950731 -n01955084 -n02319095 -n02321529 -n03584829 -n03297495 -n03761084 -n03259280 -n04111531 -n04442312 -n04542943 -n04517823 -n03207941 -n04070727 -n04554684 -n03133878 -n03400231 -n04596742 -n02939185 -n03063689 -n04398044 -n04270147 -n02699494 -n04486054 -n03899768 -n04311004 -n04366367 -n04532670 -n02793495 -n03457902 -n03877845 -n03781244 -n03661043 -n02727426 -n02859443 -n03028079 -n03788195 -n04346328 -n03956157 -n04081281 -n03032252 -n03529860 -n03697007 -n03065424 -n03837869 -n04458633 -n02980441 -n04005630 -n03461385 -n02776631 -n02791270 -n02871525 -n02927161 -n03089624 -n04200800 -n04443257 -n04462240 -n03388043 -n03042490 -n04613696 -n03216828 -n02892201 -n03743016 -n02788148 -n02894605 -n03160309 -n03000134 -n03930313 -n04604644 -n04326547 -n03459775 -n04239074 -n04501370 -n03792972 -n04149813 -n03530642 -n03961711 -n03903868 -n02814860 -n07711569 -n07720875 -n07714571 -n07714990 -n07715103 -n07716358 -n07716906 -n07717410 -n07717556 -n07718472 -n07718747 -n07730033 -n07734744 -n04209239 -n03594734 -n02971356 -n03485794 -n04133789 -n02747177 -n04125021 -n07579787 -n03814906 -n03134739 -n03404251 -n04423845 -n03877472 -n04120489 -n03062245 -n03014705 -n03717622 -n03777754 -n04493381 -n04476259 -n02777292 -n07693725 -n03998194 -n03617480 -n07590611 -n04579145 -n03623198 -n07248320 -n04277352 -n04229816 -n02823428 -n03127747 -n02877765 -n04435653 -n03724870 -n03710637 -n03920288 -n03379051 -n02807133 -n04399382 -n03527444 -n03983396 -n03924679 -n04532106 -n06785654 -n03445777 -n07613480 -n04350905 -n04562935 -n03325584 -n03045698 -n07892512 -n03250847 -n04192698 -n03026506 -n03534580 -n07565083 -n04296562 -n02869837 -n07871810 -n02799071 -n03314780 -n04141327 -n04357314 -n02823750 -n13052670 -n07583066 -n03637318 -n04599235 -n07802026 -n02883205 -n03709823 -n04560804 -n02909870 -n03207743 -n04263257 -n07932039 -n03786901 -n04479046 -n03873416 -n02999410 -n04367480 -n03775546 -n07875152 -n04591713 -n04201297 -n02916936 -n03240683 -n02840245 -n02963159 -n04370456 -n03991062 -n02843684 -n03482405 -n03942813 -n03908618 -n03902125 -n07584110 -n02730930 -n04023962 -n02769748 -n10148035 -n02817516 -n03908714 -n02906734 -n03788365 -n02667093 -n03787032 -n03980874 -n03141823 -n03976467 -n04264628 -n07930864 -n04039381 -n06874185 -n04033901 -n04041544 -n07860988 -n03146219 -n03763968 -n03676483 -n04209133 -n03782006 -n03857828 -n03775071 -n02892767 -n07684084 -n04522168 -n03764736 -n04118538 -n03887697 -n13044778 -n03291819 -n03770439 -n03124170 -n04487081 -n03916031 -n02808440 -n07697537 -n12985857 -n02917067 -n03938244 -n15075141 -n02978881 -n02966687 -n03633091 -n13040303 -n03690938 -n03476991 -n02669723 -n03220513 -n03127925 -n04584207 -n07880968 -n03937543 -n03000247 -n04418357 -n04590129 -n02795169 -n04553703 -n02783161 -n02802426 -n02808304 -n03124043 -n03450230 -n04589890 -n12998815 -n02992529 -n03825788 -n02790996 -n03710193 -n03630383 -n03347037 -n03769881 -n03871628 -n03733281 -n03976657 -n03535780 -n04259630 -n03929855 -n04049303 -n04548362 -n02979186 -n06596364 -n03935335 -n06794110 -n02825657 -n03388183 -n04591157 -n04540053 -n03866082 -n04136333 -n04026417 -n02865351 -n02834397 -n03888257 -n04235860 -n04404412 -n04371430 -n03733805 -n07920052 -n07873807 -n02895154 -n04204238 -n04597913 -n04131690 -n07836838 -n09835506 -n03443371 -n13037406 -n04336792 -n04557648 -n03187595 -n04254120 -n03595614 -n04146614 -n03598930 -n03958227 -n04069434 -n03188531 -n02786058 -n07615774 -n04525038 -n04409515 -n03424325 -n03223299 -n03680355 -n07614500 -n07695742 -n04033995 -n03710721 -n04392985 -n03047690 -n03584254 -n13054560 -n10565667 -n03950228 -n03729826 -n02837789 -n04254777 -n02988304 -n03657121 -n04417672 -n04523525 -n02815834 -n09229709 -n07697313 -n03888605 -n03355925 -n03063599 -n04116512 -n04325704 -n07831146 -n03255030 -n00483313 -n02432291 -n02356381 -n02377388 -n04028764 -n04381587 -n02279257 -n04168199 -n00445055 -n02461128 -n03626760 -n04313503 -n00451635 -n02509515 -n04224842 -n09403734 -n02769290 -n13054073 -n03163222 -n00464478 -n03087069 -n04477219 -n03445617 -n00449054 -n00483705 -n04395106 -n03389611 -n04285965 -n04166281 -n04003856 -n03696301 -n00475787 -n04587404 -n09218641 -n02276355 -n03592669 -n04459909 -n04492375 -n09447666 -n00463543 -n04148703 -n04591517 -n03970546 -n04297750 -n02782778 -n02383231 -n03693474 -n02277094 -n03766044 -n02056228 -n03394272 -n03047052 -n00434075 -n04185946 -n02411999 -n03858418 -n12833149 -n02836035 -n03108853 -n04587559 -n04138261 -n02278024 -n03063485 -n02774921 -n09475044 -n02811204 -n03329302 -n04026813 -n03986562 -n03379204 -n03426134 -n02790669 -n03487090 -n03548402 -n08614632 -n04054361 -n03421485 -n03302671 -n03098959 -n02970408 -n03772584 -n03064935 -n09415584 -n11715430 -n12024445 -n02710201 -n03475581 -n13142504 -n03396074 -n03211789 -n03914337 -n03678558 -n03233123 -n00453396 -n00454395 -n00440382 -n04289027 -n00445226 -n11953610 -n04128413 -n00480211 -n00470966 -n12547503 -n03085219 -n02275773 -n02692086 -n04257790 -n00448748 -n02686379 -n12328567 -n03432129 -n03859000 -n12091377 -n02124313 -n00442847 -n04603399 -n03114379 -n02920369 -n03818343 -n02946127 -n02978055 -n12914923 -n02705429 -n00448232 -n12882945 -n04289690 -n07606669 -n02056728 -n11848479 -n03046921 -n12282933 -n02867966 -n12821505 -n02812949 -n04545305 -n02699770 -n04395651 -n02900160 -n04099003 -n02054711 -n12606545 -n03356858 -n01859190 -n03643737 -n02962200 -n03123553 -n09361517 -n02793089 -n00449517 -n02783994 -n10117851 -n12038585 -n04383839 -n10142391 -n07719213 -n03536122 -n02472987 -n03454536 -n11728099 -n02392824 -n03795758 -n04282872 -n00448872 -n02404432 -n03797182 -n03029197 -n03665924 -n12477163 -n02769963 -n03863262 -n01532325 -n04165409 -n04593077 -n04473108 -n03577090 -n09988063 -n00446804 -n03931765 -n00475014 -n02700064 -n03240892 -n12475242 -n11735053 -n04053508 -n02852173 -n02382750 -n03823111 -n04543772 -n04112147 -n04433585 -n03175189 -n03596543 -n00445685 -n03307792 -n04589593 -n01814217 -n02993368 -n04303497 -n02811350 -n03355768 -n03699591 -n04590553 -n01893825 -n12726670 -n09916348 -n11544015 -n01318894 -n02133704 -n02367492 -n04506289 -n02069974 -n01900150 -n03207835 -n03363549 -n02831595 -n04970470 -n04160847 -n03767203 -n03928814 -n02302969 -n02918595 -n10401331 -n04231272 -n03717447 -n03063968 -n03380724 -n00825773 -n09988493 -n02740300 -n04539794 -n04121511 -n01323599 -n12937130 -n02428508 -n02980036 -n12061380 -n01887787 -n04214046 -n01787835 -n00466630 -n02979290 -n03927091 -n03231368 -n03904657 -n04469003 -n04196502 -n02122948 -n04544325 -n07868340 -n13876561 -n11925898 -n12158443 -n01595450 -n12454705 -n02069412 -n09618957 -n02357111 -n00451563 -n04197110 -n02276902 -n03111296 -n03909020 -n12303083 -n02082791 -n01956764 -n04269822 -n04207343 -n02433318 -n01888181 -n12682668 -n01592387 -n09793141 -n00466273 -n04026180 -n06255081 -n12172364 -n10145590 -n12311579 -n12173912 -n03822171 -n03140292 -n03027625 -n02739427 -n02060133 -n02431785 -n03219010 -n00447957 -n11910271 -n03620967 -n12547215 -n02409508 -n04290079 -n12329260 -n13901858 -n02008497 -n10304914 -n04524142 -n04279462 -n04233124 -n09733793 -n12822115 -n09475179 -n10151760 -n03418618 -n12858397 -n07735510 -n03549473 -n10098245 -n03653583 -n10604380 -n03375575 -n03885293 -n01527347 -n03237340 -n02760658 -n11953038 -n03187268 -n03004275 -n02393161 -n11965218 -n08580944 -n03938725 -n03900979 -n04144241 -n03760310 -n02376679 -n03237992 -n09432283 -n02379908 -n09918554 -n04041747 -n12012111 -n10331167 -n01612122 -n10147935 -n07691539 -n11669786 -n09403427 -n01935395 -n09903501 -n04439585 -n04459018 -n02780704 -n03720163 -n12899752 -n04118635 -n03404149 -n02429456 -n00449168 -n04516354 -n04317833 -n12075299 -n07878647 -n09438940 -n03361550 -n02027357 -n04317976 -n03092883 -n04526964 -n03985069 -n03610682 -n04028581 -n02277268 -n09433839 -n03846431 -n03919289 -n10146104 -n10260706 -n02686227 -n03321103 -n00444846 -n01558307 -n01595168 -n03919096 -n11844892 -n04260364 -n02750070 -n03034244 -n03002096 -n04273972 -n11814584 -n04605321 -n07745466 -n02922798 -n03361380 -n12651229 -n08521623 -n04498389 -n00453313 -n04967882 -n12024690 -n03934656 -n02685082 -n04501550 -n09972458 -n03055418 -n07763629 -n03902756 -n09938449 -n09712696 -n02387346 -n03133415 -n07711080 -n03129753 -n03524150 -n02275560 -n03993053 -n03438661 -n11939180 -n00466524 -n11753355 -n03456024 -n03421324 -n07890540 -n11720643 -n02057035 -n00453126 -n04453037 -n01540832 -n03546235 -n03370387 -n02041875 -n02871439 -n03262072 -n01786646 -n02430830 -n02799175 -n05262422 -n03854722 -n12817694 -n04449966 -n01564773 -n02034971 -n03490119 -n02822579 -n07879953 -n04110178 -n04963588 -n04252653 -n01565078 -n02389128 -n02779435 -n10645017 -n04582205 -n08573842 -n10146002 -n03892178 -n03119396 -n03813078 -n07866868 -n03160740 -n03371875 -n02417387 -n03904782 -n03098688 -n02902687 -n01828556 -n04401680 -n04590933 -n01575401 -n07693048 -n02901114 -n03047941 -n04355511 -n11849871 -n10738111 -n03122073 -n12052787 -n01594004 -n01549886 -n02824058 -n03506184 -n11487732 -n12574866 -n12948053 -n10091450 -n00470554 -n00326094 -n12093329 -n04438897 -n07818995 -n12828791 -n13901321 -n10613996 -n10159533 -n02669295 -n02843158 -n06415688 -n14858292 -n09813219 -n12485653 -n03200231 -n02089468 -n03935234 -n01539925 -n12428076 -n10439373 -n01536644 -n02694662 -n02123242 -n03002711 -n03363749 -n02669534 -n03451798 -n11927215 -n02679257 -n09475925 -n10015485 -n12422129 -n03946162 -n02377291 -n07871720 -n12622297 -n12782915 -n01579260 -n11838916 -n10267311 -n12824053 -n03340723 -n02276749 -n04439712 -n02126139 -n04188179 -n02386853 -n07942152 -n02499316 -n04324387 -n10635788 -n04234887 -n12237641 -n03713436 -n04960582 -n04076713 -n01646292 -n03947798 -n02840134 -n04476972 -n09822830 -n03551395 -n04533802 -n02918964 -n00474657 -n12932966 -n01615458 -n01806364 -n12458550 -n11784497 -n03557360 -n10638922 -n09889941 -n10689306 -n03358172 -n04295571 -n06596607 -n11853356 -n00482122 -n11760785 -n03150232 -n11778257 -n03059685 -n10105733 -n04104384 -n07691237 -n04326676 -n07684938 -n12666965 -n04177820 -n13918387 -n03398153 -n03914438 -n09932098 -n02988486 -n02977619 -n03317788 -n03484487 -n02988679 -n04062428 -n02568087 -n12866162 -n04227144 -n07875436 -n04082886 -n11753700 -n00470682 -n02122298 -n10145239 -n12755727 -n04214282 -n01852671 -n02378969 -n04108822 -n10382825 -n12392549 -n03973839 -n12258885 -n11782761 -n12389501 -n02940570 -n03405595 -n02969323 -n03207630 -n10169147 -n03805725 -n09847543 -n02415253 -n07880080 -n04305572 -n02042180 -n07565161 -n02871147 -n04438507 -n04445154 -n07842433 -n12029635 -n09750282 -n09621232 -n01858906 -n02761206 -n03986355 -n12591351 -n13916721 -n02905036 -n11894770 -n02377603 -n12924623 -n03950899 -n09454153 -n10247358 -n05261310 -n11943660 -n10804287 -n03560430 -n01756089 -n10618342 -n04283378 -n13926786 -n04238321 -n04393549 -n04461879 -n03502200 -n00440941 -n03494706 -n04148579 -n13902336 -n02780815 -n10726031 -n04124098 -n12344483 -n04384910 -n07681450 -n02030837 -n04059157 -n09247410 -n02714751 -n08633683 -n04520784 -n10141732 -n12371439 -n04499062 -n02931148 -n07609632 -n04536335 -n02874537 -n03013438 -n11786539 -n11690455 -n07600696 -n00478262 -n00466712 -n03399677 -n12441183 -n07895962 -n11966083 -n02990373 -n04241249 -n02068541 -n12513933 -n02356977 -n04252560 -n04087826 -n03455488 -n07619409 -n09787534 -n03680942 -n00446980 -n12384839 -n03416900 -n07821758 -n11853813 -n01606522 -n11780148 -n04969242 -n12413880 -n04130257 -n01322604 -n03061211 -n01959492 -n02842573 -n04313628 -n03815149 -n02445394 -n08547544 -n03222176 -n04070003 -n03075768 -n09695979 -n02877266 -n08583292 -n02870676 -n03657511 -n01621635 -n04284341 -n04136161 -n02836174 -n10247880 -n01744100 -n02882894 -n03408444 -n03411079 -n02366959 -n04399158 -n04542715 -n02787435 -n04251701 -n13863020 -n07890226 -n12245319 -n12849952 -n11626826 -n00887544 -n03140431 -n03519387 -n03855604 -n07906111 -n02054036 -n11954161 -n03038281 -n00450998 -n12136392 -n02119477 -n04356925 -n02406647 -n04450133 -n12545635 -n01565599 -n02028900 -n07817024 -n02971167 -n04309049 -n02678897 -n12795555 -n11769803 -n01904886 -n02079851 -n12189987 -n04581829 -n12098403 -n01839330 -n12587803 -n03652932 -n08628141 -n03544238 -n04513827 -n01847806 -n03132076 -n10243137 -n03621377 -n10530959 -n14765422 -n04968139 -n12950314 -n02064816 -n02846511 -n10513823 -n11772408 -n03341297 -n03492922 -n03683606 -n02894337 -n02365480 -n09846755 -n03495039 -n01317813 -n12610328 -n02157206 -n01588002 -n03914831 -n03659686 -n10406765 -n09205509 -n02870526 -n07954211 -n10578471 -n11646694 -n03115762 -n07762913 -n12056758 -n12305986 -n11845913 -n02835915 -n02831237 -n07927512 -n12171098 -n02073831 -n07605040 -n02885462 -n02768114 -n04450994 -n11844371 -n03963645 -n02956699 -n02029378 -n01528396 -n10005934 -n04465666 -n04390977 -n11882074 -n03831382 -n04605163 -n06276501 -n02944075 -n05258051 -n07901457 -n12683571 -n02205219 -n13235503 -n02388735 -n03941231 -n14919819 -n12816508 -n11536673 -n13895262 -n02903204 -n10137825 -n07841345 -n07893253 -n01850192 -n07769731 -n11773987 -n03539678 -n12938193 -n10802507 -n03089879 -n00477392 -n01828096 -n09263912 -n13653902 -n04579667 -n01322983 -n08579352 -n07587023 -n07756951 -n07870167 -n10588357 -n01606809 -n13864035 -n02802544 -n07591961 -n02979399 -n04144539 -n02416820 -n11769176 -n09743792 -n09732170 -n04972451 -n13918274 -n01847089 -n01859689 -n04208065 -n07617051 -n10674713 -n07914271 -n07887461 -n03736064 -n03644858 -n03878963 -n04040247 -n07891433 -n01611969 -n07587618 -n02689144 -n10049363 -n04059516 -n10313239 -n03115400 -n01519563 -n01533893 -n03850245 -n11733548 -n03372549 -n01884834 -n02839110 -n07887192 -n03617312 -n07886463 -n03103396 -n07764847 -n01855476 -n07808587 -n12858871 -n03632729 -n10209731 -n04141712 -n03978686 -n03225988 -n00475273 -n09224725 -n04966543 -n01322221 -n03649674 -n13154494 -n03948830 -n03320519 -n03723267 -n07869611 -n12342498 -n01827793 -n03145719 -n11821184 -n11956348 -n11857875 -n10339717 -n09450163 -n10756148 -n01591301 -n07915094 -n04422727 -n09719309 -n03349469 -n03389889 -n10718131 -n04298661 -n09747495 -n03676623 -n03547229 -n03062015 -n10734394 -n07817315 -n02852360 -n01850553 -n02952585 -n03587205 -n02009750 -n01540090 -n02947660 -n03656957 -n03378174 -n02508213 -n01572489 -n12008487 -n12185859 -n11691046 -n01323355 -n05262534 -n00448126 -n02432983 -n12038406 -n03883385 -n02411206 -n01643896 -n10159045 -n11675025 -n01803362 -n02009508 -n07920349 -n04098513 -n11617272 -n09913455 -n12390314 -n04171208 -n02995345 -n10634849 -n03173929 -n02749953 -n11845793 -n12796022 -n11955153 -n11816829 -n03032453 -n11984542 -n02992795 -n03712111 -n02873733 -n02759387 -n14915184 -n02381364 -n12686274 -n07857731 -n04518764 -n03010473 -n02418465 -n02359556 -n07894799 -n04104770 -n04335209 -n01848976 -n02006063 -n04454908 -n03002948 -n04220250 -n09923561 -n04102162 -n11958080 -n04598965 -n10173410 -n03067339 -n02003204 -n12686676 -n11986511 -n02311617 -n03367059 -n02761557 -n05578095 -n04041069 -n10575463 -n03325941 -n10082043 -n01806297 -n09691729 -n04593866 -n01813088 -n01625562 -n03906224 -n01652026 -n10236304 -n04102618 -n04321453 -n07820145 -n01575117 -n12788854 -n07823698 -n04206225 -n03216710 -n02421449 -n03343737 -n07560903 -n02872529 -n11989869 -n12071744 -n06278475 -n04492749 -n02920259 -n03798061 -n02420509 -n03316105 -n12052447 -n03974915 -n02904803 -n03430418 -n12291959 -n06892775 -n03875806 -n07903841 -n10282482 -n02683323 -n07862348 -n01849157 -n04469813 -n09944022 -n03342127 -n07592481 -n02936402 -n02405929 -n10002760 -n02537716 -n05259914 -n01560280 -n12694486 -n07879350 -n02377063 -n03637181 -n03409297 -n01607812 -n02808185 -n09239302 -n12055516 -n09712448 -n02859184 -n12772908 -n02735538 -n10333838 -n12336092 -n02386968 -n04613939 -n00452864 -n04535524 -n03174731 -n04189816 -n07607605 -n12909917 -n02387722 -n02960690 -n07715221 -n02407071 -n10667477 -n09398076 -n04236809 -n01904806 -n01610552 -n12373100 -n12771390 -n04122685 -n07804771 -n15102455 -n03469175 -n03746005 -n02536456 -n03505667 -n11816336 -n09376198 -n10572706 -n03464053 -n02869155 -n07816164 -n04969798 -n02942349 -n14820180 -n01623615 -n12676703 -n03369276 -n03650551 -n02010272 -n02976123 -n01852400 -n02196119 -n04132158 -n03238586 -n07639069 -n03313333 -n10542761 -n12215022 -n00455173 -n10019406 -n12899537 -n04277826 -n09906449 -n04549629 -n11508382 -n15090065 -n10289462 -n04540255 -n02723165 -n04335693 -n01536334 -n03107488 -n12782530 -n14785065 -n02974348 -n09874862 -n04479939 -n03309465 -n09902954 -n12092417 -n03425595 -n12433081 -n07806774 -n12462805 -n01314781 -n10192839 -n01622120 -n07807171 -n03261019 -n02843553 -n04287747 -n02324587 -n09915434 -n01818299 -n01592694 -n03826186 -n03607659 -n01527917 -n03628511 -n02005399 -n04204081 -n02052775 -n04403413 -n03914106 -n12811027 -n01872772 -n04555700 -n02004855 -n04602762 -n02713003 -n04406817 -n11934807 -n03336282 -n09684901 -n03836976 -n11959862 -n03062336 -n03506028 -n04503413 -n07819896 -n03205669 -n11902200 -n07685218 -n03046133 -n10261624 -n10303814 -n03676087 -n04023695 -n07587111 -n07764155 -n01504179 -n03794136 -n03389761 -n13901211 -n02784124 -n04488530 -n02807731 -n07898443 -n04981658 -n04177755 -n03649161 -n04125257 -n10135129 -n03653110 -n10560106 -n07735687 -n03511333 -n11960245 -n03301568 -n03878066 -n10746931 -n04223299 -n04237423 -n07888229 -n01819734 -n12312728 -n09981939 -n03727465 -n13882276 -n02993194 -n11971927 -n09713108 -n03581125 -n09718936 -n14698884 -n03005285 -n03540914 -n03359436 -n03934042 -n07569644 -n04964878 -n07890068 -n07580253 -n01538630 -n03132666 -n03259009 -n02796318 -n12703190 -n01464844 -n11792029 -n04270371 -n13102775 -n02933649 -n02387254 -n02890188 -n04335886 -n04358491 -n02786837 -n03885194 -n04001265 -n03438071 -n10375402 -n02997910 -n03326795 -n00470830 -n02734725 -n03494537 -n08376250 -n07743544 -n02991847 -n04246271 -n04156140 -n04381073 -n07732168 -n04951071 -n07977870 -n04334599 -n02838728 -n03326948 -n11723227 -n08182379 -n03686924 -n03821518 -n02382204 -n02080415 -n11788727 -n07732636 -n03860404 -n03898395 -n07867324 -n04392113 -n13237188 -n03263076 -n07843636 -n04968056 -n04397027 -n03320421 -n06267564 -n02880842 -n04115456 -n13862407 -n10289039 -n03128248 -n01457852 -n01536035 -n04579056 -n03937931 -n03036022 -n01804163 -n09913593 -n12841007 -n03115897 -n03256032 -n02475669 -n07924443 -n03061505 -n10001481 -n03600722 -n07842308 -n10696508 -n04215402 -n10588074 -n03614782 -n03995535 -n12091953 -n04113194 -n10092978 -n03011741 -n04381860 -n07819769 -n07905474 -n03288500 -n04225987 -n13223710 -n02879087 -n02920083 -n08640739 -n03362890 -n03996849 -n03849814 -n09694664 -n02407390 -n02910864 -n02388917 -n01668665 -n07616046 -n02932891 -n10553235 -n03652729 -n01615703 -n12801781 -n12164656 -n05302499 -n03801760 -n03332271 -n02901793 -n03941417 -n09833441 -n01623110 -n02807523 -n10598181 -n03725600 -n10368528 -n04116098 -n12719944 -n02045864 -n02173373 -n02811059 -n04479823 -n07816398 -n10572889 -n04142731 -n07687381 -n02799323 -n07865484 -n01858845 -n12684379 -n01842235 -n09242389 -n02028727 -n03527565 -n03438863 -n15019030 -n13907272 -n09659039 -n04251791 -n03683995 -n04137217 -n04389430 -n09785659 -n02016816 -n03124590 -n01859325 -n03138669 -n02999936 -n11926365 -n12686077 -n03517760 -n09734450 -n04563413 -n12074867 -n01564217 -n12521394 -n06267893 -n03594148 -n04139395 -n12369309 -n01544389 -n12048056 -n04524941 -n03016868 -n03653740 -n02795528 -n03687137 -n03766935 -n03361297 -n04263502 -n10043491 -n03446268 -n01994910 -n03891538 -n10091564 -n10226413 -n02755140 -n03500389 -n10237196 -n03625646 -n06596474 -n03360300 -n09730824 -n10732010 -n04469514 -n02904927 -n04961331 -n02936570 -n03680858 -n07585758 -n09199101 -n04050933 -n03712337 -n03911513 -n01556182 -n03102371 -n07928887 -n12133462 -n03974070 -n03971218 -n03292475 -n03425241 -n03440216 -n11995092 -n02894158 -n02918112 -n10568358 -n11524451 -n03169176 -n04100519 -n07588193 -n06883725 -n02860640 -n07762114 -n04082710 -n07896893 -n10167152 -n03287351 -n02788021 -n08494231 -n01560935 -n03249342 -n04564581 -n09349648 -n07704205 -n03510244 -n12127460 -n09945745 -n11719286 -n11613459 -n12656369 -n03824381 -n07655263 -n09894143 -n04964001 -n02161457 -n07654298 -n07930433 -n02979074 -n02026948 -n13914608 -n07611267 -n02843276 -n09827363 -n10259780 -n04432662 -n11715678 -n12388858 -n03057920 -n10465451 -n03855214 -n07728181 -n09835348 -n03549732 -n04589325 -n03491032 -n00452034 -n03948242 -n01456756 -n07921615 -n02809105 -n12889713 -n07586894 -n07734879 -n07905979 -n12847374 -n12129134 -n02122580 -n04028074 -n02911332 -n09251407 -n07697825 -n04597309 -n02800213 -n03480579 -n07621618 -n04170933 -n03743279 -n01916481 -n04037220 -n10748620 -n02708433 -n12007196 -n02561381 -n04103769 -n03030880 -n04413969 -n03911658 -n04590746 -n00476389 -n04331639 -n07725789 -n01792429 -n02949542 -n07686720 -n04064862 -n04447028 -n01713764 -n09854218 -n04032603 -n04405907 -n15093298 -n04385536 -n11954345 -n01560793 -n09249034 -n03784270 -n03436549 -n01324610 -n02379183 -n07616487 -n04119478 -n03309356 -n12865037 -n12850168 -n04250850 -n03024064 -n04412097 -n02982515 -n00450070 -n10175248 -n11847169 -n12276872 -n12870891 -n10229883 -n10505613 -n03482252 -n09300905 -n02919890 -n07617611 -n10283170 -n01607962 -n01671125 -n07894551 -n04561287 -n00005787 -n10025635 -n02850732 -n03732020 -n02036711 -n07907429 -n03797896 -n03004824 -n12011620 -n10300303 -n03105467 -n03767745 -n07868508 -n07868200 -n03788047 -n07886057 -n04559451 -n09845401 -n04373704 -n02676938 -n02565324 -n02667478 -n02122878 -n03244047 -n01747589 -n04320973 -n13205058 -n02379430 -n11959632 -n10183931 -n07683490 -n10055410 -n04370288 -n03273551 -n13900422 -n07899434 -n04053677 -n07740461 -n11879722 -n04282494 -n02981911 -n03449451 -n07581249 -n03965456 -n11808468 -n13881644 -n11725973 -n12091213 -n13193856 -n02873520 -n02754656 -n02431976 -n01324431 -n02385214 -n01888411 -n12680864 -n07731284 -n04337287 -n07631926 -n02549248 -n04395024 -n07585557 -n02776825 -n09460046 -n12023108 -n00475403 -n10098517 -n07902336 -n03683708 -n02412210 -n04397452 -n04583212 -n13869547 -n03632577 -n01616086 -n02763901 -n08256735 -n03015478 -n02084732 -n12178896 -n11966215 -n07605380 -n13869788 -n01847170 -n07744811 -n01854700 -n00444937 -n10422405 -n07801892 -n09688804 -n11879054 -n02802215 -n07908411 -n07822518 -n01558594 -n07935737 -n10730728 -n04436329 -n04294879 -n04972350 -n12911440 -n13886260 -n07578093 -n02537525 -n03703730 -n09607630 -n13865904 -n02360282 -n11731659 -n04126066 -n04212165 -n11618290 -n07588574 -n09269472 -n11896722 -n02892304 -n03487642 -n02028342 -n03321563 -n03135030 -n03522100 -n03253886 -n04095109 -n06470073 -n12603449 -n10644598 -n10260800 -n01535469 -n09696456 -n03553019 -n03963198 -n11918473 -n10314517 -n03002341 -n07574923 -n10421470 -n05716342 -n03244231 -n01730563 -n11691857 -n12807251 -n12345899 -n03142679 -n01531512 -n12307240 -n07835457 -n04535370 -n00451186 -n12481458 -n03434188 -n09734185 -n04578934 -n04167346 -n02747802 -n03459328 -n03301940 -n01562014 -n07690431 -n10642596 -n03696065 -n12781940 -n02759257 -n04392764 -n04218564 -n03499907 -n01536780 -n09751895 -n03235042 -n04570815 -n12070381 -n09448690 -n07625061 -n10178216 -n04560113 -n09457979 -n03858085 -n02421792 -n02944579 -n10085869 -n09718811 -n04103206 -n04239786 -n04501947 -n01321123 -n02390015 -n03964495 -n01554448 -n02925107 -n03028596 -n12483625 -n03227317 -n10701644 -n11968704 -n03900393 -n01851038 -n02276078 -n03132776 -n07585906 -n04480033 -n07880458 -n12887293 -n07921239 -n03307037 -n04595028 -n04244379 -n13131028 -n10313724 -n09436708 -n02694045 -n09941787 -n00449796 -n01817346 -n07928696 -n03401279 -n12901724 -n11646167 -n07682477 -n09415671 -n07900225 -n03607029 -n02692232 -n11834654 -n07935379 -n12437930 -n03762434 -n07922764 -n03595523 -n04546340 -n10686885 -n03516844 -n03767112 -n09896685 -n03859608 -n03149686 -n07920872 -n12388143 -n10406391 -n04233715 -n04373089 -n02023992 -n01947396 -n12115180 -n00479616 -n03962852 -n02392434 -n12414035 -n14976871 -n03201776 -n10665587 -n03600285 -n04402449 -n08539072 -n03629231 -n12860365 -n03488438 -n03337383 -n12455950 -n10384392 -n02953455 -n03101796 -n07919572 -n03233744 -n01578180 -n01756508 -n04556533 -n02962843 -n02882190 -n03731483 -n01850873 -n05260240 -n03111177 -n09836519 -n03030557 -n11789066 -n02788572 -n07903101 -n04067818 -n07840804 -n01567678 -n12427184 -n03333610 -n02416964 -n10607291 -n07936548 -n05451384 -n02968074 -n07605597 -n02704949 -n07609215 -n01951274 -n07696977 -n03180384 -n04303357 -n03291741 -n02207805 -n10123844 -n03420345 -n12384227 -n02758863 -n02047975 -n03978966 -n03549199 -n04275175 -n09294877 -n09836343 -n11970586 -n02010728 -n10369317 -n12681893 -n03192543 -n12413165 -n12174521 -n11916696 -n10042845 -n07822197 -n04968749 -n10323634 -n12849416 -n02814774 -n05538625 -n03078802 -n12230794 -n07726095 -n03051249 -n12005656 -n11876432 -n12164881 -n09711435 -n01622483 -n09896170 -n07684289 -n03368352 -n07910048 -n03159535 -n00466377 -n01541386 -n11647703 -n09752023 -n07903731 -n12249542 -n03794798 -n11786131 -n02852043 -n10493685 -n09846894 -n01752585 -n01536186 -n07618432 -n09859152 -n02065026 -n02382635 -n07867616 -n03885788 -n04255586 -n03275681 -n11961100 -n12485981 -n04495698 -n03293741 -n13902048 -n03254862 -n07903962 -n01594787 -n11962272 -n03284886 -n07842202 -n10157128 -n02405302 -n04443766 -n06266633 -n02519862 -n01487506 -n03373943 -n04247876 -n04327204 -n03349771 -n09260907 -n10092794 -n12223764 -n03504723 -n11926833 -n01820052 -n13032381 -n03889871 -n03209359 -n04608923 -n15093137 -n15091304 -n03688405 -n09905185 -n03543112 -n11611356 -n03885028 -n03234164 -n07594066 -n02396014 -n03456186 -n09874725 -n11601333 -n02917521 -n03055857 -n02804123 -n12352844 -n12866002 -n09858165 -n12037691 -n02565072 -n04477387 -n02008643 -n07867021 -n04119360 -n09893191 -n02944146 -n12435649 -n13197274 -n04974859 -n07751004 -n12003696 -n02762508 -n02680512 -n01743086 -n06998748 -n10607478 -n07613815 -n01559477 -n01859852 -n03239054 -n04466871 -n05263183 -n13173882 -n07897438 -n12427757 -n04400737 -n03291963 -n07682808 -n11692265 -n04130143 -n09445289 -n07696839 -n03835197 -n12821895 -n09734639 -n03365374 -n04305210 -n04962240 -n09871867 -n07897750 -n07616386 -n09443281 -n03641569 -n13882563 -n07680761 -n10498816 -n04034262 -n03533014 -n07928790 -n07690152 -n10060352 -n04124370 -n12453186 -n04509171 -n03013580 -n10604979 -n12515711 -n04971211 -n07693223 -n03786715 -n07894703 -n02761834 -n04232800 -n03437741 -n04045644 -n14976759 -n03042697 -n12557681 -n06275095 -n11678010 -n01586941 -n07684517 -n07822845 -n03483823 -n09951616 -n03180865 -n07861557 -n03644378 -n12848499 -n11962667 -n03886762 -n04238128 -n11979964 -n13915113 -n12791329 -n12457091 -n03341153 -n10267865 -n03484576 -n10186216 -n07612137 -n03843438 -n11807525 -n11931540 -n02027897 -n07614730 -n04116294 -n03469903 -n10017272 -n03688605 -n07860103 -n03981566 -n01888045 -n03345837 -n11998888 -n02071636 -n02726017 -n04310157 -n04607869 -n01622959 -n08524735 -n03119203 -n12031927 -n03610524 -n02807616 -n04056180 -n03233905 -n03374473 -n14810561 -n11944954 -n03121431 -n09750891 -n08505018 -n10727171 -n12357485 -n12571781 -n12067193 -n07586604 -n02086753 -n03548086 -n02560110 -n07804900 -n02880393 -n04208427 -n12931542 -n01594968 -n05218119 -n03520493 -n03727605 -n12687698 -n03612965 -n04135315 -n07730320 -n10540114 -n07599911 -n01323493 -n02115096 -n04590263 -n12043836 -n02861387 -n09836786 -n04966941 -n02816768 -n13131618 -n10701962 -n02919792 -n03442597 -n04325041 -n03333129 -n04091693 -n04950952 -n10631309 -n04177931 -n13234678 -n01970667 -n07748416 -n07893642 -n07691650 -n03660909 -n04145863 -n11945514 -n10334009 -n12336973 -n03954393 -n04558478 -n09899929 -n03487533 -n07816575 -n07877187 -n07863547 -n01603812 -n02098906 -n04973585 -n03674440 -n04371050 -n12243109 -n07871234 -n02928049 -n07574504 -n07889274 -n12141167 -n04543996 -n03080633 -n03423479 -n07879659 -n04380916 -n10514429 -n07584423 -n04009801 -n12479537 -n07606538 -n07698543 -n12353754 -n10132035 -n03367545 -n04245508 -n09811852 -n02024763 -n04052442 -n10120330 -n12352639 -n12606438 -n07752966 -n09772930 -n02535759 -n11737534 -n10345015 -n12427566 -n09705784 -n04112654 -n02985963 -n03758089 -n12953484 -n07906572 -n02881757 -n12739332 -n03718458 -n03407865 -n07775050 -n03210552 -n09452395 -n09789566 -n10566072 -n10559996 -n07826930 -n12414932 -n01887474 -n03026907 -n07751148 -n10223177 -n03957420 -n03788601 -n12244819 -n12421137 -n04266162 -n10038409 -n02981024 -n03228967 -n11825351 -n12058822 -n11963932 -n03041449 -n03046029 -n07590502 -n02932523 -n02152881 -n04970398 -n07887967 -n12812478 -n12421917 -n02708711 -n11870747 -n04290507 -n07934282 -n01608265 -n12070583 -n03205574 -n02305085 -n07866015 -n02960903 -n10098624 -n00481803 -n07938007 -n02693246 -n03923379 -n04103665 -n11792742 -n12489815 -n04971313 -n01668892 -n01055165 -n03215508 -n12104501 -n07899292 -n12822955 -n07713074 -n03842012 -n02449350 -n07868955 -n02835829 -n12283542 -n04525584 -n07910656 -n11625003 -n03987266 -n02805983 -n15091846 -n09736945 -n04973816 -n02439398 -n01519873 -n07899003 -n03019938 -n07582152 -n01885498 -n12108871 -n02934451 -n04327682 -n07696625 -n09750770 -n12084890 -n03960374 -n07585107 -n01570839 -n11905392 -n06277135 -n07842044 -n03751269 -n04398951 -n12861892 -n12649539 -n07596967 -n07580592 -n12845413 -n07690739 -n07804657 -n04334105 -n03779128 -n03268918 -n03066359 -n02744323 -n12596148 -n04272389 -n07832416 -n10210911 -n01548865 -n03221351 -n15091669 -n07878926 -n07607967 -n12171966 -n02846141 -n07576781 -n02922292 -n10092643 -n01732614 -n02578771 -n02864593 -n03537241 -n09635534 -n03268645 -n07852833 -n13873917 -n12640839 -n03506727 -n10536416 -n09976429 -n10692482 -n07600285 -n04156946 -n07818689 -n02605703 -n02710429 -n02890351 -n03408054 -n03121298 -n02731629 -n12450840 -n04061681 -n10153414 -n07648913 -n07891309 -n01562265 -n14973585 -n01610226 -n06267991 -n03302938 -n07822323 -n07826091 -n02764398 -n10406266 -n09282208 -n01734104 -n04283096 -n03530910 -n11542137 -n02610664 -n03856012 -n01531811 -n07862611 -n11625632 -n12643313 -n02469248 -n03333711 -n02907082 -n02122430 -n01559804 -n09744161 -n10187990 -n12015525 -n07844867 -n07887304 -n02878425 -n02009380 -n11448153 -n10655594 -n12566954 -n11901977 -n03999160 -n02389779 -n07928488 -n12785889 -n04281375 -n03745146 -n03224603 -n04594828 -n12835331 -n09715427 -n11615026 -n09972010 -n04038231 -n02379329 -n03445326 -n10753442 -n04249882 -n11727738 -n07866723 -n04282992 -n11621281 -n01566645 -n03919430 -n11980682 -n03480719 -n11625804 -n10467395 -n09436444 -n07867751 -n03684611 -n03788498 -n12062626 -n07808904 -n07690585 -n03865557 -n10711766 -n10465831 -n04380255 -n12166128 -n04432203 -n07892418 -n10432441 -n12991184 -n04209613 -n04459773 -n09666883 -n07807472 -n09873899 -n12939874 -n04545748 -n09637339 -n07919441 -n03987376 -n03645577 -n03437430 -n10671613 -n02964843 -n09707289 -n11700058 -n03877351 -n03518445 -n07643200 -n02140049 -n12683791 -n12418221 -n04154152 -n03397947 -n03238131 -n11851839 -n04545858 -n07744682 -n02995871 -n07593199 -n03543394 -n10293332 -n12658481 -n11599324 -n02705201 -n03920867 -n08249459 -n02876084 -n03937835 -n01397871 -n03849679 -n12016567 -n04208936 -n07696728 -n13148208 -n01904029 -n08659861 -n07878785 -n07827130 -n03390983 -n02624807 -n03319745 -n03994614 -n00446493 -n12477583 -n02920658 -n04602956 -n02688273 -n07577538 -n04350581 -n09283405 -n04074185 -n04495843 -n03538179 -n03454885 -n03878211 -n10308168 -n08518171 -n02660208 -n07904760 -n07928367 -n10174445 -n02137015 -n02863426 -n07700003 -n04015908 -n03946076 -n11725821 -n01794344 -n04364160 -n01663782 -n04283255 -n02822064 -n04406239 -n02782681 -n11990313 -n03563460 -n02957008 -n07889814 -n07896060 -n03683079 -n04278447 -n13011595 -n11810358 -n03836451 -n12827537 -n03545470 -n03213538 -n07929351 -n03471190 -n02882301 -n03625943 -n03397087 -n11955896 -n04097373 -n03145522 -n03034405 -n02889646 -n02928299 -n09652149 -n01641391 -n04593524 -n07651025 -n03719343 -n03884778 -n03452594 -n02174659 -n12345280 -n03039827 -n03309687 -n11635433 -n02057330 -n01664990 -n09779790 -n02011016 -n09689958 -n07770763 -n03010915 -n03443912 -n02946509 -n13050397 -n03031012 -n04217546 -n04124202 -n12766869 -n04177041 -n12050533 -n03251932 -n03086580 -n03918737 -n04386792 -n03176594 -n01577035 -n01669654 -n01818832 -n10441962 -n03885904 -n03724756 -n02925666 -n03549589 -n03062122 -n02828427 -n12604228 -n03624400 -n07725888 -n03873699 -n01503976 -n02887079 -n03610098 -n02940385 -n04610013 -n03652100 -n04496872 -n04008385 -n02583890 -n10476467 -n03395514 -n03306385 -n04228581 -n02389261 -n12576323 -n01579149 -n01623425 -n02593019 -n03995265 -n02124484 -n12745386 -n04355267 -n02643836 -n01614343 -n03810952 -n04058594 -n12278650 -n03474779 -n02823510 -n00442437 -n12039317 -n04574067 -n03762602 -n02153109 -n03518943 -n04289827 -n02288268 -n07749969 -n04132985 -n03213826 -n04307986 -n03567066 -n02049088 -n04408871 -n03522003 -n09305898 -n04266375 -n08571898 -n03039259 -n01587526 -n03261603 -n00464277 -n02627532 -n02992368 -n03640850 -n03037404 -n04525191 -n02106854 -n07772147 -n04173511 -n12761284 -n03257210 -n02813544 -n07740342 -n04066270 -n03070059 -n03616428 -n02904233 -n03209910 -n04389854 -n03078995 -n03193260 -n01488038 -n01754533 -n12629305 -n02055107 -n11664418 -n04228693 -n03353951 -n03440682 -n03025250 -n03300216 -n02042046 -n04226826 -n03342015 -n03090000 -n02050313 -n03492250 -n01535690 -n01572654 -n03465718 -n02879309 -n06278338 -n04113406 -n03695857 -n09720256 -n01860002 -n02851939 -n09828216 -n02564270 -n03528901 -n02542432 -n11978961 -n01670802 -n03956623 -n01612275 -n09376786 -n03222318 -n02813645 -n02213543 -n13898207 -n03616763 -n03616979 -n11904109 -n04212282 -n04608435 -n02042472 -n04198453 -n03216402 -n02015357 -n12282737 -n02699629 -n12866635 -n02048353 -n02933340 -n01793715 -n12001707 -n02878222 -n03187037 -n03105306 -n04080705 -n04254009 -n01623880 -n02839592 -n03436182 -n01591123 -n01318279 -n03002816 -n13155095 -n03141702 -n03775388 -n12165170 -n03322836 -n03259401 -n04471148 -n03911767 -n12585629 -n04317325 -n04257986 -n03133050 -n02035210 -n12891305 -n11882426 -n04491388 -n12948251 -n03498781 -n04262161 -n03775636 -n09915651 -n07584332 -n07852614 -n11626152 -n03901750 -n09723067 -n04265904 -n09920283 -n02397744 -n03253796 -n07712959 -n03898129 -n01743936 -n02075612 -n04560292 -n03479397 -n04334365 -n04357121 -n10145902 -n03844673 -n09854421 -n12687957 -n12598027 -n03944138 -n01839750 -n07722888 -n04258859 -n03088389 -n03351434 -n03509608 -n01677747 -n03145147 -n12046815 -n03505133 -n01629962 -n03333252 -n03993703 -n02962061 -n04529962 -n03463666 -n07681691 -n12160857 -n04187233 -n09331251 -n11614713 -n04376400 -n12301445 -n12633994 -n03883524 -n11614420 -n13062421 -n03645011 -n03293863 -n11640132 -n02579928 -n02854739 -n04461437 -n07729384 -n02977936 -n02836392 -n03593122 -n01666228 -n07820683 -n07568502 -n11910460 -n09348460 -n09712324 -n02403740 -n03482877 -n04370774 -n07750146 -n12992177 -n03152303 -n04134008 -n09805324 -n01611800 -n04374315 -n07586099 -n02032222 -n01979874 -n04350769 -n02907873 -n03016609 -n02543565 -n03256166 -n03016737 -n02419336 -n03268790 -n03559999 -n07765999 -n04607035 -n02416104 -n02123917 -n12484784 -n03225108 -n10739391 -n03506880 -n02918831 -n03045228 -n12516828 -n01314663 -n04172342 -n02768226 -n12368028 -n01500476 -n01558149 -n03604156 -n04035912 -n02359915 -n12261571 -n03875955 -n01887623 -n03871371 -n03390786 -n12494794 -n03826039 -n04465358 -n03838298 -n03165466 -n04229737 -n01321770 -n04354026 -n02998003 -n04114844 -n10611613 -n03600475 -n01909906 -n00466880 -n04284869 -n07722485 -n04496614 -n03298716 -n02285801 -n04081699 -n07765208 -n12659539 -n11618525 -n11757653 -n07727048 -n03913343 -n12070016 -n02697675 -n04284572 -n02595702 -n04482297 -n03516996 -n03704549 -n02040266 -n04476116 -n01323261 -n03823216 -n07696403 -n03226880 -n09734535 -n03950537 -n01671479 -n03049924 -n12593994 -n04568841 -n03604400 -n01837072 -n01754370 -n03122202 -n12338454 -n04094720 -n04150980 -n03429682 -n03884926 -n03378005 -n02434954 -n03461288 -n02893692 -n04472563 -n10472129 -n04590021 -n07739344 -n04162433 -n03395859 -n12059314 -n03498662 -n03678729 -n02927764 -n02770211 -n11710393 -n07730207 -n04178190 -n07772935 -n03801880 -n04414675 -n12729521 -n12203529 -n04122578 -n04575824 -n06267655 -n03698360 -n02804515 -n02431337 -n08598568 -n02893608 -n02270623 -n00479440 -n11616662 -n02884994 -n04305323 -n02407625 -n04476831 -n04222307 -n03179910 -n11623967 -n00446311 -n00454983 -n02886434 -n12279458 -n03723781 -n11816121 -n02403231 -n11808299 -n07816296 -n03219483 -n02657694 -n00453478 -n02816656 -n02625851 -n04112752 -n03339529 -n12171316 -n02044517 -n04137773 -n01486838 -n03015149 -n12911673 -n03967270 -n03498441 -n11672269 -n03386870 -n11615967 -n02580679 -n01681653 -n02793199 -n02824319 -n10727458 -n02555863 -n01533000 -n02175916 -n12064389 -n04383015 -n02469472 -n03101664 -n03623338 -n12295796 -n02869249 -n01792042 -n03447075 -n04453390 -n04382438 -n04112252 -n03332393 -n12729729 -n01851207 -n04269270 -n12333771 -n06272612 -n03135532 -n02927887 -n11711537 -n12301180 -n04107743 -n01813948 -n03282295 -n09714694 -n00483409 -n01504344 -n04279353 -n04040373 -n12658308 -n04134523 -n10104064 -n12056601 -n04525417 -n07819166 -n12263038 -n02072798 -n03125057 -n03367410 -n04000592 -n03549897 -n01877606 -n01564914 -n12307076 -n02855925 -n03176763 -n12271933 -n04121728 -n07690511 -n02825442 -n04442441 -n01630901 -n03088580 -n02499808 -n10675010 -n01531971 -n02273392 -n01526521 -n01531344 -n03667664 -n02888270 -n04412416 -n07733394 -n04559910 -n04105704 -n11792341 -n04201064 -n01693175 -n04555291 -n02908773 -n01976868 -n03529175 -n03365231 -n03622839 -n04258333 -n03327133 -n03425769 -n12477747 -n03718935 -n11727540 -n07933799 -n03030262 -n12043673 -n02619550 -n07937461 -n12198286 -n08560295 -n12402348 -n01733957 -n12344700 -n02763604 -n11925303 -n01557962 -n03927299 -n11611758 -n03035252 -n09454412 -n04004990 -n03456299 -n02175569 -n03668279 -n12352990 -n03507241 -n01534155 -n12278371 -n02499022 -n03822767 -n01318381 -n04024983 -n04277493 -n11934616 -n02027075 -n11611561 -n03454442 -n02236355 -n01732789 -n07722052 -n01489501 -n04409625 -n10563403 -n01817263 -n07757511 -n03770316 -n02977438 -n01840775 -n03607923 -n03322704 -n02375302 -n01614038 -n01646555 -n03952576 -n02946824 -n12847008 -n03016389 -n11809594 -n03165096 -n03839671 -n02687821 -n01689081 -n03822656 -n02597608 -n12336727 -n01579578 -n03631922 -n03904909 -n11658331 -n04224543 -n12621410 -n03870672 -n04252331 -n09720842 -n01396048 -n11988596 -n00483205 -n02871005 -n01597022 -n02382039 -n07743902 -n02358890 -n07877961 -n05263448 -n01862399 -n04136800 -n10624540 -n11990167 -n02731398 -n03366974 -n03490006 -n01561732 -n02626265 -n10627252 -n12402051 -n08517676 -n10488656 -n03099274 -n03718581 -n11806219 -n01830042 -n07728585 -n03732114 -n10755080 -n03359285 -n07720277 -n03354207 -n01596273 -n04416005 -n01847253 -n07733567 -n09725653 -n04274985 -n00449977 -n07772274 -n12063639 -n01530439 -n01322508 -n04397768 -n07273802 -n04261281 -n10524076 -n01678343 -n03410938 -n01797020 -n02388832 -n07719616 -n03639497 -n09787765 -n07721018 -n11818069 -n04185529 -n11644462 -n12074408 -n00483848 -n01583495 -n11891175 -n03347617 -n03308481 -n02535258 -n07750872 -n07748157 -n02855701 -n04584373 -n02461830 -n02912557 -n12277578 -n03604311 -n03643253 -n03031152 -n04039742 -n03435743 -n13908201 -n04150153 -n03250405 -n01410457 -n02357401 -n12588780 -n12729315 -n01690149 -n02538216 -n03171228 -n02424909 -n06274760 -n03775747 -n04211857 -n12429352 -n12272239 -n11759853 -n03401129 -n12649317 -n02625258 -n12651611 -n03603442 -n02803934 -n03861271 -n02605936 -n02018368 -n12711984 -n02811936 -n04612026 -n01339471 -n02923682 -n09194227 -n04346157 -n03939178 -n12635532 -n01593028 -n01793249 -n02380464 -n12400720 -n07708398 -n12020941 -n12492106 -n12850336 -n12749679 -n02892948 -n12591017 -n03193423 -n01791463 -n11979527 -n12134025 -n12167075 -n09308743 -n13108545 -n01618503 -n07827284 -n07724492 -n02338145 -n04533946 -n01586020 -n07598256 -n01603953 -n12646740 -n03067518 -n04046277 -n01532511 -n07769584 -n11644046 -n12753573 -n02681392 -n08492461 -n07749446 -n04409384 -n01791954 -n12330891 -n04560882 -n10145480 -n04250473 -n02655848 -n02903126 -n11736851 -n11901294 -n12865824 -n03870105 -n00449892 -n04240752 -n11851258 -n04200537 -n12049562 -n01521399 -n03565830 -n07860447 -n03067212 -n01664674 -n07561590 -n02727141 -n02324514 -n02372952 -n01584853 -n07766173 -n11811706 -n03097362 -n04200258 -n02732572 -n01853195 -n12282527 -n09838621 -n02764505 -n04256891 -n12337617 -n12635955 -n07831267 -n11628793 -n12316572 -n07807834 -n02037869 -n01821869 -n02820556 -n04517211 -n01839086 -n03842986 -n07698401 -n02386224 -n07841800 -n01830915 -n11616486 -n11902389 -n03427202 -n12727101 -n01851573 -n02125494 -n07746186 -n11628087 -n07746551 -n03943115 -n11892029 -n02861022 -n11733312 -n01852329 -n09392402 -n12336224 -n07887099 -n03403643 -n04414199 -n07895100 -n02264232 -n02317781 -n07823460 -n07755929 -n02524202 -n04324297 -n11627512 -n01585715 -n02922578 -n00479887 -n02687423 -n02416880 -n11784126 -n12073991 -n01853870 -n01561452 -n04187970 -n10300154 -n02520147 -n12294124 -n07743224 -n12066018 -n11634736 -n02041678 -n11626585 -n02386141 -n03986949 -n07860331 -n12356023 -n12072722 -n03082280 -n12083113 -n12979829 -n01448594 -n03007444 -n07858978 -n01641739 -n02043333 -n12020736 -n02751215 -n04528079 -n01538200 -n07925608 -n12091550 -n03742019 -n03518305 -n01642539 -n03414029 -n04363991 -n03767966 -n02596067 -n01586374 -n02885882 -n04080138 -n11617631 -n02033779 -n09451237 -n02310585 -n12648045 -n03955489 -n01752736 -n07899899 -n02299505 -n01579410 -n02156871 -n02998841 -n03759661 -n02050809 -n02683454 -n11621950 -n02910145 -n04967801 -n07896661 -n11906917 -n12275675 -n11611233 -n07736692 -n02312640 -n12588320 -n04399537 -n12757303 -n04197781 -n12717224 -n11635152 -n03122295 -n01792955 -n13133932 -n02518324 -n01584695 -n02915904 -n02967294 -n04345201 -n03019434 -n02470238 -n03049782 -n03101517 -n12709688 -n03716887 -n02422391 -n12638753 -n00288384 -n02162561 -n02053584 -n01317294 -n03334291 -n07814634 -n12273768 -n12406715 -n11644226 -n01646802 -n03460147 -n12338796 -n01972541 -n02147947 -n03890093 -n04127395 -n01581984 -n01681328 -n02213239 -n04582869 -n03254189 -n03274265 -n03186285 -n11839823 -n01624833 -n09792969 -n07891189 -n12023726 -n07619208 -n03466600 -n01849676 -n12190869 -n03079136 -n12317296 -n13001930 -n00477639 -n02944459 -n03903733 -n04131208 -n12710295 -n12180885 -n11612349 -n03443149 -n03982331 -n04264765 -n12642090 -n03237416 -n13868944 -n04046400 -n11705171 -n11979715 -n12597134 -n01609956 -n01568294 -n01469103 -n00443692 -n01606672 -n04556408 -n07690019 -n03977592 -n03358726 -n12696492 -n01573240 -n11632619 -n01772664 -n03453231 -n04179712 -n03646020 -n01812662 -n04306592 -n07724654 -n13908580 -n02903852 -n04284438 -n13132656 -n04317063 -n07829248 -n01589718 -n02654745 -n12294331 -n12515925 -n07900825 -n07721195 -n04189282 -n11907689 -n01624537 -n12333530 -n07762244 -n11757851 -n01599159 -n04038338 -n01568892 -n12691661 -n09744834 -n04307767 -n03120778 -n07920540 -n03781683 -n04185804 -n12080820 -n04354182 -n07574426 -n02579303 -n03046802 -n12078172 -n03210245 -n01614556 -n02304432 -n07713267 -n09724656 -n02861147 -n12755387 -n01483830 -n12921868 -n12026018 -n07817871 -n12062781 -n04241573 -n11621727 -n03376159 -n11815721 -n13007034 -n03540090 -n00450866 -n11619455 -n01528845 -n01568720 -n12743352 -n02871314 -n03606251 -n01490670 -n04246060 -n02053425 -n10780284 -n01915700 -n04510706 -n00456465 -n01563945 -n11809094 -n09855433 -n04112579 -n03855333 -n09809925 -n03413684 -n02123478 -n12070712 -n03651843 -n02032355 -n01591005 -n01646648 -n02752615 -n02415829 -n03283221 -n04368496 -n01573360 -n02321170 -n10348526 -n04446844 -n07763792 -n12077944 -n04431025 -n02895438 -n10082687 -n07714188 -n02262449 -n03090172 -n12491017 -n01558461 -n12754781 -n04070415 -n04297098 -n03424862 -n01970164 -n09833536 -n01793435 -n01670535 -n09894445 -n09676247 -n01548492 -n12501202 -n03250089 -n03358380 -n02578928 -n12020184 -n02301935 -n03393017 -n12340755 -n01849863 -n01748906 -n03075946 -n01810268 -n01984245 -n04555400 -n12286988 -n04097760 -n02050586 -n12104238 -n01679962 -n02709101 -n01569060 -n12790430 -n01757901 -n13199717 -n11815918 -n07827410 -n02970534 -n12942572 -n07924276 -n04103918 -n11704093 -n07908647 -n07601686 -n12172906 -n04084889 -n02381261 -n02299157 -n11978713 -n12460957 -n02963503 -n03272810 -n12469517 -n03443005 -n01797307 -n02952237 -n11908549 -n13912540 -n03428226 -n10276477 -n01757343 -n01443243 -n01607600 -n03580518 -n12709103 -n07579688 -n04329834 -n12710415 -n11808932 -n10583790 -n02213788 -n11622184 -n12596709 -n02216211 -n07721942 -n07765361 -n01848453 -n11724109 -n02028451 -n02935017 -n12046028 -n10629939 -n00441073 -n07900958 -n12451399 -n02823964 -n04210120 -n01848840 -n10485883 -n07767709 -n02432704 -n11622591 -n03210372 -n07848196 -n11992806 -n02953197 -n07620689 -n01521756 -n03571625 -n03158186 -n12647560 -n02065407 -n01572782 -n09890749 -n05581932 -n07754451 -n03350204 -n13044375 -n12294723 -n12482893 -n04434531 -n12989938 -n12196336 -n01701859 -n07746334 -n11941924 -n02047411 -n12650379 -n10486166 -n01599556 -n01567879 -n12675876 -n01682435 -n02043808 -n12362668 -n12306089 -n02999138 -n01679626 -n03557270 -n01546039 -n11901759 -n01549053 -n11883328 -n06596727 -n03193107 -n11612018 -n03300443 -n03612010 -n03668488 -n12648888 -n01448291 -n11632167 -n10262445 -n09742101 -n09717233 -n04299370 -n03094159 -n04536595 -n03514693 -n02029706 -n02886321 -n07816052 -n04045255 -n01851731 -n02627292 -n01841288 -n02739889 -n02932693 -n03784896 -n04569063 -n07902799 -n03863108 -n02607470 -n13200651 -n07916183 -n01573898 -n04347119 -n10076604 -n13033577 -n01824035 -n03630262 -n04426316 -n03064250 -n12262018 -n12048399 -n12279772 -n04143140 -n07829331 -n12891643 -n01826680 -n12646605 -n13103877 -n02023855 -n03086868 -n04163530 -n03736470 -n04358117 -n13872822 -n03159640 -n01680655 -n11611087 -n03980478 -n02978478 -n01555004 -n12402840 -n07763987 -n04387706 -n04979002 -n03258330 -n09856671 -n11624192 -n01538059 -n02003839 -n12552309 -n10469874 -n01576076 -n03643149 -n04419868 -n04586581 -n00483508 -n03131967 -n01847407 -n07929172 -n09683757 -n03786621 -n04369282 -n12733870 -n11612575 -n11619227 -n03301833 -n02176439 -n01569971 -n07935043 -n02563792 -n02051059 -n04482177 -n11859472 -n11710136 -n04115144 -n07864934 -n07691758 -n02620167 -n07748276 -n03415486 -n07835921 -n00452152 -n01848323 -n12906214 -n12075010 -n01563449 -n01499396 -n01570267 -n12047345 -n07920989 -n07601572 -n02683558 -n04428634 -n04345028 -n12161969 -n03460040 -n02561514 -n02006364 -n03582959 -n11812910 -n13185269 -n04297847 -n07896165 -n01552813 -n12361946 -n02031585 -n12766595 -n11622368 -n11695599 -n11615387 -n02509197 -n12409470 -n01314388 -n11758799 -n09846469 -n02675219 -n04253057 -n04041243 -n12276628 -n04381724 -n01855188 -n02203152 -n04403925 -n11895092 -n11924849 -n04172904 -n11888800 -n01546506 -n07906718 -n01489920 -n03436417 -n03615655 -n07765073 -n02434190 -n02004492 -n12282235 -n12406488 -n11981192 -n10373390 -n13183056 -n04332074 -n12818346 -n07731006 -n02598573 -n02438580 -n01957335 -n03356982 -n10288964 -n02629230 -n02042759 -n12319414 -n01451426 -n03521675 -n02016066 -n01813532 -n13207335 -n11805544 -n04401828 -n02952109 -n03963294 -n10013811 -n12058630 -n01551711 -n01574560 -n01858780 -n10093818 -n03858183 -n01550172 -n03571280 -n02309242 -n10258786 -n01569423 -n10134178 -n08578517 -n04445327 -n03250279 -n02584449 -n03223553 -n04523831 -n04485423 -n02050442 -n04474035 -n04528968 -n02649546 -n01913166 -n09971273 -n04517408 -n02437482 -n03824713 -n03778817 -n07643026 -n01613177 -n12022054 -n07714448 -n07592768 -n00454493 -n03296328 -n02305929 -n03084834 -n03698815 -n12093600 -n08649711 -n03466493 -n04067658 -n03041114 -n03514451 -n01491006 -n04178329 -n03790953 -n03938401 -n02048115 -n07768858 -n03273740 -n10333601 -n05418717 -n12754003 -n02098806 -n03314608 -n01565930 -n12113195 -n12284821 -n12483427 -n04332580 -n10382710 -n03416094 -n02837887 -n03917198 -n14131950 -n04414476 -n11861641 -n11903671 -n01841441 -n09872066 -n01806467 -n04964799 -n00467320 -n01595974 -n03220692 -n01339083 -n01825278 -n11727358 -n04518343 -n11984144 -n07724269 -n02292692 -n02324850 -n01753032 -n01624115 -n11816649 -n07930062 -n02460451 -n12319204 -n04340521 -n12325234 -n01541102 -n02979836 -n00141669 -n01822300 -n11658544 -n12272883 -n03334382 -n11726707 -n03639077 -n07904934 -n03516367 -n03698723 -n03553248 -n11812094 -n03724417 -n01540566 -n02341974 -n11819912 -n07734555 -n02987379 -n03580845 -n12546962 -n02548247 -n12753245 -n07768423 -n12849279 -n11617090 -n02912894 -n07840027 -n12295033 -n12703383 -n02696165 -n10419785 -n04426427 -n03694639 -n11712282 -n04142999 -n01597737 -n03801533 -n01495493 -n07774719 -n03267113 -n01742821 -n03859170 -n03416640 -n03320959 -n12733218 -n02017725 -n13229543 -n09344324 -n04965451 -n01490112 -n10069296 -n12084555 -n04554406 -n04086446 -n02976249 -n02656032 -n02424486 -n02381609 -n09934337 -n04573937 -n07685399 -n02800497 -n02905152 -n02951703 -n07760153 -n03609397 -n00447463 -n03680512 -n02046939 -n03288886 -n11870418 -n03386544 -n07767171 -n07847453 -n12687044 -n01664492 -n03099147 -n03463381 -n02125081 -n12920204 -n03517647 -n02603540 -n12267411 -n11933546 -n11947802 -n04387095 -n12975804 -n02973904 -n13195341 -n04048441 -n11753143 -n03212114 -n03298858 -n04366116 -n01424420 -n10450161 -n01442972 -n07877299 -n04503593 -n04349306 -n12969425 -n12597466 -n03092656 -n07914995 -n03487886 -n12223569 -n01756733 -n13919919 -n04175147 -n02029087 -n03530511 -n02425887 -n03572107 -n03927539 -n03383099 -n04130907 -n01632601 -n07823105 -n10378026 -n02382850 -n07613266 -n03235180 -n02810782 -n12708654 -n11636835 -n02823124 -n03402941 -n12121610 -n03715114 -n04052658 -n00480366 -n12493208 -n04255163 -n12145477 -n01489709 -n12402596 -n01598074 -n03837606 -n02628062 -n04103364 -n03247083 -n02032480 -n07736256 -n12578916 -n09218315 -n02218371 -n03730334 -n02080146 -n03836906 -n02868638 -n02198859 -n12744387 -n02942460 -n11754893 -n12274358 -n02725872 -n09218494 -n03942920 -n07574780 -n02921756 -n01757115 -n02763306 -n11758122 -n10508141 -n02303284 -n04083800 -n13879049 -n12765115 -n12075830 -n02666943 -n11980318 -n07907037 -n12794135 -n02333909 -n03870980 -n07586718 -n11923174 -n10782471 -n01493146 -n12294871 -n11726269 -n12932173 -n07825972 -n12732009 -n03572321 -n07682197 -n03423306 -n12495895 -n03545756 -n03557692 -n03785237 -n07902937 -n09899671 -n12061614 -n07902443 -n01449374 -n12632335 -n03474896 -n03539433 -n04310904 -n03902482 -n12006930 -n03285578 -n04200000 -n03912218 -n07821260 -n03548626 -n03223686 -n11826198 -n03165616 -n02104280 -n09981278 -n09382099 -n03732458 -n03987990 -n09946814 -n12270741 -n07737745 -n04172776 -n10189278 -n03543012 -n12629666 -n02180875 -n04087432 -n12961879 -n03321954 -n12528549 -n02424085 -n09843443 -n03846677 -n12304703 -n09873473 -n03410571 -n03041810 -n02425228 -n01562451 -n03615790 -n10081204 -n03985881 -n07842130 -n02890513 -n03649797 -n02381004 -n12560621 -n12523475 -n07687626 -n11905749 -n11759404 -n12905412 -n03542605 -n03983612 -n12573474 -n11972291 -n03767459 -n02698634 -n12713866 -n13084834 -n02202006 -n13108323 -n02631475 -n10737103 -n03637898 -n03069752 -n12400489 -n09692915 -n10242328 -n02794664 -n12465557 -n12085267 -n03348868 -n12754981 -n02745611 -n10504206 -n12073554 -n02835724 -n04605572 -n02825961 -n03528523 -n12116429 -n02973805 -n12708941 -n01544704 -n04180229 -n09403211 -n08242223 -n02146371 -n12127768 -n09770359 -n03295246 -n01757677 -n04385799 -n02584145 -n07909593 -n12587132 -n13029326 -n04184316 -n07903643 -n01848555 -n10750031 -n02332156 -n12703557 -n03196990 -n12406902 -n02768973 -n12416073 -n02147591 -n09724533 -n09693982 -n12687462 -n01982068 -n03435991 -n03272125 -n07713763 -n03018712 -n03648431 -n03336575 -n07854184 -n12806015 -n07879174 -n03984643 -n03147280 -n02699915 -n07617708 -n01533651 -n12483841 -n01697611 -n02576906 -n03724066 -n03935116 -n09782397 -n01599269 -n10672371 -n12066630 -n03178674 -n15086247 -n03523987 -n02826068 -n12580654 -n02358390 -n01647640 -n10259997 -n03738066 -n13915023 -n02639605 -n03174450 -n12269406 -n09874428 -n03432061 -n04386051 -n03923918 -n04592465 -n12480456 -n10333439 -n04206790 -n01443831 -n02967626 -n07733712 -n03746155 -n12947313 -n11690254 -n12244650 -n12670758 -n08658309 -n12710693 -n11860555 -n03485198 -n03047799 -n04461570 -n07600177 -n02126640 -n12704343 -n02866386 -n03008976 -n04532831 -n03465426 -n12691428 -n01641206 -n04962062 -n03254046 -n04425804 -n02014524 -n03439348 -n02538010 -n11603246 -n12265600 -n12277800 -n04016240 -n12086192 -n09650729 -n01549641 -n03112719 -n04961062 -n02710324 -n12049282 -n12362274 -n11969607 -n12856680 -n02201000 -n07863802 -n03360622 -n07601809 -n04354487 -n12898774 -n12939282 -n03109693 -n12867826 -n12441390 -n12915811 -n12879527 -n04137355 -n04131368 -n03527149 -n10164492 -n09932508 -n12426623 -n12575812 -n02557318 -n10263790 -n04309548 -n00476235 -n04194127 -n11876634 -n10327987 -n03499354 -n02616851 -n04464615 -n03615406 -n02744844 -n11732567 -n10347446 -n09752519 -n04228215 -n10004718 -n07899533 -n12030908 -n15102894 -n12044467 -n11711764 -n02610066 -n03415749 -n04562496 -n02034295 -n02297442 -n03566193 -n12506991 -n07774842 -n12827270 -n14908027 -n12242409 -n04072960 -n02829596 -n12496427 -n02266050 -n13108481 -n12473840 -n08677424 -n12076223 -n15091473 -n02815749 -n04549028 -n12558425 -n12023407 -n04179824 -n02378541 -n03188725 -n12517445 -n07573347 -n02004131 -n11921395 -n12570972 -n10602470 -n12095647 -n03854421 -n02450295 -n02792409 -n03543735 -n12836337 -n12204175 -n12152722 -n07900734 -n12517642 -n02775039 -n12607456 -n03376938 -n12179122 -n09873348 -n01847978 -n07888816 -n10453184 -n09675922 -n01851895 -n12865562 -n01797601 -n03711044 -n02738859 -n12064591 -n04033425 -n08551296 -n01650690 -n01537895 -n04207151 -n10087434 -n12261808 -n09438844 -n10364198 -n01814755 -n01583209 -n12270946 -n11892817 -n03344642 -n04117464 -n07847917 -n04003241 -n10362319 -n10477713 -n03495570 -n07560542 -n04363777 -n04534359 -n02404906 -n03349892 -n07712267 -n02960352 -n07866277 -n07857170 -n00324978 -n02755823 -n03150511 -n04211528 -n01899894 -n07588299 -n11874081 -n03425325 -n04506506 -n11949402 -n02952374 -n03309110 -n12159388 -n07591049 -n03068998 -n03228254 -n10279018 -n04173046 -n07728053 -n13052931 -n01597906 -n12368451 -n02767665 -n09435739 -n03915900 -n09728285 -n03292603 -n03331077 -n07817160 -n07917392 -n12540250 -n04153025 -n10209082 -n03968581 -n12676534 -n11824146 -n03521899 -n01853666 -n04292921 -n12332030 -n03984759 -n02863014 -n07801091 -n07723177 -n03289660 -n01533481 -n04488202 -n03468821 -n02382338 -n03543254 -n01961985 -n07915918 -n03703862 -n02771004 -n02047045 -n03877674 -n13141415 -n03529629 -n02240517 -n03675235 -n04491638 -n12384037 -n04419642 -n03019685 -n07591586 -n04496726 -n12985420 -n12927013 -n12196694 -n03473227 -n11621547 -n02988066 -n10451450 -n07729828 -n09618760 -n12196527 -n01555305 -n12830222 -n11950877 -n13190747 -n12160303 -n12390099 -n02818135 -n03163381 -n04554211 -n03244919 -n07897975 -n03386726 -n04290615 -n02011281 -n12407890 -n04123448 -n07904865 -n03447358 -n02393940 -n07931870 -n02937958 -n04318787 -n04587327 -n12807409 -n04112430 -n07560193 -n12774299 -n02618827 -n07854982 -n03757604 -n03817191 -n12793494 -n02324431 -n03013850 -n04113641 -n01612476 -n03127408 -n02038466 -n03799876 -n04257684 -n03382292 -n10449664 -n04394630 -n10275395 -n07698250 -n12329473 -n07694659 -n07642742 -n02563648 -n08583455 -n02557182 -n02775178 -n09274152 -n03189083 -n12570703 -n04211219 -n12486574 -n03073694 -n11969166 -n02475078 -n02976350 -n08584914 -n07899660 -n10116702 -n01613807 -n12461109 -n04025508 -n12451240 -n12596849 -n12079963 -n03541269 -n04561422 -n11699442 -n07725255 -n03460297 -n07616748 -n12757458 -n03103563 -n02813752 -n07698782 -n12840362 -n01543632 -n01602832 -n01875313 -n12472024 -n02926591 -n02872333 -n10728624 -n12532564 -n03882960 -n12333053 -n03684224 -n13146583 -n03436075 -n04154340 -n03868643 -n02598878 -n04139140 -n03266371 -n04083309 -n12506341 -n12200143 -n03503477 -n12807773 -n03123917 -n13029760 -n10173771 -n03659809 -n12047884 -n12759273 -n04193377 -n04258438 -n04597400 -n04579986 -n03719743 -n04299963 -n02864504 -n10510245 -n03417970 -n09719794 -n03138344 -n02085272 -n07694516 -n12665857 -n01642257 -n03229244 -n10581890 -n10318293 -n03635108 -n10652605 -n12189429 -n09934774 -n11709205 -n04207903 -n10296176 -n10603851 -n03450734 -n13223588 -n12754648 -n09886403 -n07751280 -n11950686 -n07814390 -n12799776 -n01646902 -n09796809 -n12819728 -n01938454 -n02410011 -n07607138 -n02119634 -n10332861 -n09230202 -n02757061 -n02849885 -n15092227 -n12151615 -n03111041 -n02413050 -n03506560 -n07744057 -n04030518 -n12544539 -n04089836 -n02038993 -n13882201 -n12099342 -n01946630 -n10095769 -n02982416 -n12957924 -n13215586 -n07726525 -n12452836 -n03801671 -n04598318 -n01449712 -n12428747 -n04119751 -n10509063 -n07694839 -n02782602 -n11626409 -n02573704 -n12399384 -n12388989 -n01601068 -n11971406 -n04367011 -n07930315 -n12925179 -n04967674 -n03497352 -n03653833 -n01819465 -n03688192 -n02802990 -n03393761 -n04430475 -n13107694 -n10384496 -n07867164 -n12449526 -n01515303 -n12574320 -n01444339 -n07919310 -n03453443 -n04173907 -n02887489 -n07772788 -n03629520 -n02580830 -n11705387 -n12069679 -n01956344 -n02406533 -n03973402 -n03938037 -n04969952 -n04103094 -n04393808 -n07715407 -n04172107 -n01917882 -n12085664 -n07608429 -n09835230 -n04135024 -n07842605 -n12568186 -n04339879 -n07691091 -n01801876 -n00474568 -n01807105 -n12128071 -n01673282 -n11948864 -n03991837 -n09659188 -n02070174 -n02670683 -n12454949 -n10385566 -n11631854 -n12305293 -n12002428 -n12948495 -n12757816 -n11852028 -n10690648 -n09283866 -n03214582 -n03423877 -n04127521 -n03006626 -n09283193 -n07712559 -n01447331 -n02981321 -n02658531 -n11947629 -n02419634 -n02420828 -n11923637 -n12570394 -n11968931 -n12731029 -n09749386 -n07736813 -n03967396 -n11908846 -n03029445 -n02426481 -n01964271 -n13198914 -n04484432 -n12656685 -n10806113 -n11849983 -n03236423 -n10649197 -n07688624 -n03057541 -n12015221 -n02094931 -n02014237 -n07560331 -n02801450 -n04206570 -n07556406 -n11627908 -n11889619 -n07852229 -n04063154 -n02713364 -n02783459 -n12877838 -n02930214 -n02125010 -n02407276 -n07815424 -n12855494 -n12530818 -n07750449 -n01963317 -n10082997 -n03245724 -n03012013 -n03555006 -n02421136 -n03332989 -n04375405 -n03746486 -n12636224 -n03278914 -n07917133 -n12504783 -n09416890 -n03896526 -n02258198 -n12983048 -n03837698 -n12869061 -n04541987 -n01637615 -n04401949 -n02241426 -n13220122 -n07876651 -n03729308 -n02364840 -n01339801 -n03418915 -n09257843 -n11614039 -n09731343 -n03809603 -n05399243 -n01569262 -n11901597 -n03124474 -n01566207 -n03796522 -n12595699 -n04573281 -n09689435 -n11859737 -n03201529 -n12902662 -n03374372 -n03760944 -n09189157 -n01517966 -n10431625 -n02898269 -n03693707 -n04369025 -n07834618 -n04095342 -n02786331 -n03822504 -n02284611 -n09862621 -n03436891 -n07688898 -n12435777 -n03949317 -n12443323 -n12273114 -n12623077 -n04333869 -n07907831 -n07774596 -n05450617 -n03320262 -n04190376 -n12671651 -n11819509 -n07588111 -n09756049 -n07611046 -n04973291 -n11602873 -n00120010 -n03500699 -n03844815 -n03708843 -n04452528 -n04387261 -n09889065 -n10147121 -n03318294 -n12599435 -n04164406 -n01965529 -n11636204 -n11791569 -n12275131 -n02977330 -n07851443 -n04132603 -n07824191 -n09760609 -n12190410 -n07915491 -n12665271 -n10120671 -n02570164 -n10208950 -n02163297 -n02244797 -n09842528 -n08645104 -n01841679 -n11603835 -n04488857 -n07814487 -n01953762 -n04612373 -n11877193 -n03198500 -n03981924 -n01943087 -n11552806 -n04414909 -n03005033 -n02457945 -n10500217 -n10375314 -n04607242 -n07914777 -n09832456 -n12915568 -n12813189 -n10578021 -n03519081 -n07801779 -n12026476 -n03296081 -n03850492 -n07902121 -n09881265 -n12562785 -n03290195 -n10131151 -n10078719 -n01558765 -n03917814 -n02045596 -n07734183 -n03414676 -n07933154 -n02126787 -n12148757 -n12263987 -n07684164 -n03406966 -n01492569 -n02988963 -n12963628 -n09964202 -n03417749 -n01854838 -n02921029 -n02183096 -n11762433 -n11722466 -n02387093 -n02768655 -n12519089 -n09871229 -n07938313 -n10502329 -n11989393 -n03768916 -n13145040 -n11813077 -n04457910 -n03655720 -n03703945 -n11876803 -n01438581 -n07910379 -n07847827 -n02300797 -n09245515 -n10754189 -n04581102 -n12513172 -n02458135 -n03762332 -n11789589 -n09695620 -n03850053 -n07911249 -n12342852 -n12753007 -n07748574 -n07727458 -n03696568 -n04304680 -n07723039 -n07775197 -n07577144 -n03043693 -n04374735 -n01858281 -n09228055 -n09466678 -n01949085 -n02024479 -n11623815 -n02704645 -n07894451 -n01751472 -n01646388 -n01317916 -n13880994 -n10300500 -n11794024 -n03735963 -n04610274 -n11854479 -n07754894 -n02639087 -n02122510 -n02262803 -n12732966 -n04529108 -n13194036 -n09990777 -n10009276 -n12088223 -n12155009 -n07886176 -n04278247 -n04222723 -n11707229 -n01999186 -n07851641 -n12741792 -n01315213 -n10033412 -n04249582 -n03586631 -n03237839 -n12037499 -n12014085 -n07756325 -n01636352 -n03905947 -n08611339 -n07693590 -n03724538 -n09791816 -n01666585 -n10588965 -n11613219 -n10542608 -n12913791 -n10528023 -n03171635 -n11923397 -n12854600 -n10410246 -n12698598 -n04135118 -n09844457 -n04441790 -n03882611 -n02337001 -n07907342 -n12561169 -n12027658 -n10719132 -n09851165 -n02801823 -n12330587 -n01683558 -n12162181 -n04387932 -n11704620 -n09679170 -n07601290 -n04028221 -n10277027 -n09877750 -n11758483 -n10027246 -n03819336 -n10205231 -n12478768 -n03451711 -n12973443 -n01923025 -n03262717 -n07807594 -n00475535 -n07744430 -n02341475 -n04614655 -n07924747 -n03388323 -n12680402 -n03202940 -n04534520 -n09661873 -n15092059 -n11832480 -n04198355 -n12529220 -n12389130 -n12304115 -n03234952 -n07610620 -n02868975 -n04442741 -n05282652 -n02820675 -n12795352 -n12675299 -n08547468 -n04189651 -n04141198 -n04513998 -n12273939 -n12482668 -n12858618 -n01958346 -n03172038 -n10280674 -n04301760 -n02631330 -n12433178 -n07763107 -n03068181 -n07565259 -n03605598 -n13177884 -n04005197 -n09751496 -n12737383 -n07648997 -n09839702 -n09442595 -n07925229 -n12150722 -n11898775 -n09904208 -n02207345 -n07642361 -n07685918 -n03205458 -n10574538 -n09742315 -n02599557 -n03585682 -n04273659 -n02200850 -n03410740 -n03391301 -n07726672 -n09782167 -n13155305 -n02067240 -n07561848 -n07728708 -n12463134 -n12228229 -n09743487 -n12225563 -n03421669 -n03226375 -n03973945 -n12498055 -n04483925 -n04564278 -n11890150 -n12519563 -n12754468 -n04353573 -n11615607 -n04430896 -n04585128 -n10395828 -n10773665 -n02772435 -n09881895 -n12663023 -n01615303 -n12803754 -n09445008 -n03955296 -n05245192 -n05486510 -n07899769 -n07575510 -n02307681 -n03814817 -n02670186 -n03598515 -n12797860 -n03518135 -n07587962 -n12630763 -n06273743 -n09843824 -n03226254 -n12407222 -n02961544 -n12951835 -n06417096 -n02016659 -n01441117 -n07735404 -n09411189 -n13896217 -n03262248 -n03451120 -n02525382 -n03375329 -n04155068 -n12916179 -n10297234 -n11907100 -n03423568 -n04360914 -n12027222 -n12199790 -n01744270 -n09896401 -n07925116 -n03693860 -n04414319 -n07767549 -n03555564 -n04043411 -n07872593 -n03774461 -n03129471 -n04497801 -n11756870 -n09776346 -n04530283 -n01520576 -n12828220 -n01583828 -n04120842 -n09676021 -n04344734 -n01916388 -n12513613 -n09861863 -n02310334 -n03318983 -n04533499 -n02427576 -n12727518 -n04502059 -n11725480 -n11987126 -n11876204 -n03504205 -n09720595 -n12315999 -n12935609 -n04452757 -n12201331 -n01603152 -n10772092 -n03156279 -n12723610 -n02003037 -n03244775 -n07802963 -n11954642 -n07770034 -n09931165 -n10559508 -n01745902 -n07654148 -n10070108 -n01585287 -n13196003 -n04389718 -n10253122 -n03730893 -n02983357 -n02783900 -n01680813 -n03072440 -n03109253 -n03274435 -n11655974 -n10048612 -n07849733 -n07896994 -n03792334 -n03035832 -n03819448 -n03105088 -n11943992 -n01485479 -n01699675 -n11795049 -n12086778 -n01840120 -n07753980 -n10685398 -n04346428 -n04532398 -n07709172 -n02146700 -n09461069 -n03853924 -n01321456 -n12068432 -n09757449 -n03206282 -n03751757 -n13053608 -n11695974 -n12123741 -n03500209 -n04367371 -n02890940 -n01917611 -n07835331 -n02907656 -n04136045 -n12059625 -n03862862 -n12864160 -n00440039 -n03448590 -n12628986 -n04115802 -n03949145 -n12916511 -n12647893 -n09706255 -n13181811 -n07752109 -n04375615 -n01648620 -n04403524 -n09967967 -n12911079 -n03857687 -n02803539 -n01551080 -n10734891 -n13235159 -n04127633 -n07935878 -n12853482 -n10191001 -n03126385 -n10076224 -n01812866 -n12919403 -n03769610 -n09283767 -n03462110 -n11770256 -n12038898 -n09889170 -n11894558 -n10298647 -n02592055 -n02795670 -n11701066 -n12762049 -n02890662 -n07918193 -n02976455 -n03100897 -n13127843 -n12184912 -n00468299 -n12407079 -n12496949 -n03541537 -n05260127 -n01535140 -n01541760 -n11945783 -n07687053 -n07745046 -n12083847 -n02382132 -n12270027 -n10140597 -n03788914 -n01790711 -n02197689 -n03173270 -n10368624 -n04449290 -n01579729 -n07834872 -n07734417 -n02379630 -n01636829 -n12549192 -n12951146 -n13579829 -n03268142 -n11761202 -n02769669 -n09452760 -n04095577 -n12031139 -n02003577 -n12891469 -n03931885 -n01577941 -n04176295 -n12046428 -n03418402 -n13145250 -n11865874 -n12473608 -n11797321 -n01798168 -n09923186 -n02786736 -n01698782 -n09976283 -n03975788 -n14685296 -n01682172 -n07838441 -n02771286 -n03429137 -n03948950 -n02512830 -n02298218 -n10141364 -n02823848 -n02077384 -n12584715 -n11748811 -n02214773 -n03667552 -n04121426 -n04135710 -n07579917 -n12275888 -n07826453 -n12167436 -n04586072 -n09877288 -n04248396 -n02761696 -n03038870 -n01490360 -n12353203 -n09785891 -n12057660 -n04146343 -n12557556 -n02081798 -n02917964 -n07898617 -n12597798 -n07574176 -n07764630 -n03008177 -n04255899 -n04434207 -n07897600 -n09929577 -n11811921 -n12415595 -n02893941 -n12276110 -n02821202 -n09690621 -n02508742 -n02077787 -n02390640 -n03764822 -n02257985 -n13033134 -n04559166 -n07865196 -n10506915 -n12051103 -n10473917 -n12775919 -n02971579 -n12880462 -n11837970 -n02063662 -n09840520 -n12019827 -n09208496 -n12836508 -n02982232 -n04219185 -n03332005 -n07914128 -n07862461 -n04250692 -n09267854 -n04561734 -n02076402 -n12344837 -n02919148 -n06592281 -n03668803 -n03062985 -n04246731 -n12112609 -n04012482 -n03558633 -n03982642 -n01998741 -n07665438 -n04209509 -n07913882 -n01749244 -n07801342 -n02611561 -n04488742 -n01897536 -n10624437 -n13128976 -n07931612 -n04300643 -n03727067 -n03360431 -n07593471 -n10253296 -n03297226 -n03854506 -n07879450 -n10562283 -n12557438 -n13154388 -n12862512 -n02126028 -n07752514 -n02387887 -n12066261 -n07666176 -n02806530 -n09988703 -n03721252 -n03221540 -n12195533 -n02682569 -n03622058 -n03943266 -n04207596 -n11721337 -n02427032 -n07910152 -n01551300 -n12861345 -n11660300 -n03786313 -n12966945 -n02046171 -n02797535 -n03546112 -n07711232 -n02044908 -n02998563 -n02652132 -n12634986 -n12187247 -n11645590 -n07582892 -n03065243 -n09911226 -n04396902 -n10763075 -n02359047 -n10400108 -n04294614 -n03991646 -n11728945 -n07766891 -n12277150 -n13141564 -n10563314 -n12426749 -n07827750 -n12403994 -n12627119 -n03420801 -n10203949 -n12830568 -n12280060 -n13180875 -n12659064 -n04239436 -n03823312 -n04367746 -n12448700 -n01896844 -n07581931 -n09384106 -n11625223 -n04198722 -n01477875 -n09932336 -n03477512 -n12281974 -n10117739 -n07759194 -n12281788 -n01405007 -n03077616 -n02304036 -n12947544 -n03140126 -n12356960 -n07807002 -n07877849 -n02956795 -n04373795 -n07925500 -n10359546 -n09730077 -n01694955 -n10611267 -n04316498 -n07849912 -n12841354 -n07903543 -n10026976 -n04050313 -n03939844 -n03260849 -n07917507 -n12228387 -n03199775 -n01569566 -n02403920 -n04261638 -n02986160 -n03724623 -n01960177 -n03783430 -n07877675 -n10401639 -n04215153 -n03077741 -n02589623 -n12934985 -n03233624 -n04506688 -n12194147 -n09975425 -n07818825 -n12641007 -n10036692 -n02771750 -n12285900 -n01472303 -n10033663 -n10707134 -n03219966 -n11772879 -n10146416 -n10435169 -n10304086 -n12385566 -n03126580 -n12904314 -n03619196 -n02299846 -n03574243 -n12368257 -n03690473 -n01748686 -n09834378 -n07750736 -n02930645 -n01679307 -n03721047 -n02710044 -n07563207 -n02930080 -n09309168 -n03127203 -n02863536 -n02536165 -n01559639 -n09654518 -n02961035 -n12007406 -n12773651 -n04351699 -n03114504 -n06273414 -n02017475 -n01733466 -n02175014 -n07920663 -n03953901 -n09670521 -n09400987 -n11791341 -n02284884 -n12919646 -n07880325 -n03801353 -n01982347 -n07828642 -n01570421 -n03998333 -n03449309 -n10482220 -n12850906 -n12805561 -n12926689 -n03232543 -n04248851 -n03195959 -n04082562 -n03846100 -n07682952 -n07695652 -n11809271 -n09895561 -n04287898 -n09740724 -n02859955 -n09830400 -n03674731 -n02825153 -n04571686 -n13107891 -n10318607 -n07848093 -n13226871 -n08555710 -n03137473 -n02776978 -n03141455 -n12514138 -n01809371 -n09405078 -n01753180 -n02184473 -n11610215 -n03539546 -n12731835 -n04485884 -n03590588 -n10221312 -n04049753 -n03441345 -n02302244 -n12262185 -n15092650 -n11877646 -n10377185 -n01684578 -n03796605 -n07897116 -n03164344 -n12135049 -n10757050 -n01692523 -n04566756 -n07697699 -n07575392 -n10262655 -n04064747 -n07914006 -n12433769 -n07873348 -n04457767 -n10019072 -n02921195 -n03856465 -n04041408 -n12639584 -n12920955 -n11781176 -n07864756 -n03941013 -n03646148 -n04401578 -n11692792 -n02757714 -n02286089 -n04253168 -n03890514 -n07855510 -n03507458 -n04123026 -n11661909 -n12435152 -n04330746 -n09481120 -n03731019 -n03717285 -n03271030 -n02772101 -n07740597 -n02847852 -n12825497 -n12263738 -n03342262 -n03603594 -n07804543 -n12932365 -n12695975 -n10297531 -n04054670 -n03175081 -n12703856 -n03832144 -n03966206 -n02414290 -n03619275 -n09738121 -n03290096 -n10585077 -n07731767 -n12409840 -n12026981 -n02278980 -n02752810 -n01654637 -n02654112 -n10314836 -n13023134 -n01823414 -n07461050 -n11902982 -n04543636 -n02204907 -n04049585 -n12304899 -n03073545 -n04272928 -n10315456 -n03975657 -n09899782 -n12288005 -n07005523 -n03795269 -n09823832 -n02242137 -n02907391 -n03643491 -n03245889 -n12285369 -n03061345 -n03797264 -n07838073 -n09219233 -n02859343 -n07608098 -n03920641 -n12578626 -n10688356 -n04542858 -n07834065 -n00443803 -n04181561 -n04570214 -n02047517 -n03295012 -n01633781 -n10610850 -n04035836 -n03001115 -n04593376 -n02393807 -n13061348 -n10123122 -n11800236 -n13207094 -n10140929 -n12167602 -n01809752 -n10421956 -n02764935 -n03424489 -n12889219 -n04046091 -n07714287 -n07708685 -n07736087 -n04142434 -n11961446 -n04521863 -n02414763 -n02901377 -n00467536 -n13085747 -n03855756 -n11846765 -n02530999 -n03063199 -n04258618 -n12204032 -n04424692 -n11758276 -n02653497 -n03766508 -n02026629 -n02572484 -n12339831 -n01635027 -n01668436 -n07821919 -n01543175 -n02689748 -n12528974 -n04024862 -n04184880 -n11720891 -n13869896 -n01678043 -n01647303 -n11532682 -n03236217 -n04963307 -n03012897 -n11682659 -n03191286 -n07643891 -n12737898 -n10680609 -n07924955 -n03879705 -n10461060 -n02523427 -n02013567 -n09893344 -n04124488 -n09863031 -n12454436 -n12305089 -n07709046 -n03805180 -n11940599 -n01691217 -n04198562 -n03978421 -n02357585 -n07818572 -n12870682 -n03798442 -n04154938 -n10550369 -n11957678 -n01958531 -n09936825 -n02334201 -n07910538 -n11978551 -n10562135 -n12700088 -n12784889 -n04480853 -n03281673 -n07588419 -n02968333 -n11935469 -n13046669 -n11730602 -n09643799 -n11849467 -n01758757 -n09638454 -n03267468 -n07914586 -n12104734 -n02961225 -n09827246 -n09917214 -n13079073 -n12634734 -n04089376 -n13034062 -n11714382 -n12753762 -n07683039 -n11840067 -n07689842 -n12173069 -n12172481 -n04182152 -n07869522 -n10356877 -n02771166 -n03154895 -n07615289 -n12986227 -n12361135 -n03456447 -n12706410 -n12895811 -n02988156 -n03130761 -n10639359 -n03628215 -n02738741 -n01643507 -n07730708 -n03232309 -n02846733 -n04969540 -n03051041 -n12890928 -n03235327 -n04289576 -n07588817 -n10325774 -n03973285 -n09703485 -n02358584 -n03061674 -n03195332 -n02901259 -n07849619 -n04486934 -n07908812 -n01588725 -n03682877 -n11949015 -n04146504 -n04146862 -n07898247 -n03318865 -n04367950 -n07880213 -n04247011 -n01447658 -n12711817 -n03146687 -n02926426 -n12856091 -n11966896 -n02413593 -n09764900 -n03009794 -n03314227 -n10499232 -n10075693 -n04451318 -n12320806 -n11933728 -n07764315 -n12133682 -n09904837 -n12832538 -n03816530 -n07802863 -n04391445 -n09728137 -n03887330 -n04436012 -n03957991 -n07771731 -n06266973 -n10407310 -n10290919 -n07862244 -n01842504 -n10262561 -n12726159 -n07691954 -n07618119 -n03437829 -n11966617 -n03629100 -n04231905 -n04208760 -n03344305 -n03684143 -n12934174 -n08645212 -n03556679 -n12109365 -n03751458 -n02380875 -n02025389 -n02770721 -n09830629 -n02800675 -n04951186 -n04483073 -n12710577 -n12789054 -n12058192 -n11777080 -n07716203 -n09618880 -n04525821 -n04016846 -n02918330 -n10375052 -n13158512 -n13090871 -n02929582 -n02308735 -n10487182 -n02213663 -n07608339 -n04384593 -n12890490 -n03992436 -n02994573 -n13231078 -n12880244 -n01651059 -n02925009 -n09686401 -n13219976 -n09981540 -n04582771 -n06267758 -n09893502 -n13214340 -n03272940 -n12554911 -n02214341 -n04137089 -n03874487 -n04573513 -n12003167 -n12004547 -n13065089 -n01903346 -n04373428 -n02216365 -n02024185 -n12577895 -n11698042 -n07586318 -n11705776 -n03030353 -n04486213 -n07885705 -n07928163 -n02356612 -n02767038 -n02897097 -n11662371 -n04128710 -n09842395 -n07683360 -n11533212 -n08495908 -n12841193 -n03669886 -n07768068 -n02381831 -n12081215 -n02757337 -n02811618 -n10144338 -n01379389 -n09698644 -n12779851 -n10400618 -n11801891 -n12322099 -n12408077 -n02767956 -n08640962 -n07816839 -n03021228 -n10346015 -n07868830 -n07917272 -n10076957 -n12865708 -n04290259 -n03595264 -n03986224 -n07825194 -n01610100 -n04417086 -n12995601 -n12734070 -n15091129 -n12428412 -n07587331 -n02405101 -n03108455 -n03594523 -n04489695 -n03892425 -n13032618 -n04409011 -n07590752 -n15092942 -n03914583 -n13066448 -n03532919 -n10639637 -n04566561 -n13223843 -n07904637 -n12347158 -n02720048 -n03901229 -n03936466 -n10574840 -n03782794 -n12397431 -n07908567 -n12580896 -n02697221 -n09791419 -n02577403 -n07870069 -n02136103 -n04318892 -n01462544 -n09747191 -n12287836 -n03067093 -n03934565 -n03543945 -n13126856 -n02240068 -n01585422 -n12413301 -n03246454 -n01876034 -n03635330 -n11680596 -n03228365 -n03082656 -n11609862 -n12859986 -n03934229 -n10233248 -n03166514 -n12166793 -n10115430 -n03327553 -n03373611 -n02967782 -n12338258 -n01604968 -n01323155 -n02590094 -n03044934 -n07866409 -n12291143 -n14900342 -n12094612 -n07845702 -n07926250 -n10750640 -n04359500 -n09797873 -n09953350 -n03561047 -n12122725 -n12725738 -n01453087 -n04977412 -n04575723 -n13219833 -n12161056 -n04273285 -n12482437 -n12863624 -n04953296 -n03390075 -n10188957 -n02874442 -n04236935 -n09990690 -n12866459 -n04075715 -n09725000 -n12794367 -n12461673 -n03050453 -n03677115 -n12427391 -n07736371 -n02973236 -n02406749 -n12322699 -n12815198 -n10680796 -n03268311 -n02405799 -n12302248 -n09791014 -n01545574 -n07740033 -n07862095 -n09901337 -n04390577 -n03597916 -n12110085 -n11802586 -n04205505 -n07696527 -n12076852 -n04344003 -n03326660 -n02823586 -n03042139 -n01565345 -n07905296 -n01454545 -n07650903 -n07905386 -n12530629 -n02841187 -n02943964 -n03329536 -n09681234 -n03479121 -n03770085 -n04147793 -n11552133 -n03774327 -n13197507 -n07901355 -n10400437 -n07837912 -n02310941 -n07845087 -n02239774 -n04976319 -n03960490 -n05239437 -n06275471 -n01633406 -n04257223 -n12009420 -n10483138 -n02775897 -n07866151 -n07922512 -n02666624 -n03944024 -n03842377 -n01832493 -n07855907 -n03968728 -n04492060 -n07879072 -n11635830 -n11802800 -n02357911 -n02431628 -n03730494 -n13099999 -n07768230 -n13147270 -n12331655 -n10237676 -n11855553 -n09759501 -n10620586 -n13181055 -n12309277 -n13183489 -n04382695 -n07679034 -n10495756 -n02173113 -n12764202 -n03683457 -n10298912 -n07680313 -n10160280 -n02205673 -n12053690 -n11653904 -n02931294 -n04093775 -n12856479 -n02427470 -n07608866 -n09954639 -n11639445 -n03364599 -n09924106 -n09683924 -n10419472 -n03089753 -n12620969 -n07604956 -n12940609 -n12564083 -n03514894 -n10343355 -n13068255 -n03805280 -n12793284 -n03140652 -n02666501 -n11717577 -n04267435 -n04593185 -n12820853 -n03934311 -n02630615 -n07767002 -n07723968 -n01631354 -n07931452 -n12414818 -n03097673 -n09944430 -n04457474 -n11850521 -n12227658 -n10131815 -n12408717 -n03566730 -n12777680 -n06273555 -n04357531 -n03759243 -n09861599 -n03015851 -n04175039 -n03392741 -n07859796 -n07741138 -n04474187 -n02266864 -n04553561 -n02667244 -n12720200 -n12432356 -n07806120 -n10362557 -n11929743 -n07765862 -n02963987 -n02762371 -n02747672 -n04289195 -n04056413 -n03039493 -n03894677 -n12338655 -n04422409 -n12079120 -n10252222 -n10168837 -n12919847 -n10297841 -n01340014 -n11710827 -n10167838 -n12278107 -n01384164 -n10498986 -n02742468 -n02899439 -n11752937 -n12107710 -n12315598 -n03985441 -n07605804 -n07686202 -n12884100 -n13121349 -n11725311 -n10420507 -n11706761 -n01381044 -n03331599 -n12336333 -n10185483 -n07880880 -n01782516 -n12615232 -n03175457 -n12657082 -n01750437 -n07918879 -n13213066 -n12927494 -n02910542 -n06273986 -n02161338 -n10235024 -n12180168 -n03659950 -n02160947 -n11861853 -n09866817 -n09279986 -n12393269 -n01552034 -n05526957 -n02956883 -n12818966 -n09753792 -n03114236 -n12273344 -n12546617 -n13177048 -n02129991 -n01731941 -n01628770 -n12774641 -n07685546 -n03253279 -n10678937 -n12579038 -n08673039 -n01392275 -n02379081 -n10530150 -n12851469 -n12414449 -n11694664 -n11877283 -n09708889 -n03585438 -n00483605 -n12332555 -n03323096 -n07851767 -n02417663 -n10667863 -n02856237 -n09269341 -n01596608 -n09720033 -n13160604 -n04443164 -n02814428 -n11622771 -n10328123 -n04338963 -n01794651 -n12069217 -n07762740 -n02935387 -n11897116 -n10569179 -n12749852 -n10745006 -n07823280 -n12162425 -n09801533 -n03772269 -n04518643 -n07916319 -n12771597 -n02147173 -n10342992 -n03795123 -n11646344 -n12847927 -n07686021 -n12383894 -n04465050 -n14564779 -n04212467 -n12274863 -n02380052 -n04329958 -n12034384 -n04213353 -n04366033 -n04955160 -n02778294 -n12890685 -n03028785 -n03097535 -n04533594 -n01750167 -n01415626 -n12276477 -n07729926 -n07711371 -n12843970 -n10500419 -n12891093 -n03840823 -n12509665 -n11878101 -n04315342 -n07685031 -n12305819 -n10039271 -n12264512 -n03911866 -n13919547 -n12413419 -n03785721 -n02599347 -n03786194 -n04018155 -n12856287 -n09607903 -n02396088 -n10212501 -n10313000 -n07683617 -n03586219 -n03890233 -n03156767 -n12033709 -n01648139 -n04399846 -n10671736 -n07698672 -n10791115 -n07708124 -n02709908 -n04266968 -n01758141 -n10058962 -n09444783 -n03668067 -n02838345 -n02388143 -n12893993 -n12590499 -n01462042 -n02689434 -n13209808 -n04075291 -n02412629 -n01953594 -n03906463 -n03043423 -n02200509 -n10152763 -n12504570 -n04396808 -n03382413 -n03618101 -n02767147 -n02390101 -n03450974 -n12778398 -n03625539 -n02574271 -n04113316 -n07572616 -n11809437 -n04119230 -n03829954 -n10500603 -n04258732 -n02731900 -n10174330 -n01574801 -n08663703 -n12558230 -n03981760 -n07732904 -n11875523 -n11823436 -n03238286 -n03079494 -n04281260 -n07873057 -n11686912 -n10568608 -n07593004 -n04271531 -n10037922 -n07838551 -n03615300 -n12624568 -n12940226 -n05242928 -n03680734 -n01589893 -n11652376 -n11893640 -n04119091 -n09696763 -n07851554 -n02660640 -n12124818 -n10370955 -n02663211 -n02414209 -n13187367 -n03258577 -n04375241 -n07617932 -n12240477 -n03417202 -n07595649 -n03839424 -n03087245 -n02431441 -n04396335 -n03484809 -n03426285 -n03592931 -n02912319 -n03488887 -n12187891 -n07592400 -n12918609 -n07858114 -n07567980 -n01548694 -n02726210 -n02406859 -n10147262 -n05458576 -n02848921 -n03503233 -n02587618 -n03465151 -n03582508 -n11654293 -n03695452 -n02197185 -n04223170 -n10243273 -n03149135 -n02842809 -n03669534 -n03857291 -n02147328 -n12278865 -n12733428 -n03264906 -n09924195 -n10432189 -n12203896 -n03892728 -n12360958 -n10418735 -n01650901 -n12420722 -n03341606 -n02557909 -n07751858 -n03483971 -n12019035 -n03991202 -n02072040 -n03129848 -n04505345 -n02405440 -n03901974 -n11656123 -n11552976 -n10291822 -n10108018 -n09902731 -n03325691 -n12646072 -n04134170 -n12097396 -n07564008 -n01624305 -n03421117 -n02776007 -n10792856 -n07818133 -n03227184 -n10198437 -n04157099 -n12743009 -n07820960 -n12749456 -n13035925 -n05262698 -n03422771 -n02878628 -n12140903 -n07820297 -n03524745 -n09901921 -n03170872 -n10039946 -n12638964 -n11989087 -n03461988 -n04287451 -n04298053 -n07882420 -n04002262 -n02734835 -n11707827 -n07756641 -n12808007 -n10069981 -n12637123 -n12947895 -n04363082 -n04292080 -n11858077 -n04535252 -n12646397 -n12283147 -n12321077 -n02746595 -n02895328 -n07624924 -n12537253 -n11952541 -n02181477 -n01440160 -n03878828 -n12861541 -n02869563 -n04242084 -n03197201 -n09396608 -n04291992 -n07845863 -n04314522 -n12843557 -n04029647 -n12146654 -n13147386 -n12954799 -n11920133 -n03038480 -n03213715 -n02971473 -n04149374 -n04230387 -n00444340 -n11859275 -n07564796 -n02948403 -n10186068 -n04315713 -n02366002 -n02670935 -n13208302 -n10225931 -n07826340 -n04102872 -n02259708 -n11855842 -n09941089 -n08896327 -n10237464 -n12084158 -n03764995 -n03627954 -n12384375 -n10341343 -n07876189 -n04573379 -n07904293 -n07840520 -n12038038 -n03005147 -n10483799 -n02978367 -n01484285 -n13094273 -n04539053 -n01748389 -n10146816 -n07815839 -n12991837 -n03294604 -n03588841 -n04055180 -n03209477 -n09917345 -n04393913 -n12337391 -n12126084 -n01882125 -n07688130 -n02814116 -n09640715 -n12679593 -n12596345 -n03029925 -n11761650 -n04457157 -n12683096 -n07709881 -n03841290 -n13157684 -n07927836 -n03523134 -n03690279 -n10187491 -n12451070 -n02682311 -n03978815 -n11806679 -n07808022 -n01386354 -n03622526 -n02369293 -n11885856 -n02289610 -n12663359 -n02624987 -n13173488 -n03027001 -n07896765 -n11935330 -n07814790 -n04242704 -n09959142 -n07589543 -n03551582 -n07843117 -n03556992 -n02060569 -n04000998 -n03825271 -n11946918 -n02874750 -n03479502 -n09919451 -n02176747 -n02080713 -n03400972 -n10222170 -n07926785 -n07852302 -n03012373 -n10438842 -n12868019 -n03634034 -n04210591 -n07853560 -n12374862 -n09248399 -n04355115 -n12908093 -n12906498 -n12875269 -n02791665 -n03146777 -n02854378 -n12414159 -n07821610 -n07595180 -n12238913 -n12141385 -n10761190 -n12165758 -n01653223 -n12956367 -n03695753 -n12416703 -n12346813 -n03405111 -n04304215 -n01624212 -n12674895 -n09850760 -n12407715 -n04156040 -n11610437 -n03395256 -n09970822 -n04229959 -n02530831 -n07870894 -n12098524 -n12828379 -n04057215 -n10751152 -n10053439 -n03674270 -n07869291 -n12256920 -n02535163 -n04282231 -n02136452 -n02365108 -n10328328 -n02315487 -n03325403 -n09231117 -n03342657 -n09980985 -n10702167 -n11961871 -n02065263 -n12857779 -n03219612 -n07805966 -n10699981 -n07691863 -n12831932 -n04179126 -n10208189 -n09765118 -n07922147 -n01631512 -n01947997 -n01405616 -n01892030 -n07827896 -n12964920 -n07749870 -n03276696 -n10020670 -n11828577 -n07624666 -n10590146 -n02407521 -n10253703 -n03270854 -n11610047 -n12981443 -n12413642 -n12302565 -n03177059 -n04594114 -n10227985 -n07728391 -n10395073 -n02810270 -n03569293 -n07812046 -n03843316 -n12477401 -n03802643 -n07618029 -n10755648 -n12837803 -n12454556 -n01636127 -n02809241 -n03270165 -n12035631 -n02962414 -n09750641 -n01793085 -n04346003 -n07922041 -n04164002 -n12499979 -n03301291 -n07921834 -n09656077 -n07599161 -n13155611 -n10194231 -n10063635 -n03601442 -n10366276 -n00475661 -n03943714 -n10377291 -n02624551 -n02568447 -n07589458 -n09691858 -n02685995 -n11919975 -n01690466 -n13211020 -n04114069 -n10530383 -n04200908 -n12631932 -n07916437 -n03219859 -n07918309 -n10368291 -n10253479 -n03317889 -n13206178 -n02821415 -n10592811 -n12557064 -n12872458 -n10212231 -n07926346 -n09695514 -n09741816 -n03964611 -n07812913 -n09703708 -n02587479 -n10593521 -n03485309 -n03776877 -n12289433 -n07716504 -n10580030 -n03061893 -n03206158 -n09710041 -n04266849 -n07864065 -n12767648 -n02333190 -n12295429 -n02406432 -n01799679 -n07861983 -n02201626 -n03441582 -n03653975 -n02834506 -n12263204 -n10672662 -n03072682 -n03410423 -n11620389 -n04542095 -n07910970 -n03697913 -n02706806 -n09736798 -n12318965 -n07938594 -n12032429 -n03191776 -n04210288 -n01422335 -n03236093 -n11881189 -n02247216 -n12338146 -n03104512 -n00474881 -n04172230 -n01461315 -n04400109 -n10646140 -n02215621 -n10096126 -n03019806 -n11809754 -n02492948 -n10741367 -n10308504 -n07875560 -n02523110 -n07738224 -n02015797 -n10499631 -n03025165 -n03284308 -n03508881 -n10441037 -n10757492 -n07608721 -n09755241 -n04264361 -n04394421 -n03776997 -n03175843 -n04476526 -n02523877 -n13196369 -n10190122 -n03172738 -n02709763 -n02070624 -n04563560 -n04017807 -n03824589 -n07817758 -n03222722 -n01542433 -n13173259 -n04458201 -n12869668 -n12580786 -n02407763 -n09760913 -n10530571 -n11752798 -n09612700 -n07601175 -n11632376 -n10641223 -n03158668 -n03411208 -n01413457 -n03684740 -n10248008 -n12656528 -n11849271 -n07771891 -n12067433 -n12389727 -n11734698 -n04042204 -n07825399 -n12621945 -n07624757 -n03180732 -n09741331 -n10246317 -n04030414 -n07821107 -n04524716 -n03789603 -n12867449 -n10249869 -n02434415 -n07614103 -n03333349 -n04602840 -n09923996 -n02658811 -n13033879 -n03663433 -n02873623 -n07837545 -n12436907 -n02675077 -n01500854 -n04435552 -n01790304 -n11687789 -n03443543 -n09733459 -n01606177 -n12245885 -n11721642 -n02201497 -n12010815 -n04594742 -n02755984 -n07927716 -n04245218 -n03134118 -n13214485 -n12294542 -n12713521 -n03556173 -n12650038 -n07719058 -n04319774 -n10443830 -n10019187 -n09720702 -n07926442 -n10402709 -n03989777 -n11699751 -n09613118 -n02965122 -n04221076 -n01861330 -n12837052 -n02975589 -n09668437 -n03012499 -n01418498 -n12451566 -n03585778 -n07692517 -n09672590 -n09741999 -n09748648 -n07621264 -n03482001 -n10185148 -n01542168 -n12536291 -n07846557 -n11840476 -n03130866 -n02631775 -n11730015 -n03715275 -n07680168 -n12175370 -n05427346 -n03665232 -n08611421 -n11730458 -n02413484 -n09783884 -n07888378 -n04611351 -n02247655 -n02136794 -n11649359 -n01382033 -n07889193 -n10405540 -n03510384 -n04420720 -n03585875 -n03812789 -n01835769 -n12139921 -n09762011 -n10103228 -n03477410 -n11930788 -n10064831 -n12311045 -n07681805 -n03136504 -n12887713 -n03886940 -n03130233 -n10197392 -n12333961 -n07672914 -n12723062 -n12599661 -n04268799 -n03696909 -n12809868 -n12452256 -n10710778 -n02571652 -n12117326 -n02450677 -n03041265 -n12544240 -n01966377 -n10252354 -n02378625 -n09814488 -n10569011 -n13067330 -n07928998 -n07890970 -n02187279 -n02592371 -n07846802 -n03475961 -n05448704 -n10410996 -n02851795 -n10093167 -n12468719 -n09876701 -n03057724 -n03469031 -n02344270 -n04248209 -n02687682 -n04467899 -n12897788 -n03436656 -n12539832 -n09906704 -n03190458 -n11843441 -n12130549 -n11823756 -n03153246 -n03684489 -n04160036 -n02908951 -n12855365 -n03518230 -n12225222 -n12933274 -n10432957 -n02921406 -n10156831 -n12239647 -n02826812 -n03411927 -n11602091 -n13200986 -n04244847 -n01330126 -n14938389 -n03001540 -n04387531 -n03423099 -n07608533 -n11723986 -n07600394 -n12529500 -n02403820 -n02587300 -n10333317 -n07935288 -n12680652 -n01449980 -n12153914 -n07803310 -n11741797 -n01881857 -n13081999 -n08644045 -n02061217 -n02173784 -n02660519 -n03104019 -n13137951 -n04538403 -n02621258 -n04515729 -n04165945 -n11919761 -n13078021 -n07861247 -n11959259 -n11801665 -n04070545 -n13210597 -n10218043 -n10717337 -n01365885 -n10718952 -n11979187 -n03880032 -n03798610 -n03477303 -n01876667 -n11860208 -n03401721 -n03360133 -n13230843 -n13194758 -n13190060 -n02564935 -n13894154 -n12754311 -n07697408 -n13171210 -n02035402 -n03736147 -n10396337 -n04554998 -n02793930 -n04126852 -n03654826 -n09411295 -n06255613 -n01680983 -n10261862 -n01581874 -n10378780 -n10646641 -n03539103 -n03351151 -n04349913 -n03906106 -n02370525 -n03319576 -n04113968 -n09693244 -n02945964 -n03344509 -n04117216 -n03889626 -n03557840 -n09800469 -n04280487 -n07890890 -n12147835 -n12295237 -n03883664 -n04436992 -n02922877 -n10099002 -n01988203 -n10056719 -n11646517 -n03672521 -n04568713 -n10111358 -n03606347 -n04047733 -n12320627 -n10251612 -n10460033 -n01742447 -n11917835 -n10443032 -n13079567 -n04363671 -n10788852 -n10482587 -n03308614 -n12741586 -n12938667 -n04539407 -n01630148 -n02303777 -n13050940 -n04552551 -n02341288 -n04098169 -n04110439 -n11625391 -n12259316 -n02822762 -n10631131 -n04089152 -n03571439 -n04558199 -n12656909 -n03170292 -n02877642 -n12771890 -n03033267 -n12658603 -n13354021 -n12855886 -n11840246 -n03619050 -n07727252 -n12932706 -n13874073 -n01315805 -n02948942 -n12048928 -n03146449 -n10656969 -n09872557 -n03906590 -n04454792 -n12500309 -n04239333 -n01815036 -n09644657 -n10497645 -n02918455 -n07812662 -n04240434 -n10804636 -n11967878 -n04184095 -n11834272 -n05244755 -n02299039 -n12665659 -n12144987 -n07607492 -n11887750 -n13083461 -n04577139 -n09670909 -n07876893 -n02875948 -n04069582 -n10458111 -n10361194 -n09389867 -n01651778 -n11933387 -n13193143 -n12834190 -n03516266 -n02184589 -n10041373 -n02809605 -n04064213 -n04957589 -n12643113 -n02582721 -n07911061 -n07921360 -n10369417 -n10527147 -n04104925 -n03707372 -n01386182 -n10374849 -n09902851 -n08559155 -n02332447 -n11649150 -n11722036 -n01823740 -n04592356 -n10002257 -n10661732 -n07562379 -n07597263 -n04036776 -n13112201 -n09842288 -n07738105 -n04545984 -n09635973 -n02885233 -n02756854 -n07808479 -n03029296 -n01543383 -n02884450 -n09843716 -n04224395 -n10576676 -n10140051 -n07919894 -n07806879 -n10212780 -n09478210 -n12017127 -n03770224 -n07606191 -n03555217 -n09715165 -n12270460 -n12129738 -n11739365 -n02303585 -n07818029 -n05314075 -n03019304 -n09859975 -n09454744 -n13151082 -n12586989 -n00455076 -n07741357 -n04957356 -n08659242 -n04577293 -n04126244 -n03131193 -n12428242 -n03569494 -n03781594 -n07743384 -n02892392 -n12576695 -n12199982 -n07693439 -n07719756 -n11884384 -n03043798 -n12351091 -n03690168 -n02214499 -n01839949 -n01831360 -n12642964 -n02957862 -n03125588 -n12883628 -n04002371 -n10747965 -n09744462 -n02853745 -n13030337 -n12156679 -n02761034 -n12587487 -n03374570 -n12728322 -n01731764 -n07918706 -n03696445 -n03185868 -n02805283 -n03868763 -n02202124 -n12369665 -n12449934 -n12650229 -n02656301 -n07743723 -n11702713 -n02927053 -n03916385 -n01486010 -n03986071 -n04188064 -n13897528 -n12414329 -n07718068 -n07837755 -n11735570 -n10464542 -n04091466 -n01315581 -n10374943 -n03989898 -n13220525 -n04076052 -n04062179 -n02414442 -n04414101 -n04446162 -n00480885 -n03536568 -n03773835 -n10728998 -n12643877 -n02255391 -n03799610 -n07847585 -n00446411 -n11910666 -n03139998 -n02296276 -n02889996 -n02786611 -n10363445 -n07854348 -n08583682 -n09912681 -n07896422 -n02368821 -n11935953 -n12185254 -n11738547 -n03809211 -n02448318 -n13066979 -n01987076 -n12009047 -n12839574 -n13174823 -n07902520 -n03369866 -n13209129 -n02593191 -n03853291 -n02620578 -n10071332 -n01813658 -n09895480 -n10134760 -n01316734 -n07845166 -n03175983 -n13132156 -n12814960 -n12883265 -n03637787 -n04310507 -n04133114 -n03900194 -n04129688 -n04449550 -n01805321 -n01717467 -n01573627 -n12271451 -n11722621 -n09976917 -n12232280 -n12905135 -n03451253 -n01655344 -n12346986 -n11987511 -n10517283 -n02941845 -n12730370 -n03121190 -n07917874 -n10023656 -n10151133 -n07695187 -n03258456 -n10639238 -n10682713 -n02085019 -n12343753 -n10749928 -n04595611 -n04410565 -n08500819 -n07719980 -n04016479 -n03232417 -n03469832 -n09834885 -n07925327 -n10094782 -n03632100 -n12734215 -n09845849 -n04047139 -n10743124 -n02604954 -n12270278 -n03036244 -n11991777 -n10168012 -n02561803 -n10531109 -n10344319 -n03804211 -n10513938 -n10732967 -n09917481 -n02950482 -n03148808 -n07910245 -n07925423 -n07889990 -n04302988 -n07745357 -n04346511 -n07573563 -n02564403 -n12084400 -n10030277 -n09815455 -n04388473 -n12404729 -n10576316 -n12072210 -n11811059 -n01824344 -n03556811 -n03175301 -n07586485 -n13137010 -n11986729 -n04967561 -n03881404 -n07692114 -n07874995 -n02770585 -n07853345 -n02775689 -n04328580 -n01323781 -n07773428 -n02414043 -n02794474 -n02352932 -n07569873 -n12374705 -n03606106 -n04267246 -n04369485 -n11934239 -n12705698 -n11841247 -n07868045 -n03525693 -n12358293 -n02937010 -n09658398 -n12711182 -n03516647 -n04591631 -n10228712 -n11930353 -n03471779 -n12594324 -n02251593 -n04455579 -n02542017 -n03381450 -n03320845 -n12364940 -n09657748 -n12412987 -n01840412 -n10570704 -n10117267 -n03251280 -n10195261 -n12178129 -n12285049 -n02177775 -n10117415 -n03707766 -n04475309 -n05604434 -n03999064 -n12127575 -n01972131 -n09793946 -n01635176 -n02791532 -n07564101 -n07876460 -n02813981 -n10764719 -n03638743 -n12761702 -n02125689 -n11657585 -n09923003 -n13069773 -n02683183 -n04324515 -n11936946 -n12862828 -n02659808 -n02619861 -n13175682 -n11648039 -n07768139 -n12512674 -n12108613 -n02947977 -n12899971 -n03845107 -n07689490 -n02081927 -n07619508 -n10248377 -n10300041 -n10761326 -n09655213 -n02675522 -n04963111 -n01995686 -n03256631 -n10684630 -n04471912 -n12728864 -n03870546 -n02829246 -n09725546 -n03409920 -n13194918 -n10055297 -n02513248 -n01462803 -n11782266 -n13094145 -n07839478 -n13916363 -n07932454 -n09722817 -n07774479 -n10386874 -n12832822 -n01599388 -n02964295 -n04349189 -n07689313 -n11653126 -n02309841 -n02064000 -n04410663 -n04562122 -n02358712 -n09901786 -n10441124 -n12882158 -n12815668 -n10159289 -n01641930 -n03315990 -n12271187 -n10277638 -n07815163 -n12903014 -n07915366 -n04412300 -n01324799 -n03408264 -n09452291 -n03019198 -n11890884 -n10355806 -n03186199 -n04013600 -n12541157 -n06259898 -n06273294 -n11946051 -n01671705 -n04415257 -n01905321 -n04050600 -n12604460 -n04051439 -n02929184 -n11765568 -n10025060 -n02396796 -n04033287 -n13027557 -n03127531 -n10308066 -n09729062 -n01593553 -n02476567 -n07609728 -n12970293 -n01419888 -n03215749 -n01684741 -n13067672 -n03870290 -n07846359 -n12961536 -n03356559 -n07727140 -n09843602 -n02378755 -n12044041 -n01977485 -n07718920 -n12060546 -n04265428 -n12237855 -n04006067 -n10227266 -n04361937 -n12134486 -n10097842 -n02264591 -n03912821 -n07594155 -n03116163 -n11771924 -n04155457 -n12394118 -n10507380 -n01844746 -n11901452 -n03024233 -n03383562 -n11806814 -n10062716 -n04204755 -n08613733 -n12907671 -n03533654 -n09826605 -n03109033 -n07606419 -n03537085 -n11615812 -n07695504 -n11694300 -n04520962 -n09971839 -n02664285 -n03402511 -n02061560 -n13133140 -n03548195 -n12877493 -n02425086 -n12845187 -n12488454 -n02975994 -n02071028 -n01457407 -n03685486 -n07605282 -n07771405 -n07827554 -n10538733 -n03438780 -n04379096 -n12686496 -n10001764 -n11848867 -n12125001 -n09886540 -n03275566 -n01442710 -n12789554 -n07858197 -n12722071 -n12868880 -n10441694 -n12409651 -n07727741 -n12289585 -n04069166 -n12686877 -n03723439 -n07815956 -n12543455 -n10778044 -n02200630 -n10074841 -n12640284 -n12589841 -n07592317 -n07866571 -n12712626 -n04228422 -n11711289 -n03590475 -n13081229 -n03045800 -n03639230 -n02874214 -n07615954 -n03204134 -n12053962 -n12769219 -n15006012 -n09873769 -n11818636 -n01959029 -n03349599 -n12227909 -n07576969 -n03638180 -n07742224 -n03390673 -n02344175 -n03770520 -n00447361 -n13235319 -n01983674 -n10061882 -n04267165 -n12493868 -n12713358 -n02930339 -n10493419 -n12918810 -n02582220 -n12248359 -n02644501 -n04596492 -n04538249 -n07905618 -n13230190 -n07808268 -n15005577 -n09351905 -n12730544 -n11937023 -n04024137 -n02238358 -n11646955 -n11618079 -n09849990 -n04060448 -n04220805 -n12725940 -n12004120 -n01484562 -n02669442 -n12132956 -n01756916 -n03980986 -n02256172 -n07716750 -n12119390 -n04047834 -n11934041 -n12828977 -n03648219 -n11873612 -n12909614 -n04397860 -n03908111 -n03261395 -n03695616 -n11668117 -n12014355 -n02896074 -n03988758 -n04426184 -n10328696 -n02477028 -n04507326 -n04320871 -n03256472 -n01919385 -n03988926 -n13182164 -n07826250 -n03207548 -n01396617 -n04369618 -n07913774 -n13229951 -n03410022 -n12728508 -n01997119 -n03598783 -n01341090 -n03879456 -n01736796 -n02864122 -n13879816 -n02684962 -n12246037 -n02433729 -n04364397 -n09881358 -n02950120 -n03326371 -n02243878 -n01790812 -n12990597 -n03330947 -n07764486 -n03332173 -n10006177 -n03347472 -n07619301 -n10106509 -n12365285 -n01732989 -n07678586 -n04098795 -n07733847 -n03994297 -n12872914 -n02762909 -n07766530 -n13198482 -n02395855 -n12273515 -n04487894 -n07847047 -n12488709 -n02859557 -n04255768 -n02360933 -n03267696 -n03152951 -n10188715 -n10520544 -n13065514 -n02900594 -n03699754 -n01319187 -n01949499 -n10417424 -n01603000 -n12062105 -n09683180 -n09863339 -n01880716 -n10702615 -n03893935 -n10495555 -n04131499 -n02957252 -n02113892 -n07724078 -n12246941 -n04303095 -n01751215 -n04213530 -n12117695 -n12418507 -n01922948 -n12131405 -n13188767 -n01481498 -n03174079 -n02407172 -n11613867 -n10152616 -n10119609 -n04158250 -n11695085 -n07855105 -n02854630 -n03768683 -n12739966 -n12266984 -n12819141 -n12732605 -n13205249 -n11917407 -n01607429 -n02694279 -n07815294 -n06614901 -n07846471 -n12119717 -n02595339 -n12366186 -n10693235 -n12263410 -n12484244 -n10337488 -n04146976 -n01469723 -n07872748 -n03238879 -n12000191 -n07846938 -n03116008 -n12139196 -n04013176 -n10317963 -n12140511 -n02065726 -n01649556 -n10316862 -n01755952 -n04385079 -n12770529 -n02814338 -n01675352 -n11874423 -n01369484 -n10537708 -n07618281 -n07821404 -n02297819 -n03238762 -n03357081 -n02628600 -n07830986 -n12507823 -n04431925 -n11955532 -n03429771 -n10281896 -n12383737 -n12760875 -n09673091 -n12892013 -n06625062 -n04503269 -n03674842 -n12338979 -n04268275 -n12033139 -n11767877 -n07812790 -n12676134 -n04037873 -n10097477 -n12310638 -n12258101 -n09391386 -n13196738 -n13866626 -n12720354 -n10106995 -n07843220 -n03878294 -n04101375 -n07733217 -n10220080 -n04601938 -n10778148 -n12973937 -n10556825 -n12256708 -n12583855 -n04259202 -n07628181 -n04226962 -n02777402 -n09674412 -n12188635 -n03776167 -n04504038 -n04156591 -n02270945 -n02264021 -n07826653 -n02980203 -n02059852 -n02102806 -n12921660 -n04477725 -n10107173 -n12837466 -n02697022 -n04350688 -n12110236 -n02177196 -n07899976 -n12639910 -n02368399 -n10009162 -n03950647 -n09248153 -n02425532 -n04044955 -n11933257 -n03460899 -n10147710 -n02379743 -n02413917 -n02890804 -n12915140 -n02146879 -n07915800 -n01787006 -n03646809 -n11677902 -n04065909 -n02088992 -n02887832 -n10115946 -n02306825 -n03719560 -n10456696 -n03758220 -n12625003 -n04021503 -n07563366 -n02531625 -n10304650 -n12855710 -n09735654 -n07853762 -n03512030 -n12898342 -n02297938 -n12618727 -n04082344 -n12953712 -n12617559 -n03035715 -n02532451 -n05399356 -n03602686 -n10082423 -n04607759 -n07581607 -n07594737 -n04030965 -n03464628 -n12103894 -n03039353 -n03522990 -n02964934 -n03169063 -n10153865 -n09653144 -n09941571 -n12907057 -n07768318 -n02600798 -n02187150 -n01811243 -n12252383 -n04495555 -n07678953 -n13181244 -n13069224 -n13184394 -n12765402 -n03471347 -n10208847 -n03697366 -n09840435 -n02506947 -n09709673 -n07928578 -n11935715 -n07848936 -n02757927 -n01999767 -n02245443 -n10260473 -n13898645 -n02701260 -n07840219 -n11785875 -n12385830 -n12017664 -n12145148 -n04530456 -n01929186 -n02384741 -n04113038 -n03296217 -n09723819 -n03766697 -n12143215 -n09929202 -n02684248 -n12119539 -n03566555 -n12941220 -n04124573 -n10750188 -n07733005 -n04230707 -n03829857 -n07756838 -n12244458 -n12543826 -n03514129 -n02762169 -n04435870 -n03342863 -n09745324 -n12369476 -n11652039 -n03915320 -n07746749 -n07608641 -n12642600 -n02389943 -n12137791 -n04111962 -n12493426 -n12454793 -n01455317 -n10728117 -n03281524 -n12195734 -n12353431 -n02477329 -n02678010 -n04557522 -n10162354 -n14942411 -n07806043 -n12274151 -n09835153 -n03983499 -n04086663 -n07851926 -n07868684 -n11926976 -n03972146 -n04310604 -n09675799 -n13880704 -n13173132 -n07577918 -n10720964 -n11937102 -n03349020 -n12340581 -n03725506 -n03477143 -n10578162 -n01731137 -n03382104 -n11616852 -n01493829 -n09327077 -n03856335 -n03321843 -n02375757 -n02118643 -n08500989 -n03496486 -n04140777 -n12858987 -n02845293 -n04093157 -n07819682 -n10394786 -n12289310 -n02901620 -n01559160 -n07919165 -n12648196 -n11774972 -n11995396 -n10543937 -n10154013 -n03977158 -n01884476 -n12266528 -n11906127 -n12661538 -n04396650 -n12761905 -n04175574 -n10181878 -n12017326 -n12876899 -n09744346 -n07741706 -n04451636 -n07735981 -n03751590 -n03140546 -n03070396 -n03091223 -n12071477 -n07562017 -n09981092 -n09847344 -n12552893 -n12371202 -n02245111 -n01598271 -n04400499 -n02298095 -n15048888 -n02967170 -n04030161 -n10676434 -n01556514 -n13235766 -n02538562 -n12603672 -n03941586 -n02449183 -n07567611 -n12923257 -n02296021 -n11730933 -n12497669 -n02917742 -n07875926 -n02714535 -n13142182 -n02878107 -n07861334 -n02682811 -n03730655 -n03681813 -n12970733 -n02132320 -n12436090 -n07931280 -n04295353 -n12982590 -n01783017 -n13164501 -n02424589 -n01499732 -n12650805 -n04543509 -n10369699 -n03439631 -n13160116 -n07831663 -n05449196 -n13025854 -n10169241 -n02847461 -n10734963 -n13213397 -n03343234 -n12275317 -n02793414 -n04300509 -n01803893 -n11617878 -n02179192 -n03637480 -n04514648 -n03087521 -n10478827 -n11757190 -n12919195 -n04532504 -n01736375 -n04015786 -n04545471 -n12668131 -n04472961 -n14786943 -n07584938 -n02498743 -n07744559 -n10010062 -n10101308 -n07832099 -n02601767 -n10473453 -n02451575 -n02496052 -n03696746 -n12669803 -n07904072 -n04290762 -n11737125 -n07760755 -n12553742 -n12068138 -n12630999 -n02390938 -n02202678 -n02216740 -n02679961 -n13173697 -n11828973 -n02287987 -n04585318 -n10360366 -n07745661 -n03474352 -n07934800 -n12677612 -n03692272 -n13092240 -n04230487 -n11846312 -n12433952 -n11793403 -n03056873 -n05454833 -n12517077 -n12682882 -n02649218 -n09425344 -n07878283 -n02795978 -n10064977 -n12754174 -n02945813 -n01750743 -n03150661 -n13880415 -n12337800 -n04017571 -n09754907 -n04456734 -n02967540 -n10621400 -n11744471 -n01971620 -n04148285 -n10781817 -n11991549 -n12305654 -n03943833 -n10330931 -n12918991 -n01783706 -n11933099 -n12931231 -n07589967 -n09666349 -n07853445 -n12714949 -n03548533 -n04158672 -n03809802 -n03080309 -n12800049 -n02578454 -n02834027 -n10067600 -n03044671 -n04198233 -n07930205 -n04357930 -n12221522 -n11957317 -n03085781 -n03723885 -n03614383 -n02661618 -n04292221 -n03426574 -n03838024 -n10442093 -n12399534 -n01450950 -n07876550 -n11937446 -n09870096 -n02631628 -n05460759 -n01710177 -n03660562 -n04283784 -n01497738 -n02232223 -n04209811 -n12837259 -n02864987 -n04499810 -n12654857 -n03493792 -n09688233 -n02312912 -n10057271 -n07606058 -n03258192 -n10507565 -n11930038 -n08679269 -n03812263 -n11662128 -n04085574 -n07643577 -n03981094 -n02796412 -n02513939 -n07686634 -n07936979 -n03168774 -n03816394 -n07625324 -n04138131 -n10383094 -n10222716 -n10381981 -n12254168 -n13223090 -n03056583 -n09910556 -n03277004 -n12649866 -n02089725 -n03688707 -n09665367 -n07849506 -n02843909 -n13141797 -n02477516 -n09710886 -n03835941 -n11734493 -n10778711 -n10007809 -n02038141 -n12766043 -n02353172 -n02030224 -n10762212 -n06274921 -n13033396 -n03560860 -n01961234 -n13868515 -n03216199 -n01553527 -n04429038 -n10211036 -n02150885 -n02435517 -n02755675 -n09699020 -n12566331 -n03909516 -n02903727 -n02594942 -n04173172 -n04125692 -n12251001 -n02412787 -n01649412 -n01411450 -n01774097 -n09912907 -n03162556 -n07566231 -n12267534 -n03928589 -n04142327 -n11771147 -n07832592 -n04155177 -n07937621 -n07839864 -n03201895 -n13095013 -n10298271 -n03059103 -n03784793 -n11925450 -n03288742 -n02809364 -n04108999 -n04449449 -n03726233 -n07854455 -n03692136 -n12018447 -n03374282 -n06008896 -n07598928 -n03577312 -n04604806 -n09892513 -n04370600 -n08238463 -n01793159 -n07822687 -n03242390 -n07685303 -n03822361 -n01996280 -n10505942 -n06596845 -n04219580 -n12056990 -n10579062 -n10240082 -n10298202 -n07711907 -n03905730 -n12222900 -n07598622 -n04415815 -n12389932 -n12154114 -n04210012 -n12500751 -n03729402 -n12122918 -n04572121 -n12804352 -n02415130 -n12780325 -n11639084 -n12768933 -n02253494 -n13217005 -n03567788 -n12304286 -n10703480 -n07766723 -n05455113 -n07741804 -n12186839 -n01687128 -n01350701 -n03260206 -n07876026 -n12528382 -n04125541 -n10457444 -n01606097 -n11717399 -n04598416 -n12899166 -n09748101 -n12160125 -n07608980 -n07843348 -n02409038 -n02571167 -n09980805 -n09706029 -n02495242 -n12765846 -n10373525 -n12321873 -n03047171 -n12365462 -n03752398 -n02662993 -n10316527 -n10728233 -n06273207 -n01733214 -n12297846 -n12755876 -n02428842 -n02289307 -n04536465 -n03253187 -n02297294 -n05584746 -n03117642 -n12189779 -n10338231 -n07599649 -n04559994 -n12710917 -n09966470 -n12470907 -n04499300 -n12403075 -n11837743 -n02269657 -n12599185 -n07618587 -n03996004 -n12851094 -n03392648 -n01319001 -n12826143 -n12369845 -n01814549 -n10056103 -n12854193 -n02267483 -n04019881 -n03490649 -n04268142 -n10801802 -n12315060 -n10149436 -n04563790 -n09865068 -n03000530 -n10657556 -n07840672 -n12118414 -n02856013 -n02900459 -n04094859 -n12079523 -n11827541 -n12236160 -n02904505 -n02846619 -n09842823 -n12926039 -n02146201 -n03195799 -n12815838 -n09899289 -n01483021 -n02519340 -n05453815 -n10329035 -n02494383 -n09742927 -n13220355 -n03212406 -n11759609 -n10061431 -n12095281 -n04262530 -n03799240 -n02426176 -n04608809 -n12230540 -n13880551 -n11741175 -n11858814 -n11723452 -n07590841 -n12604845 -n10342543 -n12760539 -n09270657 -n02563079 -n10643937 -n12843316 -n01651641 -n07838811 -n04359034 -n07758260 -n02762725 -n11726433 -n03114743 -n01952029 -n12321395 -n11930571 -n12337922 -n12427946 -n12001294 -n12551457 -n13235011 -n02290340 -n06419354 -n12408873 -n01741442 -n12308447 -n10243872 -n03658635 -n03694761 -n02570484 -n12912801 -n04158002 -n02417785 -n01332181 -n03703075 -n10283366 -n03142431 -n02779609 -n02300554 -n09868782 -n10323752 -n03166809 -n03394149 -n02827148 -n02186717 -n01350226 -n03344784 -n03555996 -n04498873 -n13157481 -n04519887 -n12028424 -n12349711 -n10471640 -n07741235 -n04032936 -n12357968 -n10228592 -n13178284 -n04168840 -n13239177 -n03561573 -n02566489 -n11807696 -n07681264 -n02566665 -n10456070 -n10063919 -n10492727 -n01788579 -n11977660 -n02036228 -n02738978 -n03989349 -n10332953 -n12949361 -n09901502 -n07839730 -n13146928 -n10152306 -n04170515 -n11602478 -n02522722 -n01333610 -n13030852 -n02143891 -n12807624 -n04542329 -n12243693 -n12036226 -n13917690 -n02553028 -n02752199 -n10594857 -n11627714 -n04348070 -n13171797 -n04612257 -n07934373 -n04536765 -n02244515 -n04526800 -n04546595 -n02551668 -n12143405 -n07871588 -n07858484 -n03628728 -n13179804 -n03242264 -n12089846 -n07588688 -n07620047 -n01647466 -n09685233 -n03467254 -n12666369 -n05449661 -n10694939 -n12886600 -n12256522 -n04006330 -n03317673 -n04316815 -n12222090 -n04022866 -n04088441 -n07617526 -n10782362 -n04355821 -n13901490 -n12508618 -n03849943 -n04503499 -n13193466 -n09754633 -n07583978 -n13911045 -n07643679 -n12054195 -n10692090 -n04032509 -n10146927 -n02031298 -n04002629 -n04035748 -n10712229 -n02866106 -n07909504 -n04540397 -n06266878 -n10219879 -n12567950 -n07853648 -n03191561 -n07856045 -n12646197 -n03317510 -n10515863 -n13198054 -n02808829 -n12889579 -n02698473 -n09924437 -n03595055 -n12306270 -n07857356 -n09715303 -n03024518 -n04323519 -n09629065 -n04178668 -n12748248 -n02308618 -n07873198 -n10564098 -n03007297 -n04036155 -n02143439 -n10507482 -n12267931 -n03956331 -n12888234 -n04066476 -n07813107 -n02736396 -n10306496 -n12324388 -n01744555 -n01649726 -n06596179 -n03616091 -n07754279 -n02072493 -n12408280 -n04314632 -n02412700 -n04030846 -n09833997 -n03599964 -n05258627 -n12572759 -n12136581 -n02419056 -n12453714 -n11652217 -n03878511 -n03907908 -n12223160 -n10514121 -n04153330 -n12163279 -n12623818 -n03495671 -n13222985 -n10354754 -n04365112 -n12384680 -n12538209 -n03105214 -n12534862 -n13869045 -n03945928 -n11613692 -n11892181 -n13002209 -n02685253 -n07598529 -n02629716 -n13202355 -n07927070 -n02176916 -n04370955 -n11988132 -n03246197 -n01440467 -n07620145 -n03940894 -n01897667 -n03408340 -n12602612 -n02539424 -n03863657 -n04559620 -n02604480 -n11822300 -n03518829 -n11619845 -n10504090 -n03341035 -n02908123 -n04281998 -n03277602 -n03865288 -n10074578 -n13902793 -n03054605 -n04404200 -n12786836 -n12235051 -n04035231 -n12009792 -n12705458 -n04378489 -n02476870 -n11954798 -n03573848 -n02087314 -n03162460 -n04363412 -n02261063 -n09953615 -n01947139 -n03044801 -n04287351 -n04479287 -n03861596 -n12510343 -n07854066 -n03027505 -n12161577 -n04197878 -n01812187 -n10015792 -n08685188 -n11737009 -n10333044 -n02730568 -n10290813 -n13096779 -n05257476 -n07917951 -n12121187 -n03517509 -n07932762 -n02336275 -n12159942 -n12105981 -n02562971 -n13882961 -n12016777 -n02793684 -n12717644 -n01380754 -n07724173 -n04055861 -n11831297 -n03059934 -n03370646 -n10065758 -n09459979 -n07913644 -n04322531 -n03457451 -n02567633 -n04240867 -n10693334 -n10556704 -n04614844 -n07909362 -n12082131 -n09268007 -n04359217 -n09883807 -n02292085 -n04052346 -n03431570 -n02843465 -n04584056 -n04432043 -n09846142 -n07864317 -n04475749 -n04227050 -n04280845 -n03535284 -n07890617 -n03217889 -n02806762 -n11967315 -n11762927 -n02501923 -n03442487 -n09690083 -n02964634 -n02920164 -n07855317 -n10196725 -n03042829 -n11662937 -n12183816 -n12311224 -n13884261 -n02243209 -n03140771 -n02385002 -n03071288 -n12936826 -n04583022 -n07859142 -n04578112 -n04467506 -n12938081 -n09982152 -n12555255 -n03335333 -n10104888 -n12151170 -n12709349 -n10456138 -n02237868 -n07620327 -n12561309 -n12341931 -n12350032 -n01775730 -n12950796 -n01440242 -n04261767 -n10568915 -n12285195 -n07589872 -n13112035 -n07840395 -n11750508 -n12286197 -n03336168 -n03325288 -n02551134 -n04293258 -n13130014 -n07733124 -n04451139 -n11985903 -n03602365 -n11722342 -n11944751 -n12897999 -n02277422 -n03101302 -n07608245 -n03531982 -n01997825 -n11713370 -n04442582 -n02833403 -n04427857 -n01648356 -n10645223 -n10414865 -n10696101 -n12885045 -n10037080 -n12218274 -n07570530 -n04493259 -n10659042 -n10577710 -n03141612 -n10582604 -n00446632 -n02834642 -n07568389 -n04583888 -n04096848 -n12879068 -n04495051 -n09837459 -n12216215 -n03702440 -n10174695 -n10559009 -n10577182 -n07686299 -n04269668 -n02404028 -n03720665 -n09885866 -n03082450 -n12492682 -n12780563 -n03703463 -n02644360 -n02307910 -n01374703 -n04402342 -n04264134 -n03158414 -n04443433 -n12522894 -n10803978 -n11706942 -n10751026 -n13143758 -n02972934 -n04174234 -n12718995 -n11994150 -n11545350 -n12526754 -n07753448 -n02870772 -n11942659 -n11744108 -n12735160 -n12229887 -n04970312 -n02874336 -n10721819 -n13193269 -n03330665 -n09865162 -n10306595 -n12161744 -n03303669 -n07846688 -n02168427 -n01961600 -n03559531 -n09826821 -n03413124 -n09695019 -n03783873 -n11863877 -n13874558 -n02283617 -n11895472 -n13182799 -n07854614 -n03283827 -n01397690 -n02650413 -n09809279 -n10290541 -n10383505 -n11724660 -n07689757 -n10181547 -n07620597 -n11979354 -n02771547 -n13061471 -n12631637 -n11966385 -n03969510 -n11735977 -n07621497 -n12956588 -n03217653 -n04546081 -n11696450 -n10300654 -n02032769 -n01654863 -n09779280 -n02390258 -n03887512 -n10489426 -n10745770 -n10713843 -n03602194 -n10710913 -n07864475 -n04486322 -n07915213 -n08663051 -n10236842 -n02390738 -n02388453 -n03598385 -n12228689 -n11771746 -n12803226 -n11242849 -n02378149 -n10427223 -n05448827 -n11870044 -n12477983 -n12311413 -n03500090 -n10280034 -n02685365 -n03652389 -n12728656 -n07695284 -n09961198 -n03780799 -n03935883 -n01612955 -n12475774 -n02701730 -n07833535 -n12584365 -n03902220 -n12727960 -n10619492 -n04450465 -n10646780 -n10110731 -n04142175 -n12296735 -n09337048 -n12681579 -n12819354 -n12541403 -n04305016 -n12798910 -n10321126 -n08618831 -n09721244 -n02225798 -n01637338 -n12218868 -n05545879 -n12022382 -n03972372 -n02505063 -n01694311 -n10695450 -n10081842 -n12297507 -n07592922 -n12118661 -n01952712 -n10517137 -n01340522 -n07719330 -n03729482 -n04168541 -n03090710 -n07873679 -n07828378 -n07728284 -n10343088 -n07869937 -n14585392 -n01453475 -n12095412 -n04973020 -n12810007 -n07564515 -n01599741 -n11629047 -n09937802 -n12450607 -n12460146 -n02292401 -n03632963 -n09617696 -n12545232 -n02874642 -n09934488 -n10091349 -n01447946 -n05469861 -n11830400 -n03382533 -n02608547 -n12697152 -n03542727 -n10716576 -n03664159 -n07568625 -n02976815 -n13147532 -n02336826 -n12432574 -n07686461 -n04107598 -n02505998 -n09849167 -n03688066 -n02836513 -n01576358 -n01893021 -n12017511 -n12065649 -n01714231 -n11662585 -n12827907 -n12954353 -n11936199 -n01368672 -n03843883 -n12184095 -n10058411 -n11684654 -n08506347 -n10579549 -n01423302 -n11604046 -n07613158 -n03605504 -n02090129 -n02284224 -n01958435 -n12664469 -n04459122 -n09617161 -n09780828 -n11830252 -n12870048 -n04247544 -n09871095 -n02962938 -n09933020 -n13064457 -n10341243 -n07694169 -n13200193 -n07765728 -n01524761 -n07730562 -n07751737 -n07740855 -n04192521 -n12593122 -n07841037 -n02809736 -n10604275 -n12512095 -n01907287 -n04592596 -n09823153 -n03181667 -n12449784 -n07908923 -n12365900 -n03053976 -n15060688 -n04165675 -n02530637 -n09816654 -n12540966 -n07934152 -n09290350 -n03455802 -n10111779 -n01351315 -n10281770 -n13862552 -n12435486 -n12370174 -n12296045 -n03493219 -n12363301 -n11973749 -n03939565 -n02938321 -n13209270 -n12604639 -n12657755 -n03604536 -n10328941 -n04278932 -n10376890 -n01884203 -n02061853 -n04256318 -n07831821 -n10585217 -n07591813 -n10210648 -n07739035 -n01632308 -n10319313 -n02861777 -n03821145 -n13029610 -n04239900 -n10313441 -n04951716 -n10628097 -n02368116 -n08571275 -n04433377 -n10458596 -n12435965 -n12448136 -n12129986 -n04295777 -n07898895 -n07854266 -n12327846 -n12318782 -n07825850 -n10414239 -n11731157 -n04409911 -n10655442 -n11829205 -n01738306 -n02840515 -n04150371 -n03369512 -n02645538 -n12773917 -n07818422 -n03227010 -n10303037 -n12942025 -n12406304 -n06616216 -n02435216 -n12981954 -n03683341 -n09703809 -n07722666 -n11817160 -n10110893 -n10228468 -n03572631 -n01378545 -n02130086 -n04388574 -n11960673 -n12956922 -n11924014 -n09895902 -n03426462 -n07759576 -n02563949 -n03466947 -n02522637 -n09480959 -n02033882 -n02451415 -n12677120 -n10580437 -n04425977 -n03057841 -n12285512 -n07614348 -n03144873 -n03391613 -n12366870 -n02304657 -n07863935 -n07909714 -n02413717 -n12591702 -n07838659 -n02967407 -n12016914 -n02735268 -n09470027 -n10222259 -n03899100 -n10513509 -n11620016 -n12600267 -n04368840 -n03016209 -n04085017 -n03215076 -n10238272 -n09782855 -n07586179 -n12434483 -n12452480 -n01990516 -n12030092 -n11739978 -n12714254 -n13036804 -n07727377 -n07879560 -n03710421 -n12128490 -n11968519 -n03250588 -n10173579 -n03114041 -n02942015 -n12729164 -n07871065 -n02591330 -n09353815 -n10138472 -n02712545 -n12866333 -n07835823 -n03508485 -n01758895 -n02925385 -n03321419 -n09931418 -n02846874 -n12500518 -n07587819 -n03160186 -n04974340 -n13067532 -n11940349 -n13027879 -n02878534 -n10055566 -n07925708 -n12628356 -n11958499 -n03472672 -n04233295 -n04563020 -n03426871 -n04330109 -n03677682 -n04129766 -n02884859 -n12692521 -n10188856 -n03500971 -n10355306 -n12407545 -n11955040 -n10028541 -n10345659 -n14720833 -n09641578 -n12613706 -n11718296 -n03380301 -n01334217 -n03890358 -n03583419 -n12447121 -n09660010 -n11826569 -n11837351 -n12096089 -n03871860 -n01821554 -n12834938 -n02738449 -n02644665 -n03316873 -n12548564 -n03605417 -n12094401 -n13152339 -n03004531 -n03080904 -n03535647 -n12349315 -n04213264 -n07860208 -n01526766 -n03710937 -n11806521 -n10618234 -n12306938 -n10473562 -n10050880 -n04596116 -n02577164 -n04479694 -n07936093 -n07834286 -n12175181 -n03986857 -n02919648 -n12055073 -n04567593 -n07585015 -n12771085 -n10551576 -n09778783 -n01593282 -n02406952 -n12331263 -n10629329 -n12287195 -n07729225 -n07828041 -n01880473 -n12257725 -n02696246 -n07853232 -n11936864 -n09745229 -n03364156 -n04503155 -n03194297 -n04003359 -n07607361 -n10106387 -n10306890 -n10455619 -n01647180 -n07740115 -n12106323 -n03626272 -n11685621 -n11866706 -n04321121 -n01606978 -n12621619 -n11615259 -n07840304 -n02841847 -n05459769 -n03432360 -n04604276 -n12356395 -n12468545 -n03645168 -n00477827 -n03459591 -n04202142 -n12959074 -n07881625 -n12382233 -n02405692 -n12299640 -n12247202 -n12628705 -n12534625 -n09264803 -n12176953 -n09835017 -n10390807 -n04975739 -n12474418 -n11931135 -n07917791 -n10636488 -n09690496 -n11993675 -n03703203 -n11794139 -n13015688 -n04168084 -n01948446 -n10169419 -n04455048 -n04973669 -n12840502 -n12120578 -n10448455 -n01386007 -n02288122 -n01441910 -n02278463 -n03108759 -n02753710 -n03143400 -n13080866 -n13917785 -n13124358 -n13220663 -n02475358 -n01925916 -n02684649 -n10451590 -n03869976 -n03881305 -n07928264 -n01422185 -n04035634 -n11996677 -n04261369 -n12925583 -n12764008 -n09972587 -n03708962 -n01791388 -n02892626 -n04098399 -n07823369 -n07752874 -n13225244 -n03376771 -n01771766 -n13146403 -n12157179 -n13897198 -n07770869 -n13240362 -n07610502 -n03688504 -n02896856 -n12543186 -n09967063 -n05453412 -n12590600 -n02378870 -n07568241 -n01687290 -n00474769 -n11694866 -n02338722 -n02637977 -n04567746 -n10586444 -n11907405 -n03421960 -n07605693 -n10384214 -n12877637 -n12018363 -n10056611 -n13882487 -n12140759 -n04114301 -n11762018 -n12678794 -n11817501 -n02116450 -n12018530 -n03324629 -n12726528 -n03155502 -n10493199 -n04181083 -n10609198 -n04328703 -n03045074 -n07769886 -n01892385 -n12828520 -n03165211 -n11800565 -n07567139 -n13877547 -n12829582 -n02949084 -n07589724 -n01746191 -n12395463 -n05459457 -n10565502 -n11981475 -n09310616 -n12327022 -n02313709 -n12957803 -n11865276 -n12955414 -n12939479 -n13225365 -n07936459 -n03139089 -n07577772 -n12057895 -n03620353 -n12152031 -n01885158 -n04096733 -n12626674 -n10464711 -n10675609 -n07752782 -n03709960 -n02540983 -n02285179 -n01903234 -n07835701 -n04421083 -n02352290 -n09421031 -n03349367 -n02539894 -n04052235 -n07922955 -n03941887 -n04234260 -n04423552 -n11975254 -n08501887 -n12489676 -n04574348 -n10602119 -n02163008 -n02748491 -n10024937 -n10033888 -n12605683 -n01790398 -n10128519 -n14977188 -n10293590 -n12077244 -n09741074 -n11694469 -n12692714 -n12159804 -n12533437 -n03831203 -n03692004 -n09462600 -n04537436 -n06618653 -n07913537 -n12783316 -n10038119 -n10236521 -n01486540 -n07875267 -n04345787 -n07681355 -n13028937 -n03607186 -n07863107 -n12387103 -n09830926 -n03574416 -n04478383 -n11685091 -n03197446 -n03225458 -n09741722 -n07736527 -n02857907 -n10177150 -n12711398 -n10308275 -n02418770 -n02577662 -n09935107 -n03362639 -n12446908 -n04329681 -n04114428 -n09624899 -n12913144 -n12338034 -n02341616 -n12360817 -n12907857 -n02414904 -n05482922 -n11974888 -n04127117 -n12581110 -n04368365 -n01699254 -n12525753 -n04254450 -n11951052 -n12458874 -n12721477 -n07562651 -n02239192 -n10533874 -n12006306 -n09537660 -n10008123 -n02788386 -n03248835 -n04491312 -n11795580 -n04025633 -n10166189 -n07703889 -n11824747 -n07605198 -n12134836 -n03591116 -n02946753 -n13212025 -n11742310 -n02328820 -n02985606 -n09955944 -n12679432 -n10020366 -n12013035 -n02942147 -n04172512 -n11802410 -n10789709 -n03385295 -n02039497 -n01416213 -n11940750 -n12178780 -n01967963 -n12662379 -n12217851 -n02812631 -n12432069 -n09991740 -n03089477 -n12458713 -n03876111 -n10311661 -n12286068 -n02838958 -n11936369 -n03716228 -n13228017 -n06276902 -n12677331 -n04330189 -n10488016 -n12011370 -n04343740 -n07893792 -n02171164 -n03963483 -n12080588 -n07577657 -n12936155 -n03809686 -n04223066 -n04086066 -n12776558 -n07813579 -n01841943 -n12285705 -n02581482 -n11653570 -n10010632 -n04305947 -n12228886 -n12797368 -n01404495 -n09697986 -n11882237 -n10077879 -n07607832 -n09779461 -n13212379 -n10769188 -n10715789 -n01480106 -n02145910 -n04275093 -n01983829 -n01978010 -n09937903 -n11976314 -n11785276 -n12386945 -n04445782 -n10712374 -n10706812 -n10194775 -n12655062 -n10739135 -n02597972 -n02307176 -n04121342 -n02350670 -n12698027 -n02805845 -n02895008 -n13149970 -n03451365 -n04542595 -n07803895 -n07864198 -n09690864 -n03844550 -n12378249 -n10345422 -n13163553 -n10457903 -n10783539 -n10539015 -n11757017 -n10274173 -n08652376 -n10283546 -n04541777 -n02824152 -n12945177 -n02082056 -n03695957 -n07936015 -n07591162 -n03628071 -n02990758 -n07685118 -n04023422 -n04951875 -n03541393 -n10289176 -n04039209 -n07913180 -n07910799 -n12017853 -n03732543 -n10656120 -n10512859 -n04556664 -n12464649 -n12927758 -n12078451 -n07878145 -n10561320 -n12467592 -n07689217 -n07619881 -n11935187 -n09837720 -n03642144 -n12220019 -n02983507 -n03271260 -n02778588 -n10193650 -n01654083 -n02746978 -n10202763 -n02953552 -n07924366 -n08583554 -n02905886 -n07855603 -n09745834 -n12366053 -n04140539 -n03383211 -n11648268 -n03352961 -n12116734 -n07771539 -n07836077 -n03842754 -n11683838 -n03004409 -n11730750 -n13098962 -n12292463 -n02867592 -n01653026 -n07583865 -n12548804 -n12702124 -n03917048 -n12677841 -n12511488 -n04217387 -n12495670 -n03554375 -n12403513 -n08558770 -n02781764 -n12339526 -n12742290 -n01404365 -n03591798 -n12446737 -n10494195 -n12110352 -n01672611 -n10493922 -n03638623 -n09910840 -n02238594 -n02575325 -n13186546 -n11873182 -n10344774 -n04094060 -n10417682 -n02749169 -n02428089 -n04549721 -n03824284 -n12107002 -n12784371 -n09986904 -n01634227 -n07826544 -n12253487 -n01679005 -n12516165 -n09339810 -n03126090 -n07803408 -n11883945 -n03842276 -n03397412 -n03280216 -n12264786 -n02545841 -n11877860 -n01830479 -n13207923 -n12490490 -n02542958 -n04114719 -n12590715 -n13226320 -n11644872 -n04119630 -n10176913 -n04213105 -n11652966 -n12546420 -n12625823 -n11897466 -n02092173 -n10567613 -n04953678 -n10059067 -n12408466 -n03056288 -n13036116 -n04169597 -n12467197 -n02569905 -n02758490 -n12623211 -n04077889 -n04959061 -n04183957 -n11689815 -n03777126 -n03306869 -n07720084 -n02659478 -n12947756 -n04341288 -n04448185 -n04037076 -n09828988 -n03346289 -n04174705 -n13126050 -n04255346 -n09764732 -n11773628 -n14891255 -n04314107 -n02184720 -n02646892 -n04320598 -n01979526 -n03191451 -n03662452 -n10290422 -n01739094 -n02305636 -n04202282 -n05459101 -n02766168 -n09994808 -n03528100 -n10475940 -n03005619 -n12639168 -n02144936 -n13202125 -n10703221 -n03770834 -n12324056 -n03474167 -n02609302 -n12166929 -n12852570 -n12920719 -n12508762 -n11983375 -n01422450 -n12616630 -n09681107 -n10486561 -n13038577 -n12266644 -n02478875 -n02547014 -n02249809 -n03336742 -n12038760 -n01672432 -n09861287 -n03678879 -n01949973 -n09928845 -n02310149 -n12648693 -n10533983 -n12812801 -n04550676 -n01800633 -n12128306 -n12744142 -n13140367 -n07803213 -n07688265 -n13068434 -n02030568 -n12955840 -n01625121 -n13215258 -n04270576 -n02680638 -n02817251 -n01539272 -n04066023 -n12969927 -n10280598 -n04001661 -n09774167 -n10358575 -n01836673 -n02290664 -n09940725 -n12447581 -n07803779 -n04561965 -n10151261 -n01538362 -n10170060 -n13160365 -n09823287 -n12554729 -n10620212 -n11935027 -n03465605 -n03227856 -n08519299 -n07785487 -n03522863 -n02861286 -n12200905 -n04269502 -n02104184 -n07612273 -n01390763 -n11872658 -n12981086 -n10244359 -n01738731 -n12117235 -n12846690 -n02861658 -n08782627 -n09832633 -n02531114 -n01394492 -n03269073 -n03077442 -n09794668 -n13884384 -n08659331 -n02556373 -n02587877 -n03523506 -n03723153 -n12024805 -n13061172 -n03978575 -n07914686 -n13134844 -n12183026 -n03573574 -n03765128 -n03319167 -n01920438 -n07852452 -n07680655 -n03017698 -n12959538 -n04261506 -n01793340 -n03292362 -n12817855 -n03593222 -n01962506 -n12453018 -n04027367 -n12518481 -n09223487 -n07871335 -n03779246 -n09668562 -n01889849 -n02492356 -n07830841 -n03277149 -n09968652 -n03092476 -n10400205 -n06263202 -n07595368 -n12767208 -n02196896 -n12580012 -n10265801 -n02103181 -n02922461 -n01731277 -n12422559 -n04278605 -n02250280 -n03283413 -n11829922 -n10191613 -n02493224 -n04427559 -n12181352 -n12742878 -n10683675 -n04503705 -n03785142 -n12816942 -n10723230 -n11936707 -n12360534 -n12909759 -n03766218 -n02696843 -n11935877 -n07828156 -n10617397 -n12921499 -n13158714 -n10166394 -n12370549 -n03505015 -n12769065 -n02636550 -n10781236 -n09869317 -n10275249 -n04234763 -n10735173 -n13137225 -n02070776 -n04232312 -n07575226 -n03471030 -n07909954 -n02633677 -n01662060 -n07563642 -n04263950 -n11824344 -n13178707 -n02972714 -n10417288 -n12092930 -n11993203 -n10170681 -n03726116 -n03215337 -n12564613 -n14975598 -n07758125 -n03123666 -n07717714 -n01421333 -n02359667 -n09403086 -n03857026 -n12759668 -n02628259 -n02307515 -n12146488 -n09777870 -n07819303 -n12105353 -n10784113 -n11802995 -n12561594 -n02845130 -n12100187 -n03507658 -n02141611 -n01800195 -n03470005 -n12444898 -n02203592 -n09707061 -n00475142 -n12216628 -n01732093 -n02581642 -n03803780 -n12114590 -n04541662 -n12267133 -n11652753 -n07859951 -n04524594 -n12843144 -n04040540 -n10604880 -n12559044 -n03063834 -n12394328 -n12704513 -n10230216 -n10756641 -n02101670 -n12309630 -n03070587 -n11626010 -n04239639 -n01638329 -n01928517 -n13144084 -n10420649 -n03102516 -n12395289 -n09833111 -n01651285 -n11688069 -n12881913 -n12783730 -n07716649 -n03618678 -n10344203 -n03626502 -n10718665 -n03577474 -n01683201 -n03246653 -n12153224 -n02519472 -n02470709 -n15090238 -n03129636 -n07774295 -n04577567 -n09995829 -n09662038 -n10297367 -n03555862 -n12531727 -n09947127 -n12533190 -n04062807 -n00479734 -n12860978 -n01884104 -n09866559 -n12069009 -n04595501 -n12088495 -n02909053 -n12283790 -n02180427 -n10697282 -n07562881 -n13092078 -n11706325 -n01746952 -n01978136 -n07731436 -n02386746 -n12648424 -n12726357 -n10314182 -n07839172 -n11753562 -n12903503 -n12589687 -n02375438 -n03604763 -n11549895 -n13202602 -n12304420 -n10738215 -n12220829 -n10095420 -n12177455 -n11887476 -n04006411 -n09838370 -n02853218 -n12688372 -n03335461 -n02800940 -n03036701 -n09885059 -n10206629 -n11922926 -n01678657 -n12192132 -n12248141 -n03108624 -n01936671 -n02417242 -n03222857 -n03768823 -n04343511 -n03538817 -n12655726 -n12521186 -n01330497 -n12767423 -n12965951 -n09695132 -n04410886 -n12599874 -n07865700 -n07596160 -n10227698 -n03224490 -n11598886 -n02948293 -n09906293 -n12247963 -n03301175 -n03895170 -n04259468 -n07808806 -n13147689 -n09856827 -n13882639 -n02241008 -n03842585 -n02883101 -n12182276 -n13918717 -n12728164 -n10634464 -n02477187 -n03107716 -n02342250 -n01479213 -n12793695 -n09808080 -n10707707 -n04161010 -n02836607 -n10076483 -n07726386 -n03872273 -n10250712 -n07688412 -n13884930 -n12301766 -n10196404 -n07591330 -n03814727 -n09610255 -n12757115 -n09814381 -n02397987 -n07886317 -n03959123 -n02185167 -n03533845 -n11838413 -n10227393 -n07704305 -n03580615 -n02663485 -n10101981 -n04346855 -n10067011 -n04464125 -n02829510 -n10007995 -n07845775 -n03004713 -n02450561 -n09905530 -n10361060 -n12394638 -n12095934 -n10479135 -n03145277 -n12246773 -n13194212 -n04475900 -n03252787 -n14867545 -n10485298 -n09961739 -n02149653 -n01553762 -n03931980 -n02344408 -n11676850 -n04034367 -n04235646 -n12867184 -n12625670 -n12763529 -n07593107 -n04351550 -n02571810 -n13899735 -n03652826 -n09495962 -n03421768 -n04205062 -n11918808 -n07745197 -n07752264 -n01892744 -n04609811 -n10278456 -n11790936 -n09754152 -n13234519 -n09820044 -n00440643 -n02350357 -n03779884 -n07803992 -n03305953 -n01836087 -n10068234 -n10690421 -n03134394 -n12380761 -n12801966 -n03134232 -n02596720 -n07591236 -n11882821 -n02312175 -n02387983 -n01912152 -n10805501 -n12718074 -n03188290 -n02776505 -n10528148 -n09971385 -n10524223 -n09958292 -n02721813 -n10300829 -n12007766 -n12107191 -n04449700 -n02987950 -n11878633 -n12328801 -n04551833 -n10567722 -n11654984 -n02808968 -n12066451 -n02964075 -n11633284 -n02434712 -n03070854 -n07926540 -n01543936 -n10091861 -n09938080 -n11976511 -n03342432 -n12886831 -n12509993 -n12958261 -n12730776 -n10066206 -n07846014 -n13176714 -n03332591 -n04607640 -n02513727 -n12138248 -n11964848 -n01318053 -n10553140 -n07839055 -n02632039 -n11865429 -n02286654 -n02367812 -n12093885 -n10774329 -n02296912 -n01729672 -n10353928 -n12033504 -n11936113 -n03263338 -n07822053 -n09737050 -n13875884 -n13212559 -n11690088 -n05468739 -n09344724 -n02507148 -n01377694 -n04172607 -n10464870 -n07804152 -n02825872 -n03139640 -n11858703 -n10227490 -n12334153 -n03616225 -n12018188 -n12399656 -n10235269 -n11840764 -n01995514 -n03326475 -n12704041 -n10684827 -n03006788 -n13906484 -n02868240 -n03614887 -n03491724 -n12124172 -n03675907 -n13170840 -n03983712 -n03254737 -n07836269 -n01784293 -n02095212 -n12470512 -n12219668 -n12920521 -n04492157 -n02950018 -n01922717 -n11797981 -n12601805 -n02744961 -n07814925 -n09798096 -n03939062 -n13891547 -n07564292 -n01590220 -n09295210 -n03997875 -n03479266 -n01491661 -n03781055 -n12528768 -n10657306 -n12014923 -n10094320 -n02532272 -n02224023 -n04541136 -n12067672 -n02661473 -n04233027 -n12399899 -n12889412 -n01736032 -n12551173 -n01337734 -n10104487 -n02921592 -n02148512 -n10216403 -n03276839 -n01781570 -n03999621 -n02505238 -n12537569 -n10433452 -n02351343 -n12365158 -n08539276 -n01897257 -n12221801 -n10557246 -n10437698 -n01803641 -n11836327 -n07813833 -n03468570 -n06277025 -n10040240 -n03692842 -n03017835 -n01881564 -n10487363 -n07937069 -n10597505 -n01638722 -n10160412 -n09825096 -n12611640 -n03098515 -n10654211 -n13196234 -n03436990 -n04058486 -n09814567 -n10758337 -n03515934 -n07688757 -n10269199 -n12627347 -n04521571 -n01636510 -n03220095 -n09982525 -n12768809 -n02340930 -n02473857 -n12336586 -n12125584 -n02833040 -n02498153 -n01467804 -n12120347 -n11650430 -n11953339 -n12592058 -n05102764 -n10575594 -n09722064 -n01966586 -n10619888 -n07852376 -n12650915 -n10321882 -n11974557 -n09847267 -n13201423 -n12337131 -n13185658 -n02150134 -n10538853 -n10471732 -n07836600 -n03526062 -n02512752 -n04232437 -n03367321 -n04308915 -n07600895 -n11539289 -n03539293 -n12699922 -n07817599 -n02781213 -n03594010 -n12035907 -n04075813 -n05233741 -n07863229 -n10735984 -n12095543 -n12272735 -n04229620 -n12240965 -n07768590 -n04420024 -n12111627 -n02861509 -n02595056 -n12183452 -n04607982 -n13213577 -n07741888 -n03750614 -n10043024 -n03372933 -n10051861 -n10199251 -n03249956 -n03984125 -n02956393 -n11619687 -n03356279 -n07833951 -n10715030 -n02340358 -n10768272 -n01494041 -n02592734 -n03323319 -n02136285 -n03995661 -n09945223 -n03547397 -n10044682 -n12878784 -n02803809 -n13160254 -n12726902 -n12196954 -n03161016 -n03105645 -n04218921 -n09493983 -n10719036 -n12263588 -n12565102 -n10684146 -n03148518 -n04287986 -n02340640 -n04331443 -n10727016 -n03369407 -n07824863 -n07844786 -n12467433 -n07582811 -n02964196 -n02197877 -n10758445 -n03271376 -n13212175 -n03260504 -n12777778 -n11973634 -n05467054 -n11946313 -n02462213 -n13906669 -n10520286 -n02074726 -n01771100 -n13880199 -n09811568 -n13883763 -n02334728 -n11831100 -n12025220 -n12751172 -n03858837 -n10127186 -n12831535 -n07823591 -n02513805 -n03662301 -n09913329 -n02749670 -n10655986 -n01787191 -n03199488 -n12732252 -n12253664 -n07735294 -n03440876 -n09650839 -n03844965 -n10341446 -n12688187 -n12961242 -n03423224 -n13157346 -n09802951 -n11948044 -n03489048 -n12279060 -n03664840 -n03731882 -n07742605 -n07870734 -n03949761 -n10759331 -n07739923 -n02737351 -n01788291 -n11780424 -n03722646 -n12297110 -n12363768 -n04495310 -n10008254 -n03934890 -n01318478 -n03609959 -n10070377 -n04123228 -n13068735 -n02909706 -n10671042 -n10491998 -n07650792 -n12664710 -n10213034 -n03455642 -n10411867 -n09903936 -n10121800 -n02622955 -n03647423 -n07596566 -n09654898 -n12248780 -n02684515 -n04255670 -n06273890 -n03495941 -n12960552 -n09724234 -n03861048 -n03293095 -n11835251 -n12852428 -n04084517 -n01814620 -n13159890 -n03147156 -n02311748 -n10237799 -n07584859 -n01946827 -n09651968 -n12241192 -n03669245 -n07858336 -n11932927 -n04444218 -n10526534 -n03642573 -n09470222 -n10731732 -n12001924 -n03786096 -n01359762 -n03824999 -n13877667 -n10591811 -n10574311 -n03275125 -n11631985 -n10539160 -n10502950 -n12499757 -n12432707 -n12068615 -n07689624 -n02610373 -n03204436 -n13051346 -n13134531 -n07610890 -n04021164 -n03502897 -n02299378 -n10417843 -n10050043 -n07929940 -n02593453 -n10577820 -n12870225 -n03333851 -n09463226 -n11741575 -n09193551 -n12012510 -n11987349 -n09215023 -n07924655 -n10060075 -n11999278 -n03933391 -n02602059 -n11993444 -n02337902 -n10149867 -n04441093 -n02868429 -n10629647 -n04192361 -n12029039 -n02768433 -n12078747 -n12730143 -n03255167 -n12492900 -n01709876 -n09672725 -n07870620 -n02315821 -n12277334 -n12204730 -n07852712 -n01319685 -n07802246 -n13031193 -n00812526 -n09658815 -n11982939 -n04264485 -n07893425 -n04094438 -n03285730 -n13182338 -n10724570 -n07832741 -n13210350 -n10654015 -n04058721 -n07875086 -n03462747 -n03994417 -n02889856 -n11957514 -n10109443 -n10478462 -n03064562 -n02477782 -n11920998 -n02138169 -n04227787 -n11797508 -n10753339 -n12928307 -n11921792 -n12643688 -n01833112 -n03919808 -n09817386 -n01903498 -n03848033 -n12031547 -n01035504 -n12324906 -n01911063 -n02588794 -n03749634 -n03539754 -n02242455 -n03079616 -n03246312 -n09705671 -n07860629 -n10458356 -n10051761 -n09709531 -n02867401 -n12522678 -n13150378 -n04462576 -n03462315 -n03712981 -n07607027 -n10581648 -n02957427 -n04271793 -n02253913 -n12824735 -n11697802 -n02161588 -n12463975 -n02361090 -n09784564 -n09680908 -n03512452 -n13214217 -n10712690 -n04023119 -n07814007 -n09833751 -n12885265 -n02259987 -n11933903 -n03628831 -n11967142 -n02533545 -n03900301 -n07919787 -n12793886 -n10768148 -n03071552 -n02780315 -n12193665 -n03378442 -n04486616 -n07832307 -n03164192 -n12786273 -n04261868 -n12655351 -n12320414 -n04371979 -n10630093 -n13052014 -n01357328 -n07879821 -n09753348 -n03796974 -n11701302 -n11678299 -n04022434 -n11610823 -n07726009 -n04117639 -n10474343 -n11888061 -n01842788 -n10435251 -n03343047 -n03383378 -n12750767 -n09662661 -n05241485 -n10000459 -n12220496 -n02246941 -n12676370 -n02253264 -n07766409 -n02940289 -n12089320 -n10363573 -n12922119 -n09783537 -n11695285 -n12331066 -n12573647 -n10218164 -n12509821 -n07862946 -n12818601 -n02589316 -n13191620 -n03758992 -n12112337 -n10733820 -n02898093 -n02645953 -n10150794 -n04595762 -n02344918 -n13132756 -n12859153 -n12138444 -n04211001 -n12935166 -n07830493 -n10142166 -n11951820 -n03018848 -n01453742 -n11985321 -n10000294 -n01362336 -n02328009 -n12639376 -n03090437 -n02204249 -n04312916 -n13127666 -n09684082 -n03432509 -n10274318 -n09704057 -n07593972 -n10074249 -n13157971 -n01638194 -n04036963 -n11708857 -n03418749 -n12589458 -n11899762 -n07683138 -n01601410 -n07854707 -n04279063 -n03239607 -n10302700 -n12520406 -n12576451 -n03881534 -n07565608 -n02349390 -n12569851 -n12249294 -n04059399 -n03530189 -n09357346 -n04325208 -n13159691 -n04045941 -n13898315 -n11992479 -n02353411 -n07825496 -n12922458 -n03115014 -n11761836 -n03323211 -n02793296 -n03492087 -n05241662 -n05491154 -n10419630 -n04506895 -n10546428 -n02907296 -n10769459 -n11647868 -n13188462 -n03825442 -n13209460 -n10742005 -n07599242 -n12361754 -n04570532 -n04131811 -n07756499 -n02598134 -n01910252 -n02910701 -n10129338 -n13871717 -n12673588 -n12565912 -n07562172 -n02711237 -n10775003 -n07695410 -n02637179 -n12930951 -n10261211 -n02906963 -n01366700 -n10642705 -n09846586 -n02779719 -n04978561 -n01369358 -n12114010 -n03521771 -n10667709 -n02296612 -n10722029 -n03500557 -n01365474 -n10472447 -n07585644 -n07609316 -n04013060 -n04505888 -n09726811 -n12692160 -n12378963 -n03585551 -n13139837 -n10167565 -n03799375 -n11990920 -n09640327 -n04502989 -n10108832 -n10561736 -n01897426 -n11766189 -n12462582 -n12913524 -n02684356 -n13200542 -n10466198 -n04331892 -n01478969 -n07837234 -n07692248 -n04552097 -n12382875 -n01484447 -n04120695 -n12681376 -n10293861 -n11965962 -n11788039 -n03959227 -n01832813 -n09918867 -n09942697 -n07587206 -n10459882 -n01347583 -n02267208 -n03951453 -n03006903 -n12126736 -n10286749 -n03395401 -n04605057 -n03467887 -n12755559 -n04020744 -n11629354 -n01647033 -n02780445 -n10205714 -n09439032 -n03138128 -n02763083 -n07835547 -n12251278 -n11949857 -n01635480 -n10675142 -n07845335 -n07751977 -n10332110 -n11871496 -n11764814 -n12229651 -n07760297 -n09865672 -n02919308 -n12218490 -n03782929 -n12231709 -n11909864 -n03144982 -n11799331 -n10433610 -n10483395 -n03206023 -n05442594 -n03626418 -n07870478 -n10171456 -n11964446 -n12796849 -n02126317 -n03797062 -n01412694 -n07610746 -n03581897 -n04479526 -n12447891 -n11906514 -n09699642 -n12873984 -n10586903 -n13234114 -n02436353 -n11889205 -n01460303 -n04400899 -n11884967 -n02140491 -n12215824 -n03586911 -n01394040 -n10691937 -n12371704 -n09668988 -n04362624 -n01740885 -n01337191 -n09714120 -n02185481 -n08555333 -n10704238 -n12430471 -n12034594 -n10012484 -n12088909 -n03205903 -n04129490 -n13090018 -n10712474 -n12234669 -n13016076 -n00454855 -n13882713 -n02644817 -n03192907 -n03519226 -n01561181 -n04583967 -n11732052 -n10732854 -n04480303 -n07934908 -n03825673 -n10621294 -n04354387 -n03374102 -n02922159 -n13158815 -n04000716 -n09685806 -n04427216 -n12051514 -n09712967 -n12081649 -n09748889 -n03252231 -n10704886 -n12897118 -n12525168 -n11728769 -n02731251 -n02548884 -n12403276 -n09627807 -n08679167 -n09663999 -n04247440 -n07711683 -n09909929 -n03415868 -n05244421 -n07680416 -n12757668 -n11935794 -n03483086 -n01860864 -n10755164 -n03675076 -n12004987 -n07566092 -n04078955 -n03379719 -n01916588 -n10138369 -n09755893 -n03649003 -n03977430 -n02309120 -n10616578 -n12242850 -n12388293 -n03292085 -n09919061 -n10302576 -n01497413 -n01936858 -n01377278 -n04358256 -n02667693 -n12125183 -n07758582 -n07813324 -n09737453 -n12745564 -n03855464 -n03166685 -n01446152 -n09801102 -n10561222 -n10576818 -n13915209 -n10474446 -n03845990 -n04237174 -n12531328 -n07855812 -n10763245 -n04614505 -n07905770 -n12051792 -n12653633 -n03593862 -n10359659 -n10436334 -n07853125 -n12911264 -n12265083 -n03638014 -n04444121 -n02706221 -n10563711 -n07808166 -n11799732 -n04093915 -n10451858 -n04410760 -n10075299 -n12740967 -n12635359 -n09611722 -n12902466 -n13915305 -n05542893 -n04440597 -n03675445 -n12315245 -n10646032 -n10047199 -n12775717 -n10365514 -n10590452 -n11616260 -n02812342 -n07856756 -n04570416 -n03565991 -n12215210 -n04330896 -n02388588 -n02266269 -n10760199 -n14714645 -n02742070 -n03565710 -n12609379 -n03420935 -n03441465 -n00453631 -n01963479 -n04362972 -n09863936 -n03961394 -n03009269 -n12297280 -n04561010 -n12192877 -n02981565 -n12134695 -n07855413 -n03232815 -n10180791 -n09932788 -n10571907 -n02109256 -n02660091 -n07865788 -n13228536 -n10306279 -n02635580 -n03634899 -n10262343 -n12296929 -n04393301 -n06281175 -n04485586 -n13103660 -n10510974 -n04166436 -n01634522 -n07596362 -n12700357 -n08597579 -n11744011 -n12238756 -n01790171 -n04571800 -n11867311 -n03464467 -n12241880 -n09961605 -n12592544 -n03170459 -n09938991 -n02692680 -n10295371 -n04331765 -n02612167 -n02520810 -n11977887 -n04094608 -n07722390 -n07832202 -n12448361 -n04612159 -n12186352 -n13161151 -n12654227 -n09868899 -n10104756 -n09920106 -n12981301 -n02610980 -n12545865 -n10673296 -n04110841 -n01704626 -n04055700 -n12117912 -n10519126 -n12443736 -n01697978 -n02148088 -n03012644 -n12091697 -n10395390 -n10509810 -n10462751 -n02896949 -n03836602 -n03928994 -n07718195 -n02473983 -n08571642 -n02648916 -n11970298 -n06274292 -n04613158 -n09856401 -n12811713 -n13111340 -n12122442 -n10095265 -n04445610 -n11631619 -n07863644 -n12022821 -n10315217 -n12549799 -n03386343 -n03121040 -n03558007 -n12272432 -n11798496 -n02522866 -n02952935 -n10741493 -n12143065 -n07883156 -n09616573 -n02289988 -n13161904 -n02588945 -n00451768 -n12375769 -n10777299 -n04495183 -n11930994 -n09970088 -n02254246 -n12276314 -n07857598 -n04428382 -n03789794 -n03383821 -n12980080 -n01447139 -n12880799 -n03501520 -n10764465 -n13143285 -n12727729 -n12444095 -n02354621 -n13174354 -n01691652 -n07732525 -n10437014 -n04368235 -n10371052 -n02611898 -n03597147 -n09912431 -n03135788 -n07888058 -n02409202 -n14582716 -n11934463 -n04395332 -n12558680 -n05257967 -n11798978 -n10617024 -n04102760 -n12132092 -n12988572 -n10390698 -n11887310 -n12063211 -n12952717 -n13141972 -n12176453 -n10245863 -n10509161 -n10389976 -n10333165 -n01474864 -n09274305 -n11888424 -n10368711 -n13222877 -n10469611 -n07582970 -n09700125 -n12805762 -n07865575 -n07853852 -n03628421 -n04482975 -n03099622 -n01349735 -n11943133 -n12736603 -n12197601 -n10597745 -n04418644 -n12689305 -n07755262 -n10598459 -n04312020 -n03195485 -n09776642 -n10596517 -n10223606 -n01923890 -n12703716 -n03465040 -n12372233 -n12528109 -n03571853 -n10802621 -n10204177 -n02320465 -n03976105 -n02214096 -n02148991 -n10377542 -n10697135 -n03538542 -n07582027 -n04517999 -n12180456 -n02838014 -n03977266 -n03818001 -n12191240 -n11648776 -n10773800 -n04475496 -n03945817 -n04682018 -n02994743 -n02787269 -n11650160 -n03834472 -n03389983 -n09797742 -n06209940 -n12525513 -n12672289 -n01893164 -n10710259 -n01892145 -n11773408 -n10554024 -n09864968 -n10699752 -n11631405 -n10414768 -n04430605 -n10742546 -n10738871 -n12857204 -n09309046 -n01724840 -n04123317 -n07881525 -n03868044 -n02140268 -n10708292 -n09838295 -n09797998 -n10710171 -n11814996 -n11938556 -n03543511 -n02151230 -n01515217 -n03533392 -n02039780 -n12810151 -n02335231 -n12152251 -n13225617 -n09801275 -n01978587 -n14821852 -n11742878 -n12679023 -n03521431 -n09679028 -n02021281 -n10784544 -n04421258 -n12492460 -n03720005 -n02541257 -n03889397 -n02888898 -n10659762 -n12045157 -n12712320 -n10369095 -n09721444 -n12769318 -n01703161 -n12697514 -n07836456 -n03905361 -n10660883 -n07769306 -n11893916 -n07846274 -n04110281 -n03655470 -n07740744 -n01363719 -n12540647 -n09896311 -n12842642 -n07755619 -n07754155 -n11548870 -n02868546 -n04215588 -n04288165 -n13201566 -n07721118 -n12018271 -n11903333 -n02909165 -n02662559 -n11658709 -n13063514 -n07725663 -n10179069 -n10776887 -n12637485 -n03814528 -n12542043 -n07833333 -n07820036 -n02746683 -n07925808 -n10349750 -n03154316 -n04155625 -n03232923 -n02116185 -n09998788 -n02821543 -n03410303 -n10656223 -n07916582 -n12880638 -n10408809 -n04612840 -n11805255 -n12044784 -n10497534 -n03458422 -n12873341 -n07808675 -n09476123 -n07611733 -n10598013 -n02214660 -n05469664 -n03952150 -n11855435 -n04375926 -n08523340 -n01642391 -n04007415 -n09756961 -n12891824 -n02894847 -n11698245 -n12906771 -n02894024 -n04131015 -n11882636 -n04386456 -n03291551 -n07837110 -n12462221 -n08540532 -n10299875 -n12705978 -n10448322 -n10487592 -n12175598 -n02272552 -n03833907 -n10383237 -n12758176 -n12729950 -n10061195 -n07816726 -n03241903 -n12239880 -n10380499 -n07855188 -n10207077 -n02770078 -n12961393 -n03778459 -n10734741 -n03485575 -n09958447 -n12337246 -n11830045 -n09866354 -n03209666 -n01470145 -n10395209 -n03872016 -n04267091 -n12888457 -n12104104 -n04088229 -n01964957 -n12002651 -n02503756 -n00481938 -n01908042 -n03378765 -n04193883 -n09862183 -n11861487 -n02520525 -n02081060 -n10386754 -n12693865 -n04514095 -n01325060 -n02460817 -n07568095 -n03651605 -n02561937 -n12844409 -n12888016 -n02974565 -n12439154 -n13018906 -n12071259 -n03897634 -n02863176 -n10603528 -n03493911 -n12887532 -n12944095 -n12794568 -n09980458 -n03503567 -n11783162 -n13123309 -n11729860 -n03702582 -n04280373 -n10086744 -n01790557 -n12627526 -n10552393 -n12092629 -n03888998 -n12751675 -n01442450 -n02479332 -n07726230 -n03642341 -n03142325 -n06263895 -n12088327 -n09703344 -n10528493 -n02820085 -n07737594 -n04090781 -n09901642 -n02328942 -n02724722 -n09866115 -n12658715 -n10481167 -n13135692 -n11850918 -n10205344 -n12361560 -n03698123 -n03284482 -n12106134 -n04441528 -n02591613 -n02581108 -n07856186 -n12197359 -n12900783 -n01725713 -n12012253 -n03907475 -n02170738 -n03694949 -n13238654 -n04611795 -n02782432 -n13191148 -n02741367 -n04170694 -n12770892 -n01973148 -n10080508 -n10161622 -n09808591 -n07912093 -n02059541 -n02779971 -n03857156 -n12945366 -n03055159 -n12758325 -n10067305 -n02597818 -n07808352 -n13147153 -n10679723 -n02271222 -n04012665 -n12942729 -n10349243 -n01377510 -n07800636 -n10654321 -n10219453 -n09961469 -n10732521 -n04479405 -n11632929 -n03856728 -n08658918 -n10327143 -n10754281 -n02085118 -n09691604 -n09952163 -n10082299 -n03872167 -n03733465 -n04138869 -n01425223 -n12066821 -n02177506 -n09892262 -n02896694 -n12983654 -n13224922 -n09658921 -n12744850 -n03639880 -n02943686 -n10660621 -n11936539 -n03698226 -n04519536 -n12392765 -n09319604 -n07567039 -n04160261 -n01802159 -n02838178 -n07746910 -n02266421 -n10240417 -n12542240 -n12550408 -n01445857 -n04132465 -n03569014 -n12666050 -n12362514 -n10676569 -n09702673 -n12885510 -n04447156 -n04396226 -n12240150 -n11639306 -n02249134 -n01340785 -n02833140 -n10027590 -n02142407 -n11996251 -n07874531 -n04340019 -n03166120 -n10420277 -n04465203 -n12738259 -n12831141 -n03998673 -n01385017 -n12842519 -n02587051 -n10753061 -n12505253 -n13906936 -n01989516 -n12640435 -n07852532 -n04243142 -n10261511 -n12853287 -n12239240 -n03973003 -n09983889 -n10345302 -n14804958 -n02354162 -n03049326 -n10443659 -n01318660 -n12787364 -n04253304 -n11941094 -n09283514 -n09393524 -n11865574 -n01531639 -n04409279 -n02859729 -n10712835 -n03694196 -n04343630 -n10331098 -n12929600 -n02826259 -n10171219 -n07735179 -n07594840 -n03709644 -n09950728 -n09859285 -n07718329 -n01418620 -n09858299 -n12395068 -n10011360 -n07763290 -n02643316 -n03596099 -n04422566 -n11958888 -n09650989 -n10318686 -n01333082 -n12886402 -n03781467 -n12667582 -n02923535 -n09988311 -n08663860 -n02508346 -n13885011 -n03939281 -n10772937 -n04485750 -n09871952 -n10291942 -n07759324 -n10174971 -n03666238 -n01937579 -n02308033 -n07847706 -n10371330 -n04124887 -n11853079 -n11941478 -n12647231 -n04601041 -n12718483 -n02902816 -n01941340 -n04066767 -n07617839 -n02254901 -n03488784 -n07834774 -n02524659 -n03367969 -n10783734 -n03422484 -n09776807 -n03970363 -n10131590 -n03433247 -n02622712 -n10206506 -n12061104 -n11936287 -n07874674 -n10061043 -n07828275 -n03764606 -n12236768 -n01826844 -n09741904 -n05454978 -n03591592 -n01441272 -n03736372 -n07585474 -n12762405 -n12943912 -n01894522 -n03218446 -n11846425 -n11689678 -n04147916 -n02375862 -n10409459 -n09287415 -n10113583 -n03261263 -n02817386 -n09869578 -n10550252 -n02532786 -n12031388 -n07937344 -n11612235 -n01571410 -n09402944 -n04234670 -n02603862 -n04196925 -n09999135 -n10468750 -n15093049 -n03003633 -n11650307 -n12312110 -n02525703 -n10501635 -n09751622 -n10114550 -n10103155 -n12829975 -n04004099 -n12419878 -n02082190 -n03328201 -n03093427 -n07845571 -n12655498 -n02558206 -n12563045 -n07573453 -n12324558 -n13016289 -n10601234 -n10310783 -n03531691 -n02135610 -n03168543 -n09985978 -n10615334 -n07839312 -n09985809 -n10142537 -n10417969 -n07869111 -n12514992 -n04327544 -n10326776 -n12583681 -n01476418 -n12840168 -n03852544 -n11713763 -n07824502 -n07858841 -n12256325 -n03036149 -n07883661 -n04500390 -n10170866 -n01835918 -n10760951 -n10720197 -n12330239 -n02135844 -n10210512 -n03217739 -n10802953 -n03136254 -n02161225 -n03961630 -n12927194 -n02251233 -n13891937 -n09945603 -n02695762 -n12181612 -n13234857 -n10175725 -n11346873 -n07934678 -n02318687 -n10251329 -n04112921 -n04001132 -n03042984 -n11704791 -n04246459 -n12193334 -n10718509 -n10371221 -n05278922 -n03265754 -n12186554 -n12481289 -n10521853 -n10748506 -n11729142 -n10143595 -n09422631 -n07562984 -n07850219 -n04193742 -n11997160 -n12002826 -n12820113 -n04132829 -n10272913 -n03358841 -n12610740 -n12384569 -n10725280 -n02746008 -n13148384 -n12635151 -n02337171 -n10350774 -n12308907 -n04542474 -n04339062 -n03549350 -n10240235 -n10556033 -n10214390 -n01791314 -n02801047 -n07817465 -n11610602 -n10315730 -n14592309 -n10249191 -n12453857 -n12579822 -n09833275 -n04051269 -n11552594 -n04088343 -n04565039 -n03930431 -n10679503 -n11899921 -n10295479 -n01357507 -n13036312 -n03404900 -n12523141 -n01816017 -n02020578 -n12661045 -n06262943 -n02775813 -n12921315 -n09751076 -n09834258 -n10585628 -n12885754 -n04411019 -n10342367 -n10368798 -n09672840 -n12729023 -n04578329 -n10325549 -n03680248 -n11920663 -n10416567 -n10011486 -n01643255 -n03193754 -n07823814 -n04055447 -n10660128 -n07765612 -n07612530 -n04205613 -n09677427 -n03989199 -n11100798 -n12721122 -n10000787 -n10382157 -n07724819 -n12928819 -n11631159 -n02608996 -n10516527 -n09703101 -n12290975 -n03470222 -n03810412 -n03729131 -n03356038 -n12692024 -n12614625 -n10789415 -n02333819 -n01722670 -n03885410 -n12038208 -n02294097 -n02608860 -n02500596 -n07909231 -n03254625 -n09681973 -n12221368 -n01893399 -n10025295 -n03194812 -n13181406 -n12249122 -n03447894 -n09795010 -n02187900 -n10139651 -n10631654 -n01792530 -n02569631 -n07853946 -n09907804 -n03263758 -n04214649 -n02450829 -n02431542 -n11998492 -n02651060 -n04101860 -n01806061 -n13901423 -n12903964 -n03968479 -n04268565 -n12601494 -n02083780 -n04570118 -n12247407 -n03337822 -n09878921 -n02369935 -n10022908 -n09667358 -n13160938 -n11937360 -n07741623 -n03705808 -n12241426 -n10478118 -n03805933 -n10343869 -n09391774 -n03482128 -n10357737 -n10334461 -n09675045 -n09662951 -n10174253 -n01815270 -n13873361 -n04432785 -n09778927 -n10671898 -n05571341 -n10033572 -n09864632 -n10618465 -n03437184 -n12786464 -n01723579 -n11798270 -n07742415 -n02143142 -n10548419 -n03695122 -n02518622 -n04605446 -n10218292 -n11832671 -n12646950 -n03382708 -n09844898 -n09674786 -n01472502 -n07616906 -n09763272 -n03982767 -n10005006 -n03059236 -n01816474 -n03725869 -n01979269 -n04226322 -n13236100 -n03920384 -n11852148 -n04373563 -n04324120 -n11686652 -n03036341 -n02142898 -n09783776 -n13147918 -n03465320 -n07855721 -n10336411 -n10438619 -n07750299 -n12237152 -n03559373 -n10077106 -n10169796 -n09828403 -n09959658 -n12464128 -n12934685 -n04221673 -n02617537 -n11689367 -n10180580 -n07813717 -n12529905 -n02340186 -n01400247 -n11749112 -n04404072 -n03135656 -n12098827 -n12481150 -n10023506 -n03500838 -n01564101 -n04009923 -n10023264 -n03908456 -n03206405 -n07590068 -n09958133 -n10755394 -n01423617 -n11511327 -n10536274 -n01965252 -n11549245 -n11935627 -n09635635 -n03752071 -n07585997 -n03147084 -n12666159 -n09748408 -n03796848 -n01501948 -n02345078 -n12430675 -n03103128 -n11710987 -n03393199 -n09233603 -n10465002 -n04298765 -n01351170 -n02720576 -n03966582 -n10643837 -n12420124 -n10793799 -n01652297 -n09281252 -n11983606 -n10222497 -n11832899 -n02391617 -n12434106 -n03987674 -n02140179 -n07896560 -n04325804 -n10647745 -n01924800 -n10156629 -n03545961 -n03906789 -n01890564 -n10699558 -n12332218 -n03247495 -n11839460 -n03527675 -n12586725 -n13208965 -n02714315 -n02750320 -n04615149 -n12679876 -n12863234 -n03304323 -n12139793 -n11922755 -n12321669 -n04979307 -n01921059 -n09657206 -n13042134 -n04045787 -n11700279 -n02337598 -n01415920 -n01400391 -n13207572 -n10785480 -n02515713 -n12018100 -n02634545 -n03292736 -n02881546 -n12655605 -n03105810 -n10545792 -n03894933 -n09796974 -n10320484 -n12308112 -n11549009 -n13047862 -n14941787 -n12379531 -n10540252 -n11696935 -n12184468 -n12851860 -n12908854 -n10586265 -n12369066 -n10426630 -n12523850 -n03916289 -n04538878 -n09908769 -n02828115 -n07560422 -n10266016 -n03569174 -n06423496 -n10495167 -n03617834 -n09327538 -n10195056 -n10508379 -n13031323 -n11659248 -n04242315 -n10742111 -n10700963 -n12032686 -n09877587 -n07825597 -n07568991 -n11736362 -n12169099 -n13103750 -n03263640 -n12248941 -n10665302 -n01920051 -n09704283 -n11533999 -n04503073 -n11645163 -n10639817 -n09920901 -n06340977 -n03251100 -n10378113 -n03226090 -n10131268 -n02877513 -n13191884 -n02787120 -n11709045 -n02740061 -n12323665 -n02831998 -n10342180 -n12716594 -n04498275 -n09905050 -n03745487 -n07642833 -n10294020 -n10211666 -n12205460 -n02981198 -n01642943 -n07679140 -n04390483 -n10432875 -n09214269 -n10792506 -n10243483 -n13099833 -n10221520 -n13177768 -n04091584 -n10672540 -n10200246 -n13889331 -n02345340 -n10237556 -n01833415 -n01335218 -n09804230 -n09957523 -n05235879 -n10070449 -n10308653 -n10721708 -n04312654 -n10394434 -n12201938 -n12434775 -n07601025 -n02672152 -n10157271 -n02635154 -n12572858 -n13182937 -n10160188 -n03396997 -n10344656 -n02968210 -n10190516 -n07684422 -n03706939 -n07618871 -n02290870 -n03817331 -n03275311 -n12698774 -n04375080 -n07837630 -n04314216 -n11833373 -n07618684 -n03742238 -n12532886 -n03712444 -n11750989 -n10038620 -n09617577 -n03807334 -n10108089 -n01816140 -n10715347 -n02648035 -n13127303 -n02809491 -n02430748 -n12235479 -n01451863 -n01514926 -n10010864 -n01913440 -n09660240 -n11806369 -n01470479 -n12655245 -n07655067 -n03436772 -n11778092 -n03951800 -n10277815 -n07931733 -n01479820 -n03576955 -n07609549 -n12568649 -n05263316 -n02636405 -n01384084 -n03298352 -n07617344 -n09987045 -n10573957 -n07801709 -n02589062 -n02534165 -n02748359 -n09607782 -n07590974 -n02199170 -n02696569 -n09678747 -n12795209 -n13176363 -n10663315 -n10588724 -n09772330 -n10174589 -n12366313 -n11883628 -n07617447 -n01334690 -n03168663 -n11764478 -n08599174 -n03942028 -n12153033 -n03448696 -n12096674 -n10037588 -n03548320 -n09760290 -n10374541 -n09653438 -n10294139 -n10276942 -n12279293 -n12764507 -n12803958 -n10764622 -n02140858 -n07599068 -n10245507 -n12351790 -n12818004 -n10118301 -n03945459 -n09912995 -n12176709 -n03873996 -n10339179 -n10614507 -n10114662 -n10784922 -n03821424 -n04959230 -n13015509 -n12573911 -n11948469 -n09775907 -n12758014 -n01780142 -n09956578 -n12165384 -n10088200 -n10382480 -n04131113 -n09930628 -n09784160 -n11750173 -n13064111 -n03817522 -n12662074 -n03176238 -n12310021 -n11679378 -n09961331 -n02385580 -n11904274 -n03113505 -n10244913 -n02836900 -n09986700 -n11963572 -n13158605 -n10321632 -n02179891 -n02189670 -n10097995 -n10774756 -n10783240 -n10605737 -n02530052 -n10386196 -n10184505 -n09788237 -n03589672 -n12509109 -n10658304 -n12966804 -n12559518 -n03189311 -n01451295 -n12179632 -n12301613 -n10496489 -n03402785 -n10244108 -n02385676 -n03552001 -n03092053 -n02313360 -n02547733 -n02109391 -n01327909 -n04574606 -n03060728 -n07840124 -n10567848 -n10062176 -n02703124 -n10804732 -n12699301 -n04515890 -n07919665 -n10457214 -n09663248 -n03165955 -n12988341 -n03987865 -n03031756 -n10277912 -n10172080 -n09325824 -n03198223 -n09605110 -n10113869 -n11603462 -n03352366 -n11930203 -n09769929 -n12979316 -n02579762 -n09953052 -n03105974 -n00476140 -n11598287 -n02830157 -n10512201 -n09746936 -n10668666 -n02919976 -n09993651 -n02149861 -n09705003 -n10389865 -n11655152 -n10010767 -n10070563 -n03688832 -n10590239 -n11936027 -n02939763 -n03163488 -n03171910 -n09955406 -n03266195 -n10217208 -n09338013 -n07594250 -n03215930 -n09725935 -n10592049 -n03732658 -n12498457 -n09966554 -n10668450 -n10361525 -n04060198 -n11936624 -n02602760 -n03942600 -n03708425 -n10020533 -n12067817 -n07590177 -n01891274 -n11837204 -n01419332 -n03860234 -n12616248 -n07834160 -n09867154 -n09788073 -n12222493 -n03388990 -n04245412 -n10182402 -n11675404 -n10450038 -n13045594 -n13158167 -n13082568 -n12052267 -n12707199 -n07810531 -n07914887 -n13127001 -n02573249 -n08619112 -n10471859 -n09919899 -n03635516 -n12067029 -n03352232 -n07765517 -n10519984 -n02742194 -n03062798 -n13124654 -n09958569 -n02370137 -n10121714 -n04019335 -n07732433 -n02559383 -n12585137 -n09729156 -n10744078 -n09954355 -n03078506 -n10062042 -n10688811 -n02668613 -n03142205 -n10347204 -n10518349 -n09898020 -n12563702 -n05468098 -n10116370 -n07838905 -n03127024 -n03545585 -n12801072 -n09940818 -n04480995 -n10466564 -n02606751 -n10032987 -n10771066 -n01587278 -n11852531 -n01455461 -n10397392 -n02349205 -n10180923 -n09778266 -n04366832 -n10051975 -n10538629 -n09865744 -n12554029 -n13118330 -n12952590 -n04187751 -n09924313 -n10062594 -n01980655 -n10028402 -n02567334 -n10590903 -n10265891 -n10739297 -n01457082 -n03437581 -n03713151 -n03475674 -n05464534 -n11863467 -n06592421 -n12491435 -n14914945 -n10279778 -n03388711 -n10483890 -n10612373 -n03332784 -n02332954 -n02952798 -n13041943 -n01607309 -n04356772 -n07711799 -n12670962 -n12229111 -n07878479 -n12401893 -n07772413 -n12138110 -n09781504 -n07902698 -n02750652 -n13042316 -n12400924 -n02304797 -n03066464 -n12852234 -n10155222 -n05541509 -n10711483 -n04210858 -n02835551 -n12859679 -n02935490 -n03540476 -n05279953 -n09807075 -n09617435 -n03566860 -n10549510 -n10025391 -n10754449 -n11927740 -n03554645 -n01837526 -n02656969 -n08648917 -n07860548 -n01452345 -n04021704 -n07783827 -n10080117 -n02187554 -n03214966 -n10036444 -n04291069 -n12407396 -n02170599 -n09896826 -n12417836 -n07845495 -n02749292 -n03061819 -n03682380 -n10756261 -n10369955 -n09692125 -n09978442 -n04277669 -n10539278 -n09703932 -n01879837 -n02746225 -n13159357 -n11763874 -n10540656 -n07933530 -n12987535 -n02371344 -n10654827 -n09723944 -n12775393 -n11856573 -n12626878 -n12716400 -n09903639 -n09784043 -n03906894 -n10775128 -n03124313 -n10396727 -n02841641 -n10211830 -n12283395 -n03490784 -n14175579 -n04027935 -n12396091 -n02609823 -n01414216 -n09880741 -n11976933 -n03073384 -n09270160 -n11768816 -n12073217 -n11597657 -n09994878 -n11756329 -n12579404 -n03161893 -n01451115 -n07736971 -n02949356 -n03878418 -n12653436 -n10626630 -n12777892 -n13061704 -n10498699 -n03609786 -n03199358 -n10776339 -n10762480 -n13179056 -n10113249 -n04029913 -n12640081 -n10493835 -n11683216 -n03524287 -n04585626 -n02969527 -n12976554 -n08569482 -n10204833 -n12442548 -n02577952 -n09357447 -n10202225 -n02198129 -n11882972 -n10404426 -n01600341 -n12016434 -n09867069 -n10576223 -n09893600 -n01702479 -n04274686 -n04406552 -n02848118 -n02258629 -n03260733 -n03685640 -n11751974 -n09967555 -n06274546 -n09649067 -n10681557 -n07606933 -n03110202 -n11982545 -n10803031 -n02679142 -n04086937 -n10514255 -n04506402 -n03884554 -n09970192 -n10117017 -n12642435 -n10186686 -n02097967 -n03956531 -n11834890 -n02677436 -n10040698 -n11796188 -n03348142 -n04168472 -n02294407 -n12483282 -n09429630 -n04423687 -n09819477 -n09755555 -n10157016 -n03344935 -n07762373 -n12871859 -n09853541 -n09875979 -n13050705 -n02251067 -n10637483 -n03823673 -n10357012 -n03424204 -n04431648 -n01475940 -n02339282 -n10248198 -n07683265 -n13150592 -n10359117 -n10096508 -n03473078 -n13052248 -n10743356 -n03710079 -n10634990 -n04507689 -n07921090 -n02352002 -n03924407 -n03609147 -n02837567 -n03406759 -n03909658 -n10286282 -n12135576 -n01912809 -n10801561 -n10717055 -n03473465 -n03761588 -n03144156 -n09474412 -n10253611 -n12549420 -n02499568 -n09910222 -n10431122 -n12699031 -n01697749 -n11786843 -n03888808 -n12089496 -n10066314 -n10302905 -n12696830 -n09965787 -n11969806 -n04066388 -n13080306 -n03913930 -n09968259 -n10490421 -n10714195 -n07570021 -n10343449 -n10401204 -n03472796 -n10779897 -n11787190 -n03503097 -n10439523 -n12123648 -n04279858 -n10511771 -n09755788 -n08253141 -n02616397 -n12248574 -n01645466 -n04334504 -n07729142 -n05451099 -n10503818 -n10354265 -n09707735 -n02633422 -n11999656 -n01324916 -n02088745 -n09354511 -n10705448 -n09756195 -n10136615 -n10427359 -n09702134 -n12600095 -n04122262 -n10791820 -n03330002 -n02713496 -n11710658 -n09664908 -n02550203 -n02349847 -n12835766 -n04098260 -n11536567 -n11686780 -n12875861 -n12758471 -n09806944 -n11810030 -n10400003 -n10098388 -n11663263 -n10559683 -n07833672 -n10753989 -n10643095 -n01988869 -n03112240 -n12911914 -n09979913 -n09785236 -n09790047 -n02676097 -n01653509 -n04601159 -n01938735 -n10748142 -n12978076 -n11990627 -n10437262 -n12972136 -n04077594 -n10148825 -n02269340 -n12886185 -n03608504 -n11677485 -n10612518 -n12267265 -n10649308 -n05458173 -n10650162 -n03213361 -n02747063 -n01611674 -n02322992 -n01554017 -n03512624 -n12773142 -n12747120 -n09902128 -n03162714 -n03924532 -n10299125 -n12378753 -n02778131 -n09976024 -n13093629 -n10778999 -n07721833 -n12232851 -n07876775 -n10097590 -n03194170 -n13029122 -n04573832 -n12859272 -n09639382 -n07688021 -n02878796 -n10751710 -n03633632 -n07762534 -n10779995 -n13914265 -n13093275 -n10729330 -n10433077 -n03663910 -n10499110 -n02272286 -n10371450 -n01967308 -n12633061 -n11659627 -n12982915 -n10344121 -n10268629 -n02697876 -n09879552 -n10167361 -n10719807 -n04042076 -n01632952 -n03243625 -n02125872 -n10105906 -n12194613 -n03149810 -n10721124 -n03947343 -n02020219 -n10122531 -n01315330 -n08647264 -n00452734 -n03607527 -n10010243 -n09863749 -n04473275 -n11782878 -n03585337 -n09655466 -n12989007 -n11711971 -n10716864 -n10475835 -n10704712 -n01894956 -n10568443 -n12881105 -n10387836 -n10403633 -n08645318 -n03500457 -n10377633 -n10108464 -n09933972 -n02618094 -n11798688 -n04155735 -n09780395 -n12822466 -n04302200 -n11899223 -n10633298 -n02760298 -n12142450 -n10803282 -n10769321 -n10514051 -n10597889 -n11837562 -n02261757 -n01458746 -n09830759 -n10003476 -n09817174 -n10738670 -n10118743 -n12096563 -n03054491 -n12155773 -n10439727 -n04170384 -n03223923 -n12632733 -n07845421 -n10062905 -n11831521 -n04267985 -n12796385 -n04154854 -n00444142 -n09778537 -n03115663 -n04385157 -n10109826 -n02337332 -n09996304 -n09880189 -n12871696 -n11823305 -n02516776 -n12377494 -n08511017 -n04421417 -n10765305 -n09675673 -n03488111 -n03076623 -n11829672 -n10292316 -n10758949 -n13031474 -n02829353 -n10090745 -n09186592 -n12736999 -n12715195 -n11684499 -n03168933 -n09890192 -n10596899 -n12527081 -n10496393 -n10497135 -n02137302 -n03266620 -n12958615 -n12664187 -n02633977 -n04262869 -n04215800 -n13133233 -n02392555 -n09858733 -n10186350 -n01715888 -n03142099 -n08573674 -n11687071 -n02690715 -n03146342 -n12331788 -n08079613 -n10609092 -n12943049 -n12234318 -n02312325 -n12618146 -n10135197 -n11705573 -n02794368 -n02850358 -n09464486 -n01993525 -n03187153 -n10097262 -n02976641 -n12198793 -n12941717 -n10219240 -n12434634 -n03827420 -n10437137 -n10342893 -n04174026 -n10265281 -n07757874 -n10765885 -n01470895 -n02349557 -n11716698 -n03765467 -n10227793 -n07824268 -n12994892 -n10486236 -n02974454 -n10718349 -n11726145 -n09909660 -n03378593 -n07805006 -n09875025 -n02645691 -n10223069 -n03722944 -n04389999 -n02544274 -n10239928 -n04456011 -n10382302 -n01552333 -n10082562 -n12952469 -n09883047 -n10442573 -n01891013 -n10690268 -n13111504 -n02287352 -n03567635 -n10331347 -n09762385 -n09933842 -n02369555 -n12291459 -n09919200 -n01492860 -n02067768 -n10713254 -n10550468 -n12846335 -n03835729 -n12467018 -n11676743 -n03629643 -n12987423 -n10655730 -n08678783 -n10349836 -n10087736 -n10246703 -n10338391 -n04585456 -n04158138 -n10500942 -n09850974 -n10791890 -n10020807 -n03315805 -n02752917 -n04033801 -n10492086 -n04427473 -n02940706 -n12110475 -n09832978 -n12515393 -n07800487 -n09848110 -n02659176 -n09967406 -n10536134 -n10760622 -n09736485 -n07830690 -n07835173 -n09814252 -n10311506 -n10341955 -n03869838 -n07760673 -n09970402 -n12526178 -n11687964 -n09968741 -n10719267 -n07851054 -n10116478 -n10599215 -n09951524 -n03855908 -n03997274 -n02986348 -n08599292 -n02474282 -n04155889 -n09983314 -n01987727 -n10280130 -n10404998 -n02294577 -n02998696 -n08586978 -n11652578 -n13867005 -n12663254 -n10524869 -n02287622 -n10220924 -n03279918 -n02626089 -n10291110 -n12820669 -n07861681 -n08643267 -n07720185 -n12555859 -n03225616 -n09769525 -n03295140 -n12489046 -n10615179 -n12150969 -n02888429 -n10753182 -n10267166 -n03675558 -n12693352 -n02378299 -n02788462 -n03622401 -n12236977 -n10730542 -n12758099 -n10502046 -n11937195 -n10366145 -n10307114 -n12984595 -n10128748 -n09362316 -n09789898 -n09654079 -n04260192 -n10114476 -n08623676 -n10331841 -n05265736 -n10269289 -n03090856 -n12764978 -n02825240 -n10358032 -n09825750 -n03062651 -n11196627 -n11825749 -n04148464 -n04439505 -n07572858 -n04561857 -n12904562 -n03643907 -n10723597 -n01492708 -n10071557 -n10140683 -n01739871 -n12984267 -n03072056 -n10772580 -n10462588 -n11936448 -n10494373 -n12845908 -n09793352 -n10717196 -n12577362 -n09779124 -n10663549 -n02286425 -n10380126 -n01890144 -n02751490 -n03361109 -n01781875 -n13128278 -n09994400 -n09883452 -n13881512 -n02833275 -n10362003 -n01376543 -n12366675 -n09984960 -n10173665 -n10673776 -n02057898 -n01934844 -n04057673 -n10018747 -n02916065 -n13024653 -n05539947 -n09648911 -n04150273 -n01393486 -n10411356 -n12232114 -n02436224 -n12757930 -n03095965 -n10555059 -n01577458 -n09666476 -n10598904 -n11656549 -n02591911 -n13092385 -n10506336 -n13103023 -n09658254 -n04095938 -n11936782 -n07824383 -n09781650 -n10240821 -n01780426 -n02850060 -n02863340 -n13914141 -n12138578 -n13034555 -n12291671 -n12133151 -n04515444 -n04591359 -n02589196 -n02689819 -n11740414 -n07610295 -n10246395 -n09921034 -n12447346 -n12641180 -n01419573 -n04242587 -n07760395 -n03399579 -n09866661 -n02549376 -n11861238 -n01588996 -n04319545 -n09789150 -n03288643 -n10312491 -n03353281 -n02345997 -n09711132 -n03043173 -n02558860 -n03703590 -n03188871 -n12589142 -n12113323 -n09987161 -n05242239 -n09686262 -n09780984 -n09668199 -n09716933 -n11675738 -n04459243 -n11833749 -n10646942 -n07760070 -n10286539 -n04469684 -n13030616 -n03939440 -n01725086 -n09967816 -n10500824 -n13026015 -n03983928 -n02936921 -n04115542 -n10245029 -n12105828 -n12452673 -n10498046 -n10737264 -n11766046 -n04079603 -n10072054 -n12569037 -n10153155 -n09867311 -n02806992 -n10258602 -n10164025 -n10520964 -n02258508 -n12199399 -n05266096 -n08496334 -n10351064 -n12441552 -n12878325 -n13102648 -n02980625 -n03462972 -n12395906 -n13022903 -n11895714 -n03324814 -n11318824 -n01728266 -n07883510 -n10731013 -n10181799 -n12142357 -n09671089 -n11531334 -n01718414 -n04573625 -n10390600 -n11553522 -n01314910 -n04227519 -n10514784 -n02944256 -n12103680 -n03081859 -n11655592 -n12569616 -n10700105 -n09755086 -n03865820 -n01456137 -n10442232 -n02900987 -n04491934 -n07849026 -n04519728 -n09986450 -n03305300 -n10186143 -n02879422 -n03018614 -n10747548 -n10562509 -n10068425 -n12593341 -n11937692 -n08679562 -n09613690 -n10646433 -n12251740 -n10994097 -n13048447 -n03848537 -n12153741 -n12614096 -n11654438 -n09985470 -n10562968 -n02923915 -n10740594 -n07802767 -n12514592 -n10335801 -n03878674 -n12586499 -n10255459 -n02413824 -n10312600 -n02616128 -n12644283 -n04238953 -n04526520 -n01898593 -n09737161 -n03372822 -n09781398 -n10339251 -n02502807 -n10198832 -n10679610 -n13136781 -n11974373 -n11680457 -n10083677 -n04037298 -n09945021 -n09987239 -n02708885 -n13107807 -n10130877 -n12507379 -n08651104 -n12116058 -n10135297 -n04269086 -n03858533 -n10477955 -n04394031 -n10442417 -n10074735 -n03618797 -n03460455 -n04374521 -n10756061 -n08517010 -n12923108 -n02362194 -n01704103 -n10062492 -n01394771 -n10473789 -n10330593 -n02748183 -n12562141 -n09745933 -n02505485 -n11922661 -n12018014 -n09866922 -n04067143 -n13161254 -n07813495 -n01374846 -n10213429 -n03253071 -n02546028 -n01642097 -n01475232 -n03212247 -n10155600 -n11689957 -n11738997 -n10525878 -n03301389 -n10589666 -n01908958 -n10289766 -n03900028 -n03437295 -n02987823 -n02739123 -n10505347 -n02546627 -n10381804 -n10132502 -n10336904 -n10189597 -n09786115 -n12875697 -n10761519 -n01470733 -n02875626 -n12111238 -n07862770 -n07856895 -n09996039 -n03368048 -n07913300 -n10062996 -n10555430 -n04302863 -n12758555 -n10740732 -n02385898 -n02385098 -n12162758 -n03887899 -n03976268 -n04234160 -n03641947 -n07857076 -n10578656 -n12135729 -n12675515 -n09032191 -n12969670 -n02600503 -n12518013 -n10227166 -n10121026 -n01801672 -n10661216 -n03244388 -n04147291 -n09664556 -n02539573 -n04480141 -n10601362 -n02613572 -n10537906 -n02613820 -n11656771 -n03841011 -n02845985 -n12534208 -n10241024 -n03645290 -n12743976 -n11922839 -n07709701 -n03066232 -n03467380 -n09266604 -n09663786 -n12775070 -n02427183 -n04083113 -n12896615 -n10501453 -n02345774 -n09965515 -n09704157 -n10666752 -n03846970 -n04167661 -n03991321 -n09556121 -n10686517 -n02586238 -n03594277 -n03591313 -n10391416 -n10756837 -n13163649 -n03971960 -n10245341 -n02577041 -n04481642 -n12373739 -n10214062 -n10091997 -n10275848 -n02090253 -n03514340 -n04593629 -n11795216 -n03126927 -n11871748 -n10272782 -n12056099 -n04484024 -n03101375 -n12255225 -n10724372 -n10531838 -n02354781 -n02389865 -n02853336 -n01477080 -n01779939 -n10776052 -n10724132 -n10284871 -n10554141 -n03898787 -n02366301 -n10721612 -n04421740 -n04256758 -n01445593 -n10103921 -n02729222 -n02530188 -n02387452 -n02601921 -n01711160 -n02474110 -n09869447 -n12789977 -n10158506 -n10396908 -n07839593 -n02662825 -n02473720 -n13034788 -n07752602 -n03762238 -n10262880 -n07770180 -n04030054 -n10151367 -n03525252 -n10252075 -n10747424 -n10191388 -n04130566 -n03951068 -n13239921 -n03733547 -n10358124 -n11549779 -n09203827 -n04043168 -n10359422 -n04286960 -n04237287 -n10130686 -n02338449 -n12912274 -n10586998 -n02812785 -n10364502 -n03955941 -n12324222 -n09743601 -n03766600 -n01427399 -n12968309 -n11776234 -n01501777 -n10051026 -n10397001 -n01516212 -n02596252 -n02225081 -n10479328 -n02109687 -n10181445 -n02248062 -n03802973 -n01639187 -n02142734 -n02342534 -n02410141 -n02743426 -n03950359 -n12253835 -n07805478 -n03706415 -n03578981 -n04560619 -n09761753 -n03524425 -n01962788 -n04350235 -n10686694 -n13139321 -n10195155 -n12335937 -n12758399 -n03805374 -n12895298 -n03800371 -n11972959 -n11530008 -n03178538 -n02217839 -n10591072 -n04033557 -n01880813 -n12292877 -n02430643 -n07599383 -n01954516 -n09894909 -n02474605 -n03576443 -n07595051 -n03367875 -n12945549 -n02360480 -n14583400 -n04208582 -n02405577 -n02550655 -n02513355 -n04381450 -n00444490 -n03567912 -n09937688 -n07932323 -n04029416 -n01913346 -n13237508 -n04437276 -n12938445 -n03042384 -n12543639 -n03194992 -n04094250 -n12045514 -n03825913 -n03504293 -n12758250 -n03547861 -n03649288 -n04572235 -n07569423 -n03534695 -n03253714 -n01501641 -n13906767 -n12578255 -n11749603 -n07742513 -n07609083 -n04214413 -n07595751 -n12013701 -n12592839 -n12949160 -n04093223 -n02983072 -n03510072 -n02966068 -n03867854 -n01747285 -n10691318 -n13091982 -n12574470 -n02255023 -n03449217 -n03153585 -n04006227 -n13140049 -n02965024 -n03805503 -n03911406 -n13120958 -n12203699 -n01456454 -n10397142 -n12920043 -n02412977 -n08674344 -n07801007 -n03037590 -n10361296 -n13133316 -n03483637 -n04435759 -n12983873 -n02627037 -n03783304 -n07725158 -n02921292 -n01788864 -n01705010 -n12616996 -n03903290 -n08662427 -n03667060 -n07856992 -n03252422 -n02449699 -n12137954 -n10024025 -n07891095 -n04337157 -n04368109 -n03015631 -n02363996 -n12824289 -n03206602 -n12799269 -n02333733 -n01793565 -n01721898 -n03178173 -n02844056 -n11688378 -n13889066 -n02637475 -n03750437 -n01403457 -n01717229 -n02677136 -n12512294 -n03736269 -n02838577 -n08661878 -n01993830 -n02777638 -n02900857 -n04023021 -n03843092 -n07770439 -n12928491 -n03697812 -n02639922 -n13139482 -n07771082 -n12487058 -n07774182 -n02122810 -n02856362 -n11686195 -n11687432 -n02853870 -n04239218 -n02665250 -n02938218 -n11746600 -n10183347 -n10681194 -n04164199 -n04407257 -n12549005 -n02331842 -n03862379 -n02863638 -n11962994 -n03091907 -n04177654 -n02252972 -n02403153 -n01376437 -n02848806 -n08579266 -n07616265 -n10331258 -n10765587 -n09433312 -n03412387 -n10178077 -n13123841 -n02532918 -n04144651 -n03296963 -n03450881 -n04348988 -n10425946 -n03257065 -n02354320 -n11689197 -n04084682 -n10140783 -n03637027 -n02346170 -n02559144 -n01705591 -n09400584 -n03840327 -n03918074 -n04053767 -n02406046 -n00288190 -n03160001 -n03366464 -n09249155 -n01324305 -n07556872 -n03381565 -n12705220 -n11874878 -n02632494 -n02502006 -n03146560 -n02179340 -n04312756 -n10162016 -n03800563 -n04140853 -n07933652 -n03075248 -n04421582 -n10652703 -n02218134 -n12233249 -n04578559 -n01781071 -n02615298 -n04436832 -n04054566 -n02608284 -n11674019 -n03505764 -n02662397 -n09422190 -n04382537 -n04355684 -n04383923 -n09888635 -n03783575 -n03228796 -n07772026 -n02381119 -n15060326 -n10586166 -n12647787 -n02458517 -n10281546 -n03498866 -n02485988 -n10121246 -n09391644 -n03103904 -n08676253 -n02203978 -n04092168 -n03213014 -n03138217 -n04135933 -n12612811 -n04478066 -n02157285 -n02543255 -n03863783 -n01502101 -n03930229 -n12439830 -n09425019 -n02618513 -n02910241 -n12261359 -n03648667 -n04365229 -n03461651 -n04388040 -n03295928 -n03581531 -n04203356 -n02622249 -n13142907 -n04497249 -n11678377 -n02366579 -n02931013 -n02837134 -n03132438 -n13092987 -n04196803 -n03056215 -n03255322 -n02130925 -n10291469 -n02971940 -n01718096 -n12510774 -n11766432 -n04271891 -n03366721 -n03154616 -n03694356 -n10478293 -n11763142 -n07763483 -n03037228 -n09201998 -n01517389 -n00443517 -n12693244 -n03580990 -n03519848 -n10238375 -n10783646 -n03564849 -n03975926 -n02473554 -n02450426 -n03464952 -n04411835 -n04573045 -n10505732 -n04337650 -n10621514 -n10334782 -n12434985 -n07769102 -n10594523 -n05475397 -n01875610 -n03299406 -n10507692 -n02593679 -n03317233 -n13239736 -n03550420 -n03247351 -n03819047 -n03633341 -n03154745 -n04073425 -n04532022 -n02910964 -n04301242 -n04378651 -n13098515 -n11775626 -n14603798 -n10263146 -n01886045 -n03761731 -n02224713 -n04591249 -n02144251 -n03849412 -n11548728 -n04051705 -n12298165 -n03150795 -n03989447 -n02826459 -n07602650 -n03155915 -n09891730 -n02067603 -n01523105 -n03618339 -n03897130 -n02711780 -n05285623 -n03533486 -n04085873 -n01923404 -n10139077 -n01709484 -n02183507 -n03216562 -n01971850 -n03136051 -n02948834 -n03589313 -n03665851 -n02937336 -n02035656 -n07769465 -n07849186 -n12585373 -n12280364 -n02846260 -n02511730 -n02614653 -n04193179 -n11718681 -n09467696 -n01522450 -n03040836 -n03162297 -n11896141 -n04000480 -n10350220 -n07746038 -n02124157 -n10655169 -n03476542 -n03895038 -n00443917 -n07757753 -n01726203 -n02987706 -n12750076 -n03012734 -n02941228 -n04194009 -n04501127 -n09794550 -n03510487 -n08589670 -n03166951 -n03673270 -n09792125 -n08492354 -n02396157 -n01628331 -n03993878 -n07833816 -n04958865 -n13650447 -n04339191 -n02826683 -n02893269 -n02810139 -n02626471 -n02589796 -n08677801 -n04325968 -n03275864 -n02622547 -n04406687 -n04097085 -n02998107 -n07831450 -n03658102 -n02575590 -n03523398 -n02412909 -n02953850 -n04337503 -n03510987 -n12664005 -n03710294 -n13138155 -n10110093 -n07831955 -n03932080 -n12971804 -n03943623 -n03726371 -n10531445 -n12984489 -n07835051 -n12097556 -n02685701 -n03038041 -n02451125 -n04594919 -n02372140 -n02665985 -n03496183 -n03961828 -n03802800 -n01713170 -n03602790 -n04974145 -n02780588 -n04031884 -n03588216 -n02614140 -n04578708 -n04501281 -n03166600 -n03992975 -n04206070 -n03227721 -n02582349 -n02664642 -n07805389 -n09226869 -n02459190 -n12216968 -n03628984 -n02524928 -n09209025 -n04078002 -n03167153 -n03562565 -n07599554 -n10252547 -n03279804 -n07692887 -n14909584 -n02529293 -n04444953 -n04156814 -n07616174 -n03415626 -n03331244 -n03868324 -n03644073 -n02818687 -n10085101 -n02953056 -n03202481 -n02118707 -n03591901 -n12602434 -n02943465 -n02818254 -n07922607 -n02597004 -n04212810 -n04056073 -n12327528 -n02207647 -n01792808 -n03002555 -n03951213 -n12242123 -n10062275 -n12325787 -n10048117 -n11937278 -n03624767 -n04039041 -n04059298 -n03707171 -n07758407 -n01333483 -n02219015 -n02436645 -n02478239 -n04457638 -n01781698 -n09474765 -n03686363 -n10769084 -n09456207 -n02385776 -n13555775 -n03962685 -n13129078 -n03463185 -n01429172 -n04243251 -n12177129 -n03143754 -n03958338 -n02791795 -n04560502 -n12776774 -n02745816 -n03009111 -n02976552 -n03008817 -n03211413 -n03537550 -n12200504 -n01909788 -n11790089 -n03480973 -n10507070 -n01707294 -n04374907 -n04281571 -n00006024 -n03823906 -n12603273 -n03503358 -n04027820 -n12645530 -n02535080 -n04143365 -n08385989 -n12661227 -n12814857 -n11871059 -n04268418 -n13128582 -n01928865 -n04359124 -n12670334 -n03610836 -n04543924 -n02252799 -n15102359 -n04437380 -n04316924 -n11872324 -n09330378 -n10122300 -n03784139 -n00443375 -n14993378 -n01721174 -n00004475 -n00006484 -n00007846 -n00015388 -n00017222 -n00021265 -n00021939 -n00288000 -n00433458 -n00433661 -n00433802 -n00439826 -n00440218 -n00440509 -n00440747 -n00441824 -n00442115 -n00442981 -n00443231 -n00444651 -n00445351 -n00445802 -n00447073 -n00447221 -n00447540 -n00448466 -n00448640 -n00448958 -n00449295 -n00449695 -n00450335 -n00450700 -n00451370 -n00451866 -n00452293 -n00453935 -n00454237 -n00454624 -n00463246 -n00464651 -n00464894 -n00467719 -n00467995 -n00468480 -n00469651 -n00471437 -n00471613 -n00479076 -n00480508 -n00480993 -n00482298 -n00523513 -n01035667 -n01316422 -n01316579 -n01316949 -n01317089 -n01317391 -n01317541 -n01319467 -n01320872 -n01321230 -n01321579 -n01321854 -n01322343 -n01322685 -n01322898 -n01323068 -n01326291 -n01329186 -n01338685 -n01339336 -n01340935 -n01342269 -n01358572 -n01367772 -n01375204 -n01376237 -n01380610 -n01384687 -n01385330 -n01387065 -n01389507 -n01390123 -n01392380 -n01395254 -n01397114 -n01402600 -n01407798 -n01421807 -n01438208 -n01439121 -n01439514 -n01439808 -n01441425 -n01444783 -n01445429 -n01446589 -n01446760 -n01448951 -n01450661 -n01454856 -n01455778 -n01458842 -n01459791 -n01461646 -n01466257 -n01467336 -n01468238 -n01468712 -n01471682 -n01473806 -n01474283 -n01477525 -n01478511 -n01480516 -n01480880 -n01481331 -n01482071 -n01482330 -n01483522 -n01484097 -n01488918 -n01491874 -n01492357 -n01493541 -n01494757 -n01494882 -n01495006 -n01495701 -n01497118 -n01498406 -n01498699 -n01498989 -n01500091 -n01501160 -n01503061 -n01514752 -n01515078 -n01517565 -n01524359 -n01525720 -n01527194 -n01527617 -n01528654 -n01529672 -n01533339 -n01534582 -n01534762 -n01537134 -n01538955 -n01539573 -n01540233 -n01541922 -n01542786 -n01544208 -n01546921 -n01547832 -n01548301 -n01549430 -n01550761 -n01553142 -n01555809 -n01557185 -n01560105 -n01560636 -n01563128 -n01563746 -n01564394 -n01567133 -n01568132 -n01569836 -n01570676 -n01571904 -n01572328 -n01573074 -n01574045 -n01574390 -n01575745 -n01576695 -n01577659 -n01578575 -n01579028 -n01580379 -n01580490 -n01580772 -n01580870 -n01581166 -n01581434 -n01581730 -n01582398 -n01582498 -n01582856 -n01584225 -n01585121 -n01587834 -n01588431 -n01589286 -n01591697 -n01592257 -n01592540 -n01594372 -n01595624 -n01597336 -n01598588 -n01598988 -n01600085 -n01600657 -n01602080 -n01602209 -n01602630 -n01603600 -n01604330 -n01605630 -n01608814 -n01609062 -n01609391 -n01609751 -n01610955 -n01611472 -n01612628 -n01613294 -n01613615 -n01615121 -n01616551 -n01616764 -n01617095 -n01617443 -n01617766 -n01618082 -n01618922 -n01619310 -n01619536 -n01619835 -n01620135 -n01620414 -n01620735 -n01621127 -n01622352 -n01623706 -n01627424 -n01629276 -n01630284 -n01631175 -n01632047 -n01637112 -n01637932 -n01639765 -n01640846 -n01645776 -n01649170 -n01650167 -n01651487 -n01653773 -n01661091 -n01661592 -n01661818 -n01662622 -n01662784 -n01663401 -n01664369 -n01665932 -n01667432 -n01668091 -n01669372 -n01670092 -n01672032 -n01674216 -n01674464 -n01674990 -n01676755 -n01680264 -n01680478 -n01681940 -n01684133 -n01685439 -n01686044 -n01686220 -n01686403 -n01686609 -n01686808 -n01687665 -n01688961 -n01689411 -n01691951 -n01692864 -n01693783 -n01694709 -n01696633 -n01697178 -n01698434 -n01699040 -n01701551 -n01702256 -n01703011 -n01703569 -n01705934 -n01708106 -n01708998 -n01712008 -n01712752 -n01717016 -n01719403 -n01722998 -n01724231 -n01726692 -n01727646 -n01730185 -n01730307 -n01730812 -n01730960 -n01731545 -n01732244 -n01733757 -n01734637 -n01734808 -n01735439 -n01735577 -n01735728 -n01737472 -n01737728 -n01737875 -n01738065 -n01738601 -n01739647 -n01740551 -n01741232 -n01741562 -n01741943 -n01743605 -n01745125 -n01745484 -n01746359 -n01747885 -n01749582 -n01749742 -n01751036 -n01752165 -n01753959 -n01754876 -n01755740 -n01767661 -n01769347 -n01770795 -n01771417 -n01772222 -n01775370 -n01776192 -n01776705 -n01777304 -n01777467 -n01777649 -n01777909 -n01778217 -n01778487 -n01778621 -n01778801 -n01779148 -n01779463 -n01779629 -n01780696 -n01782209 -n01785667 -n01789386 -n01789740 -n01791107 -n01791625 -n01792158 -n01792640 -n01794158 -n01795088 -n01795735 -n01795900 -n01796019 -n01796105 -n01796519 -n01796729 -n01798706 -n01798839 -n01798979 -n01799302 -n01800424 -n01801088 -n01801479 -n01802721 -n01803078 -n01804478 -n01804653 -n01804921 -n01805070 -n01805801 -n01806847 -n01807828 -n01808140 -n01808291 -n01808596 -n01809106 -n01810700 -n01811909 -n01812337 -n01813385 -n01814370 -n01814921 -n01815601 -n01816887 -n01819115 -n01820348 -n01820801 -n01821076 -n01821203 -n01822602 -n01823013 -n01824749 -n01825930 -n01826364 -n01827403 -n01829869 -n01831712 -n01832167 -n01834177 -n01834540 -n01835276 -n01838038 -n01838598 -n01839598 -n01841102 -n01843719 -n01844231 -n01844551 -n01844917 -n01845132 -n01845477 -n01846331 -n01848123 -n01848648 -n01849466 -n01850373 -n01851375 -n01852142 -n01852861 -n01853498 -n01854415 -n01856072 -n01856155 -n01856380 -n01856553 -n01856890 -n01857079 -n01857325 -n01857512 -n01857632 -n01857851 -n01858441 -n01859496 -n01860497 -n01861148 -n01861778 -n01871543 -n01871875 -n01874434 -n01874928 -n01876326 -n01877134 -n01878061 -n01878335 -n01878639 -n01878929 -n01879217 -n01879509 -n01880152 -n01881171 -n01883513 -n01883920 -n01886756 -n01887896 -n01888264 -n01889074 -n01889520 -n01890860 -n01891633 -n01892551 -n01894207 -n01905661 -n01906749 -n01907738 -n01909422 -n01911403 -n01911839 -n01912454 -n01914163 -n01914830 -n01915811 -n01916187 -n01916925 -n01918744 -n01922303 -n01925270 -n01925695 -n01926379 -n01926689 -n01927159 -n01927456 -n01927928 -n01928215 -n01930852 -n01931140 -n01931520 -n01931714 -n01932151 -n01932936 -n01933151 -n01933478 -n01933988 -n01934440 -n01935176 -n01936391 -n01937909 -n01940736 -n01941223 -n01942177 -n01942869 -n01943541 -n01944118 -n01944812 -n01944955 -n01945143 -n01945340 -n01945845 -n01946277 -n01948573 -n01951613 -n01953361 -n01955933 -n01956481 -n01958038 -n01959985 -n01960459 -n01963571 -n01964049 -n01964441 -n01965889 -n01967094 -n01968315 -n01969726 -n01971094 -n01971280 -n01974773 -n01975687 -n01976146 -n01976957 -n01978930 -n01981702 -n01982650 -n01983048 -n01985493 -n01985797 -n01986806 -n01987545 -n01988701 -n01989869 -n01990007 -n01991028 -n01991520 -n01992262 -n01992423 -n01992773 -n01996585 -n01998183 -n02000954 -n02002075 -n02005790 -n02006985 -n02007284 -n02008041 -n02008796 -n02010453 -n02011805 -n02011943 -n02012185 -n02013177 -n02014941 -n02015554 -n02016358 -n02016956 -n02018027 -n02019190 -n02019438 -n02019929 -n02021050 -n02021795 -n02022684 -n02023341 -n02025043 -n02026059 -n02028175 -n02030035 -n02030287 -n02030996 -n02031934 -n02033208 -n02033324 -n02033561 -n02034129 -n02034661 -n02036053 -n02037464 -n02039171 -n02040505 -n02041085 -n02041246 -n02043063 -n02044178 -n02044778 -n02045369 -n02046759 -n02047260 -n02047614 -n02048698 -n02049532 -n02050004 -n02051474 -n02052204 -n02052365 -n02053083 -n02054502 -n02055658 -n02055803 -n02057731 -n02058594 -n02058747 -n02059162 -n02060411 -n02060889 -n02062017 -n02062430 -n02062744 -n02063224 -n02064338 -n02066707 -n02068206 -n02068974 -n02069701 -n02070430 -n02073250 -n02075296 -n02075927 -n02076196 -n02076779 -n02077152 -n02077658 -n02078292 -n02078574 -n02078738 -n02079005 -n02079389 -n02081571 -n02083346 -n02083672 -n02084071 -n02084861 -n02085374 -n02086346 -n02086478 -n02087122 -n02087551 -n02088839 -n02089232 -n02089555 -n02090475 -n02090827 -n02092468 -n02093056 -n02094562 -n02094721 -n02095050 -n02095412 -n02095727 -n02096756 -n02097786 -n02098550 -n02099029 -n02099997 -n02100399 -n02101108 -n02101861 -n02102605 -n02103406 -n02103841 -n02104523 -n02104882 -n02106966 -n02107420 -n02108254 -n02108672 -n02109150 -n02109811 -n02110532 -n02111626 -n02112497 -n02112826 -n02113335 -n02114100 -n02115012 -n02115335 -n02117512 -n02117646 -n02117900 -n02118176 -n02118333 -n02119247 -n02119359 -n02120278 -n02120997 -n02121620 -n02121808 -n02122725 -n02123785 -n02124623 -n02127292 -n02127381 -n02127482 -n02127586 -n02127678 -n02127808 -n02128598 -n02128669 -n02129463 -n02129530 -n02129837 -n02129923 -n02130545 -n02131653 -n02132466 -n02132580 -n02132788 -n02133400 -n02134971 -n02135220 -n02137722 -n02137888 -n02138647 -n02138777 -n02139199 -n02139671 -n02141306 -n02141713 -n02144593 -n02145424 -n02148835 -n02149420 -n02150482 -n02152740 -n02152991 -n02153203 -n02153809 -n02156732 -n02159955 -n02164464 -n02165877 -n02166229 -n02166567 -n02166826 -n02167505 -n02167820 -n02167944 -n02168245 -n02169023 -n02169218 -n02169705 -n02169974 -n02170400 -n02170993 -n02171453 -n02171869 -n02172518 -n02172678 -n02172761 -n02172870 -n02174355 -n02176261 -n02178411 -n02178717 -n02179012 -n02180233 -n02181235 -n02181724 -n02182045 -n02182355 -n02182642 -n02182930 -n02183857 -n02186153 -n02188699 -n02189363 -n02190790 -n02191273 -n02191773 -n02191979 -n02192252 -n02192513 -n02192814 -n02193009 -n02193163 -n02194249 -n02194750 -n02195091 -n02195526 -n02195819 -n02196344 -n02198532 -n02199502 -n02200198 -n02202287 -n02204722 -n02206270 -n02207179 -n02207449 -n02208280 -n02208498 -n02208848 -n02208979 -n02209111 -n02209354 -n02209624 -n02209964 -n02210427 -n02210921 -n02211444 -n02211627 -n02211896 -n02212062 -n02212602 -n02212958 -n02213107 -n02215161 -n02215770 -n02217563 -n02218713 -n02220055 -n02220225 -n02220518 -n02220804 -n02221083 -n02221414 -n02221571 -n02221715 -n02221820 -n02222035 -n02222321 -n02222582 -n02223266 -n02223520 -n02226183 -n02226821 -n02226970 -n02227247 -n02227604 -n02227966 -n02228341 -n02228697 -n02229156 -n02229765 -n02230023 -n02230187 -n02230480 -n02230634 -n02231052 -n02231803 -n02233943 -n02234355 -n02234570 -n02234848 -n02235205 -n02236241 -n02236896 -n02237424 -n02237581 -n02238235 -n02238887 -n02239528 -n02241569 -n02241799 -n02243562 -n02244173 -n02246011 -n02246628 -n02247511 -n02248368 -n02248510 -n02248887 -n02249515 -n02250822 -n02251775 -n02252226 -n02253127 -n02253715 -n02254697 -n02257003 -n02257284 -n02257715 -n02259377 -n02260421 -n02260863 -n02261419 -n02262178 -n02263378 -n02264885 -n02265330 -n02268148 -n02269196 -n02269522 -n02270011 -n02270200 -n02271570 -n02271897 -n02272871 -n02274024 -n02274259 -n02274822 -n02278210 -n02278839 -n02279637 -n02280458 -n02281015 -n02281136 -n02281267 -n02282257 -n02282385 -n02282553 -n02282903 -n02283077 -n02283201 -n02283951 -n02285548 -n02287004 -n02287799 -n02288789 -n02291220 -n02291572 -n02291748 -n02293352 -n02293868 -n02295064 -n02295390 -n02295870 -n02298541 -n02300173 -n02301452 -n02302459 -n02302620 -n02305407 -n02306433 -n02307325 -n02308139 -n02308471 -n02309337 -n02310000 -n02310717 -n02311060 -n02312006 -n02312427 -n02313008 -n02316707 -n02318167 -n02319308 -n02319555 -n02319829 -n02320127 -n02322047 -n02323449 -n02323902 -n02324045 -n02325722 -n02325884 -n02326074 -n02326763 -n02326862 -n02327028 -n02327175 -n02327435 -n02327656 -n02327842 -n02328429 -n02329401 -n02330245 -n02331046 -n02331309 -n02332755 -n02333546 -n02334460 -n02335127 -n02336011 -n02336641 -n02338901 -n02339376 -n02339922 -n02343058 -n02343320 -n02343772 -n02344528 -n02345600 -n02346998 -n02347274 -n02347573 -n02347744 -n02348173 -n02348788 -n02350105 -n02350989 -n02351870 -n02352591 -n02353861 -n02355227 -n02355477 -n02358091 -n02359324 -n02360781 -n02361587 -n02361706 -n02361850 -n02363245 -n02363351 -n02364520 -n02369680 -n02370806 -n02372584 -n02373336 -n02374149 -n02374451 -n02376542 -n02376791 -n02376918 -n02377181 -n02377480 -n02377703 -n02378415 -n02380335 -n02380583 -n02380745 -n02381460 -n02382437 -n02382948 -n02384858 -n02386014 -n02386310 -n02386496 -n02388276 -n02389346 -n02389559 -n02390454 -n02390834 -n02391234 -n02391373 -n02391508 -n02391994 -n02393580 -n02394477 -n02395003 -n02395694 -n02395931 -n02397529 -n02399000 -n02401031 -n02402010 -n02402175 -n02402425 -n02403325 -n02403454 -n02404186 -n02404573 -n02406174 -n02407959 -n02408660 -n02408817 -n02409870 -n02410702 -n02410900 -n02411705 -n02412440 -n02413131 -n02414578 -n02415435 -n02416519 -n02417070 -n02417534 -n02418064 -n02419796 -n02423218 -n02423362 -n02423589 -n02424305 -n02424695 -n02426813 -n02427724 -n02428349 -n02430045 -n02430559 -n02431122 -n02432511 -n02433546 -n02433925 -n02435853 -n02437136 -n02437971 -n02438173 -n02438272 -n02439033 -n02441326 -n02442172 -n02442336 -n02442446 -n02442572 -n02442668 -n02443015 -n02443346 -n02443808 -n02443959 -n02444251 -n02445004 -n02445171 -n02446206 -n02446352 -n02446645 -n02447021 -n02447762 -n02448060 -n02448633 -n02448885 -n02450034 -n02453108 -n02453611 -n02454794 -n02455135 -n02455428 -n02455720 -n02456008 -n02456275 -n02456962 -n02460009 -n02469914 -n02470325 -n02470899 -n02471300 -n02471762 -n02472293 -n02473307 -n02474777 -n02476219 -n02480153 -n02481103 -n02481235 -n02481366 -n02481500 -n02482060 -n02482286 -n02482474 -n02482650 -n02483092 -n02484322 -n02484473 -n02485225 -n02485371 -n02485536 -n02485688 -n02486657 -n02486908 -n02487079 -n02487547 -n02487675 -n02487847 -n02488003 -n02488415 -n02488894 -n02489589 -n02490597 -n02490811 -n02491107 -n02491329 -n02491474 -n02496913 -n02501583 -n02502514 -n02503127 -n02503517 -n02504770 -n02507649 -n02508021 -n02512053 -n02512938 -n02513560 -n02515214 -n02516188 -n02517442 -n02517938 -n02519148 -n02519686 -n02521646 -n02522399 -n02524524 -n02526425 -n02526818 -n02527057 -n02527271 -n02527622 -n02528163 -n02529772 -n02530421 -n02532028 -n02532602 -n02533209 -n02533834 -n02534559 -n02534734 -n02535537 -n02537085 -n02537319 -n02538406 -n02538985 -n02540412 -n02541687 -n02546331 -n02548689 -n02549989 -n02550460 -n02552171 -n02554730 -n02556846 -n02557591 -n02557749 -n02559862 -n02561108 -n02561661 -n02562315 -n02562796 -n02563182 -n02564720 -n02565573 -n02566109 -n02568959 -n02569484 -n02570838 -n02572196 -n02574910 -n02576223 -n02576575 -n02578233 -n02579557 -n02580336 -n02581957 -n02583567 -n02585872 -n02586543 -n02588286 -n02590495 -n02590702 -n02590987 -n02594250 -n02596381 -n02597367 -n02599052 -n02599958 -n02600298 -n02601344 -n02602405 -n02603317 -n02604157 -n02605316 -n02606384 -n02607201 -n02607862 -n02613181 -n02614482 -n02614978 -n02619165 -n02621908 -n02623445 -n02624167 -n02625612 -n02626762 -n02627835 -n02630281 -n02630739 -n02631041 -n02636170 -n02636854 -n02638596 -n02640626 -n02640857 -n02642107 -n02642644 -n02643112 -n02644113 -n02646667 -n02648625 -n02650050 -n02650541 -n02652668 -n02653145 -n02653786 -n02654425 -n02655523 -n02656670 -n02657368 -n02658079 -n02661017 -n02662239 -n02663849 -n02667379 -n02667576 -n02668393 -n02670382 -n02671780 -n02672371 -n02676261 -n02676670 -n02677028 -n02677718 -n02678384 -n02680110 -n02680754 -n02682407 -n02682922 -n02683791 -n02686121 -n02686568 -n02687992 -n02688443 -n02689274 -n02691156 -n02692513 -n02693413 -n02693540 -n02694426 -n02694966 -n02695627 -n02697576 -n02698244 -n02700258 -n02700895 -n02702989 -n02703275 -n02705944 -n02708224 -n02708555 -n02709367 -n02709637 -n02710600 -n02712643 -n02713218 -n02715229 -n02715513 -n02715712 -n02716626 -n02726305 -n02726681 -n02727016 -n02727825 -n02728440 -n02729837 -n02729965 -n02730265 -n02732072 -n02732827 -n02733213 -n02733524 -n02735361 -n02735688 -n02736798 -n02737660 -n02738031 -n02738271 -n02738535 -n02739550 -n02739668 -n02740533 -n02740764 -n02741475 -n02742322 -n02742753 -n02745492 -n02746365 -n02749790 -n02750169 -n02751067 -n02751295 -n02752496 -n02753044 -n02753394 -n02754103 -n02755352 -n02755529 -n02756098 -n02756977 -n02757462 -n02757810 -n02758134 -n02758960 -n02759700 -n02759963 -n02760099 -n02760199 -n02760429 -n02760855 -n02761392 -n02763198 -n02763714 -n02764044 -n02764614 -n02764779 -n02765028 -n02766320 -n02766534 -n02766792 -n02767433 -n02769075 -n02770830 -n02772554 -n02772700 -n02773037 -n02773838 -n02774152 -n02774630 -n02775483 -n02776205 -n02777100 -n02777734 -n02777927 -n02778456 -n02778669 -n02781121 -n02781338 -n02781517 -n02783035 -n02783324 -n02784998 -n02785648 -n02786198 -n02786463 -n02788689 -n02789487 -n02790823 -n02792552 -n02792948 -n02793842 -n02794008 -n02794779 -n02794972 -n02795783 -n02796207 -n02796623 -n02796995 -n02797692 -n02797881 -n02799897 -n02801184 -n02801525 -n02801938 -n02802721 -n02803349 -n02803666 -n02804252 -n02806088 -n02806379 -n02806875 -n02810471 -n02811468 -n02811719 -n02812201 -n02813252 -n02813399 -n02815478 -n02815950 -n02816494 -n02817031 -n02817650 -n02817799 -n02818832 -n02819697 -n02820210 -n02821627 -n02821943 -n02822220 -n02822399 -n02822865 -n02823335 -n02824448 -n02826589 -n02826886 -n02827606 -n02828299 -n02828884 -n02831335 -n02831724 -n02831894 -n02833793 -n02834778 -n02835412 -n02836268 -n02839351 -n02839910 -n02840619 -n02841063 -n02841506 -n02842133 -n02843029 -n02843777 -n02844214 -n02844307 -n02844714 -n02847631 -n02848216 -n02848523 -n02849154 -n02850950 -n02851099 -n02853016 -n02854532 -n02854926 -n02855089 -n02855390 -n02855793 -n02857365 -n02857477 -n02857644 -n02858304 -n02860415 -n02861886 -n02862048 -n02862916 -n02863750 -n02865665 -n02865931 -n02866578 -n02867715 -n02869737 -n02871631 -n02871824 -n02871963 -n02872752 -n02873839 -n02874086 -n02875436 -n02876326 -n02876457 -n02876657 -n02877962 -n02879517 -n02880189 -n02880546 -n02880940 -n02881193 -n02881906 -n02882483 -n02882647 -n02883004 -n02883344 -n02884225 -n02885108 -n02885338 -n02886599 -n02887209 -n02887970 -n02888569 -n02889425 -n02891188 -n02891788 -n02892499 -n02893418 -n02896294 -n02896442 -n02897389 -n02897820 -n02898173 -n02898369 -n02898585 -n02898711 -n02900705 -n02901481 -n02901901 -n02902079 -n02902916 -n02903006 -n02904109 -n02904640 -n02908217 -n02909285 -n02911485 -n02912065 -n02913152 -n02914991 -n02916179 -n02916350 -n02917377 -n02917607 -n02919414 -n02920503 -n02921884 -n02923129 -n02924116 -n02925519 -n02928413 -n02928608 -n02929289 -n02929462 -n02929923 -n02931417 -n02931836 -n02932019 -n02932400 -n02933112 -n02933462 -n02933750 -n02933990 -n02934168 -n02935658 -n02935891 -n02936176 -n02936281 -n02936714 -n02938886 -n02939866 -n02941095 -n02942699 -n02943241 -n02943871 -n02944826 -n02945161 -n02946270 -n02946348 -n02946921 -n02947212 -n02947818 -n02948557 -n02949202 -n02950186 -n02950256 -n02950632 -n02950943 -n02951843 -n02952485 -n02952674 -n02953673 -n02954163 -n02954340 -n02954938 -n02955065 -n02955247 -n02955540 -n02955767 -n02957135 -n02957755 -n02958343 -n02959942 -n02961451 -n02961947 -n02963302 -n02963692 -n02963821 -n02965216 -n02965300 -n02965529 -n02966545 -n02966786 -n02966942 -n02967081 -n02967991 -n02968473 -n02969010 -n02969163 -n02969634 -n02969886 -n02970685 -n02970849 -n02971691 -n02972397 -n02973017 -n02974697 -n02975212 -n02976939 -n02978205 -n02978753 -n02979516 -n02982599 -n02983189 -n02983904 -n02984061 -n02984203 -n02984469 -n02984699 -n02985137 -n02985828 -n02986066 -n02987047 -n02987492 -n02989099 -n02991048 -n02991302 -n02992032 -n02993546 -n02995998 -n02997391 -n02997607 -n03001282 -n03001627 -n03002210 -n03003091 -n03004620 -n03005515 -n03007130 -n03007591 -n03010656 -n03010795 -n03011018 -n03011355 -n03012159 -n03013006 -n03014440 -n03015254 -n03017070 -n03018209 -n03020034 -n03020416 -n03020692 -n03024333 -n03025070 -n03025886 -n03027108 -n03027250 -n03029066 -n03031422 -n03032811 -n03033362 -n03033986 -n03034516 -n03034663 -n03035510 -n03036469 -n03036866 -n03037108 -n03037709 -n03038685 -n03039015 -n03039947 -n03040229 -n03040376 -n03043274 -n03043958 -n03045337 -n03046257 -n03048883 -n03049066 -n03049457 -n03050026 -n03050546 -n03050655 -n03050864 -n03051396 -n03051540 -n03052464 -n03052917 -n03053047 -n03054901 -n03055670 -n03056097 -n03056493 -n03057021 -n03057636 -n03058107 -n03058603 -n03058949 -n03059366 -n03061050 -n03063073 -n03063338 -n03064350 -n03064758 -n03065708 -n03066849 -n03070193 -n03071021 -n03071160 -n03072201 -n03073296 -n03073977 -n03074380 -n03074855 -n03075097 -n03075500 -n03075634 -n03076411 -n03076708 -n03078287 -n03078670 -n03079230 -n03079741 -n03080497 -n03080731 -n03081986 -n03082127 -n03082807 -n03082979 -n03084420 -n03085333 -n03085602 -n03085915 -n03086183 -n03086457 -n03086670 -n03087366 -n03087643 -n03087816 -n03088707 -n03091044 -n03091374 -n03092166 -n03092314 -n03093792 -n03094503 -n03096439 -n03096960 -n03098140 -n03098806 -n03099454 -n03099771 -n03099945 -n03100346 -n03100490 -n03101156 -n03101986 -n03102654 -n03102859 -n03106722 -n03106898 -n03107046 -n03109881 -n03111690 -n03112869 -n03113152 -n03113657 -n03113835 -n03114839 -n03115180 -n03116530 -n03116767 -n03117199 -n03118346 -n03118969 -n03119510 -n03120198 -n03120491 -n03121897 -n03122748 -n03123809 -n03125870 -n03128085 -n03128427 -n03128519 -n03129001 -n03130066 -n03130563 -n03131669 -n03132261 -n03134853 -n03135917 -n03136369 -n03137579 -n03139464 -n03140900 -n03141065 -n03141327 -n03143572 -n03145384 -n03145843 -n03146846 -n03147509 -n03148324 -n03148727 -n03149401 -n03151077 -n03153948 -n03154073 -n03154446 -n03155178 -n03156071 -n03156405 -n03157348 -n03158796 -n03158885 -n03161450 -n03162818 -n03163798 -n03163973 -n03164605 -n03164722 -n03164929 -n03165823 -n03167978 -n03168107 -n03168217 -n03170635 -n03171356 -n03172965 -n03173387 -n03175604 -n03176386 -n03177165 -n03177708 -n03178000 -n03178430 -n03180504 -n03180969 -n03181293 -n03182140 -n03182232 -n03182912 -n03183080 -n03186818 -n03187751 -n03189818 -n03193597 -n03196062 -n03196324 -n03196598 -n03199647 -n03199901 -n03200357 -n03200539 -n03200701 -n03200906 -n03201035 -n03201638 -n03201996 -n03202354 -n03202760 -n03203089 -n03203806 -n03204306 -n03204558 -n03204955 -n03205143 -n03205304 -n03206718 -n03206908 -n03207305 -n03208556 -n03210683 -n03211117 -n03211616 -n03212811 -n03214253 -n03214450 -n03215191 -n03219135 -n03220237 -n03221059 -n03221720 -n03222516 -n03223162 -n03223441 -n03224753 -n03224893 -n03225777 -n03226538 -n03228016 -n03228533 -n03228692 -n03229115 -n03229526 -n03231160 -n03231819 -n03235796 -n03235979 -n03236580 -n03236735 -n03237212 -n03237639 -n03239259 -n03239726 -n03240140 -n03241093 -n03241335 -n03241496 -n03242120 -n03242506 -n03242995 -n03243218 -n03245271 -n03245421 -n03246933 -n03250952 -n03251533 -n03251766 -n03252324 -n03252637 -n03254374 -n03255488 -n03255899 -n03256788 -n03256928 -n03257586 -n03258905 -n03259505 -n03261776 -n03262519 -n03262809 -n03262932 -n03265032 -n03266749 -n03267821 -n03269203 -n03269401 -n03270695 -n03271765 -n03271865 -n03272239 -n03272383 -n03273061 -n03273913 -n03274561 -n03274796 -n03276179 -n03277459 -n03277771 -n03278248 -n03279153 -n03279364 -n03279508 -n03280394 -n03280644 -n03281145 -n03282060 -n03282401 -n03284743 -n03284981 -n03285912 -n03286572 -n03287733 -n03288003 -n03289985 -n03291413 -n03292960 -n03294048 -n03294833 -n03296478 -n03297103 -n03297644 -n03297735 -n03298089 -n03302790 -n03303217 -n03303831 -n03304197 -n03304465 -n03305522 -n03307573 -n03308152 -n03309808 -n03314378 -n03314884 -n03315644 -n03316406 -n03318136 -n03319457 -n03320046 -n03322570 -n03322940 -n03323703 -n03324928 -n03325088 -n03326073 -n03327234 -n03327691 -n03327841 -n03329663 -n03330792 -n03334017 -n03334492 -n03334912 -n03335030 -n03335846 -n03336839 -n03337494 -n03338287 -n03338821 -n03339296 -n03339643 -n03340009 -n03340923 -n03342961 -n03343354 -n03343560 -n03343853 -n03346135 -n03346455 -n03349296 -n03350352 -n03350456 -n03350602 -n03351262 -n03351979 -n03352628 -n03354903 -n03355468 -n03356446 -n03357267 -n03357716 -n03359137 -n03359566 -n03360731 -n03361683 -n03362771 -n03363363 -n03364008 -n03364937 -n03365592 -n03365991 -n03366823 -n03373237 -n03374649 -n03374838 -n03375171 -n03376279 -n03378342 -n03379343 -n03379828 -n03379989 -n03380647 -n03380867 -n03381126 -n03381231 -n03381776 -n03382856 -n03382969 -n03383468 -n03384167 -n03384891 -n03385557 -n03386011 -n03387323 -n03387653 -n03390327 -n03391770 -n03393324 -n03394480 -n03394649 -n03396580 -n03396654 -n03397266 -n03397532 -n03398228 -n03399761 -n03399971 -n03402188 -n03402369 -n03404012 -n03404360 -n03404449 -n03405265 -n03405725 -n03407369 -n03409393 -n03409591 -n03410147 -n03411339 -n03412058 -n03412220 -n03412511 -n03412906 -n03413264 -n03413428 -n03413828 -n03414162 -n03415252 -n03416489 -n03416775 -n03417345 -n03418158 -n03418242 -n03419014 -n03422072 -n03422589 -n03423719 -n03424630 -n03427296 -n03428090 -n03428349 -n03429003 -n03429288 -n03429914 -n03430091 -n03430313 -n03430551 -n03430959 -n03431243 -n03431745 -n03433637 -n03433877 -n03434285 -n03434830 -n03435593 -n03437941 -n03438257 -n03439814 -n03441112 -n03442288 -n03442756 -n03446070 -n03446832 -n03448031 -n03448956 -n03449564 -n03449858 -n03450516 -n03452267 -n03452449 -n03453320 -n03454110 -n03454211 -n03454707 -n03455355 -n03456548 -n03456665 -n03457008 -n03457686 -n03458271 -n03459914 -n03461882 -n03465500 -n03465818 -n03466162 -n03466839 -n03467517 -n03467796 -n03467984 -n03468696 -n03469493 -n03470387 -n03470629 -n03470948 -n03472232 -n03472535 -n03472937 -n03473817 -n03473966 -n03475823 -n03476083 -n03476313 -n03477773 -n03477902 -n03478756 -n03478907 -n03481521 -n03482523 -n03483230 -n03483531 -n03484083 -n03484931 -n03487331 -n03487444 -n03487774 -n03488188 -n03488603 -n03489162 -n03490324 -n03490449 -n03490884 -n03491988 -n03496296 -n03496612 -n03497100 -n03497657 -n03498536 -n03499468 -n03500295 -n03501152 -n03501288 -n03501614 -n03502331 -n03502509 -n03502777 -n03503718 -n03503997 -n03505383 -n03505504 -n03506370 -n03507963 -n03508101 -n03509394 -n03509843 -n03510583 -n03510866 -n03511175 -n03512147 -n03512911 -n03513137 -n03513376 -n03515338 -n03517899 -n03517982 -n03518631 -n03519674 -n03521076 -n03521544 -n03522634 -n03524574 -n03524976 -n03525074 -n03525454 -n03525827 -n03528263 -n03529444 -n03531281 -n03531447 -n03531546 -n03532342 -n03534776 -n03535024 -n03536761 -n03537412 -n03538037 -n03538300 -n03538634 -n03538957 -n03540267 -n03540595 -n03541091 -n03541696 -n03541923 -n03542333 -n03542860 -n03543603 -n03544360 -n03545150 -n03546340 -n03547054 -n03547530 -n03548930 -n03550153 -n03550289 -n03551084 -n03551790 -n03552449 -n03552749 -n03553486 -n03554460 -n03555426 -n03555662 -n03557590 -n03558176 -n03558404 -n03558739 -n03561169 -n03563200 -n03563710 -n03563967 -n03565288 -n03565565 -n03566329 -n03568117 -n03568818 -n03571942 -n03572205 -n03574555 -n03574816 -n03575958 -n03576215 -n03577672 -n03577818 -n03578055 -n03578251 -n03578656 -n03579538 -n03579982 -n03583621 -n03584400 -n03585073 -n03588951 -n03589513 -n03589791 -n03590306 -n03590932 -n03592245 -n03592773 -n03593526 -n03595409 -n03595860 -n03596285 -n03597317 -n03598151 -n03598299 -n03598646 -n03600977 -n03601638 -n03601840 -n03602081 -n03603722 -n03604629 -n03604843 -n03605722 -n03605915 -n03606465 -n03609235 -n03609542 -n03610418 -n03610992 -n03612814 -n03613294 -n03613592 -n03614007 -n03614532 -n03615563 -n03617095 -n03617594 -n03618546 -n03618982 -n03619396 -n03619650 -n03619793 -n03619890 -n03620052 -n03621049 -n03621694 -n03622931 -n03623556 -n03624134 -n03625355 -n03626115 -n03631177 -n03631811 -n03632852 -n03633886 -n03635032 -n03635668 -n03635932 -n03636248 -n03636649 -n03638883 -n03639675 -n03640988 -n03642444 -n03646296 -n03646916 -n03647520 -n03651388 -n03653220 -n03653454 -n03654576 -n03655072 -n03656484 -n03657239 -n03658858 -n03659292 -n03660124 -n03661340 -n03662719 -n03662887 -n03663531 -n03664675 -n03664943 -n03665366 -n03666362 -n03666917 -n03667235 -n03667829 -n03671914 -n03672827 -n03673450 -n03673767 -n03676759 -n03677766 -n03679384 -n03679712 -n03681477 -n03682487 -n03684823 -n03685307 -n03685820 -n03686130 -n03686470 -n03687928 -n03688943 -n03689157 -n03689570 -n03690851 -n03691817 -n03692379 -n03693293 -n03697552 -n03698604 -n03699280 -n03699975 -n03700963 -n03701191 -n03701391 -n03701640 -n03701790 -n03702248 -n03704834 -n03705379 -n03706653 -n03707597 -n03708036 -n03709206 -n03709363 -n03709545 -n03710528 -n03711711 -n03711999 -n03712887 -n03713069 -n03714235 -n03715386 -n03715669 -n03715892 -n03716966 -n03717131 -n03718212 -n03718335 -n03718699 -n03718789 -n03719053 -n03721590 -n03722007 -n03722288 -n03724176 -n03725035 -n03725717 -n03726516 -n03726760 -n03726993 -n03727837 -n03727946 -n03728437 -n03728982 -n03729647 -n03729951 -n03730153 -n03730788 -n03731695 -n03733644 -n03733925 -n03735637 -n03736970 -n03738241 -n03738472 -n03739518 -n03739693 -n03743902 -n03744276 -n03744684 -n03744840 -n03745571 -n03746330 -n03748162 -n03749504 -n03749807 -n03750206 -n03751065 -n03752185 -n03752922 -n03753077 -n03753514 -n03758894 -n03759432 -n03760671 -n03762982 -n03763727 -n03764276 -n03765561 -n03765934 -n03766322 -n03768132 -n03769722 -n03770954 -n03772077 -n03772674 -n03773035 -n03775199 -n03775847 -n03779000 -n03779370 -n03780047 -n03781787 -n03782190 -n03785499 -n03787523 -n03789171 -n03789400 -n03789946 -n03790230 -n03790512 -n03790755 -n03791235 -n03792048 -n03792526 -n03793850 -n03795976 -n03796181 -n03797390 -n03798982 -n03799113 -n03800485 -n03800772 -n03800933 -n03802007 -n03802228 -n03802393 -n03803116 -n03809312 -n03811295 -n03811444 -n03811847 -n03811965 -n03812382 -n03812924 -n03813176 -n03813946 -n03815278 -n03815482 -n03815615 -n03816005 -n03816136 -n03816849 -n03817647 -n03819595 -n03819994 -n03820154 -n03820318 -n03820728 -n03820950 -n03824197 -n03825080 -n03827536 -n03828020 -n03829340 -n03831757 -n03834040 -n03834604 -n03836062 -n03837422 -n03838748 -n03839172 -n03839276 -n03839795 -n03841666 -n03842156 -n03844045 -n03844233 -n03845190 -n03846234 -n03846772 -n03847471 -n03847823 -n03848168 -n03848348 -n03849275 -n03850613 -n03851341 -n03851787 -n03852280 -n03852688 -n03854815 -n03859280 -n03859495 -n03859958 -n03861430 -n03861842 -n03862676 -n03863923 -n03864139 -n03864356 -n03864692 -n03865371 -n03865949 -n03868406 -n03871083 -n03871524 -n03871724 -n03873848 -n03874138 -n03874823 -n03875218 -n03880129 -n03880323 -n03880531 -n03883054 -n03883773 -n03883944 -n03884639 -n03885535 -n03885669 -n03886053 -n03886641 -n03887185 -n03888022 -n03889503 -n03889726 -n03891051 -n03892557 -n03894051 -n03894379 -n03896103 -n03896233 -n03896419 -n03896628 -n03896984 -n03897943 -n03898271 -n03898633 -n03899612 -n03899933 -n03901338 -n03903133 -n03903424 -n03904060 -n03904183 -n03904433 -n03905540 -n03906997 -n03907654 -n03908204 -n03909160 -n03909406 -n03915118 -n03915437 -n03916470 -n03916720 -n03917327 -n03918480 -n03920737 -n03923564 -n03923692 -n03924069 -n03926148 -n03926412 -n03926876 -n03927792 -n03928116 -n03929091 -n03929202 -n03929443 -n03930515 -n03932670 -n03936269 -n03938522 -n03939677 -n03940256 -n03941684 -n03943920 -n03945615 -n03947111 -n03947466 -n03948459 -n03951971 -n03953020 -n03953416 -n03955809 -n03956785 -n03956922 -n03957315 -n03957762 -n03958630 -n03958752 -n03959014 -n03959701 -n03961939 -n03962525 -n03962932 -n03963028 -n03965907 -n03966325 -n03966751 -n03966976 -n03967942 -n03968293 -n03971321 -n03972524 -n03973520 -n03973628 -n03975035 -n03979377 -n03979492 -n03980026 -n03981340 -n03982232 -n03982895 -n03984234 -n03984381 -n03985232 -n03986704 -n03988170 -n03989665 -n03990474 -n03991443 -n03992325 -n03992703 -n03993180 -n03993403 -n03994008 -n03994757 -n03995018 -n03995856 -n03996145 -n03996416 -n03997484 -n03999992 -n04000311 -n04001397 -n04001499 -n04001845 -n04004210 -n04004475 -n04005912 -n04007664 -n04010057 -n04010779 -n04010927 -n04011827 -n04012084 -n04013729 -n04014297 -n04015204 -n04016576 -n04016684 -n04018399 -n04018667 -n04019101 -n04019696 -n04020087 -n04020298 -n04020912 -n04021028 -n04021362 -n04021798 -n04022332 -n04022708 -n04023249 -n04024274 -n04026053 -n04026918 -n04027023 -n04027706 -n04028315 -n04029734 -n04030274 -n04036303 -n04037964 -n04038440 -n04038727 -n04039848 -n04042358 -n04042632 -n04042795 -n04042985 -n04043733 -n04044307 -n04044498 -n04045085 -n04045397 -n04046590 -n04046974 -n04047401 -n04049405 -n04050066 -n04051549 -n04051825 -n04052757 -n04056932 -n04057047 -n04057435 -n04057846 -n04057981 -n04058096 -n04058239 -n04059947 -n04060647 -n04060904 -n04061793 -n04061969 -n04062644 -n04063373 -n04063868 -n04064401 -n04065464 -n04065789 -n04067231 -n04067353 -n04067921 -n04068441 -n04068601 -n04069276 -n04069777 -n04070207 -n04070964 -n04071102 -n04071263 -n04071393 -n04072193 -n04072551 -n04073948 -n04075468 -n04075916 -n04076284 -n04077430 -n04077734 -n04078574 -n04079106 -n04079244 -n04079933 -n04080454 -n04080833 -n04081844 -n04083649 -n04086794 -n04087126 -n04087709 -n04088696 -n04088797 -n04089666 -n04089976 -n04090548 -n04091097 -n04093625 -n04095210 -n04096066 -n04097622 -n04097866 -n04099175 -n04099429 -n04100174 -n04101497 -n04101701 -n04102037 -n04102285 -n04102406 -n04102962 -n04104147 -n04104500 -n04105068 -n04105438 -n04105893 -n04107984 -n04108268 -n04110068 -n04110654 -n04110955 -n04111190 -n04111414 -n04111668 -n04113765 -n04114996 -n04115256 -n04115996 -n04116389 -n04118021 -n04121228 -n04122349 -n04122492 -n04122825 -n04123123 -n04123567 -n04123740 -n04125116 -n04125853 -n04126541 -n04126659 -n04126980 -n04127904 -n04128499 -n04128837 -n04131929 -n04134632 -n04136510 -n04137444 -n04137897 -n04138977 -n04139859 -n04140064 -n04140631 -n04141838 -n04143897 -n04146050 -n04147495 -n04148054 -n04149083 -n04151108 -n04151581 -n04151940 -n04152387 -n04154753 -n04156297 -n04156411 -n04157320 -n04158807 -n04158956 -n04160372 -n04160586 -n04161358 -n04161981 -n04164757 -n04164868 -n04166111 -n04167489 -n04169437 -n04170037 -n04171459 -n04171629 -n04171831 -n04174101 -n04174500 -n04176068 -n04176190 -n04176528 -n04177329 -n04177545 -n04180063 -n04180888 -n04181228 -n04181718 -n04182322 -n04183217 -n04183329 -n04184435 -n04184600 -n04185071 -n04186051 -n04186268 -n04186455 -n04186624 -n04186848 -n04187061 -n04187547 -n04187885 -n04189092 -n04190052 -n04190464 -n04190747 -n04190997 -n04191150 -n04191595 -n04191943 -n04192238 -n04192858 -n04194289 -n04196080 -n04197391 -n04198015 -n04198797 -n04199027 -n04201733 -n04202417 -n04205318 -n04206356 -n04207763 -n04210390 -n04211356 -n04211970 -n04215910 -n04216634 -n04216860 -n04216963 -n04217718 -n04217882 -n04219424 -n04221823 -n04222210 -n04222470 -n04222847 -n04225031 -n04225222 -n04225729 -n04226464 -n04226537 -n04227900 -n04229007 -n04229107 -n04229480 -n04230603 -n04230808 -n04231693 -n04232153 -n04233832 -n04234455 -n04235291 -n04235771 -n04236001 -n04236377 -n04236702 -n04238617 -n04241042 -n04241394 -n04242408 -n04243003 -n04243941 -n04244997 -n04245847 -n04246855 -n04247630 -n04247736 -n04248507 -n04249415 -n04250224 -n04250599 -n04253931 -n04255499 -n04256520 -n04260589 -n04261116 -n04262678 -n04263336 -n04263760 -n04264233 -n04264914 -n04266486 -n04267577 -n04269944 -n04270891 -n04271148 -n04272054 -n04272782 -n04273064 -n04273796 -n04275283 -n04275661 -n04275904 -n04278353 -n04279172 -n04279987 -n04280259 -n04280970 -n04283585 -n04283905 -n04284002 -n04285146 -n04285622 -n04285803 -n04286128 -n04288272 -n04288533 -n04288673 -n04289449 -n04291242 -n04291759 -n04292414 -n04292572 -n04293119 -n04293744 -n04294212 -n04294426 -n04295081 -n04295881 -n04299215 -n04300358 -n04301000 -n04301474 -n04303258 -n04304375 -n04305471 -n04306080 -n04306847 -n04307419 -n04307878 -n04308084 -n04308273 -n04308397 -n04308583 -n04308807 -n04309348 -n04309833 -n04310721 -n04311595 -n04312154 -n04312432 -n04313220 -n04314914 -n04315828 -n04315948 -n04317420 -n04318131 -n04318982 -n04319937 -n04320405 -n04322026 -n04322692 -n04322801 -n04323819 -n04326799 -n04326896 -n04328054 -n04328329 -n04328946 -n04329477 -n04330340 -n04330669 -n04330998 -n04331277 -n04332987 -n04333129 -n04338517 -n04339638 -n04340750 -n04340935 -n04341133 -n04341414 -n04341686 -n04346679 -n04347519 -n04348184 -n04348359 -n04349401 -n04350104 -n04350458 -n04354589 -n04356595 -n04358707 -n04358874 -n04359335 -n04359589 -n04360501 -n04360798 -n04361095 -n04361260 -n04362821 -n04363210 -n04363874 -n04364545 -n04364827 -n04364994 -n04365328 -n04365484 -n04365751 -n04368695 -n04370048 -n04371563 -n04373894 -n04375775 -n04377057 -n04378956 -n04379243 -n04379964 -n04380346 -n04381994 -n04382334 -n04382880 -n04383130 -n04383301 -n04386664 -n04387201 -n04387400 -n04388162 -n04388743 -n04389521 -n04390873 -n04391838 -n04392526 -n04393095 -n04394261 -n04395875 -n04397168 -n04397261 -n04397645 -n04398497 -n04398688 -n04398834 -n04399046 -n04400289 -n04401088 -n04402057 -n04402580 -n04402746 -n04402984 -n04403638 -n04404817 -n04404997 -n04405540 -n04405762 -n04407435 -n04407686 -n04409128 -n04409806 -n04410086 -n04410365 -n04410485 -n04411264 -n04411966 -n04413151 -n04413419 -n04415663 -n04416901 -n04417180 -n04417361 -n04417809 -n04419073 -n04421872 -n04422875 -n04427715 -n04428008 -n04431436 -n04431745 -n04434932 -n04435180 -n04436185 -n04436401 -n04436542 -n04437670 -n04437953 -n04438304 -n04438643 -n04440963 -n04441662 -n04444749 -n04445040 -n04445952 -n04446276 -n04447276 -n04447443 -n04448070 -n04448361 -n04450243 -n04450640 -n04450749 -n04451818 -n04452615 -n04452848 -n04453156 -n04453666 -n04453910 -n04454654 -n04455250 -n04455652 -n04456472 -n04457326 -n04458843 -n04459362 -n04459610 -n04460130 -n04462011 -n04463679 -n04464852 -n04467099 -n04467307 -n04468005 -n04469251 -n04470741 -n04471315 -n04471632 -n04472243 -n04472726 -n04473884 -n04474466 -n04475411 -n04475631 -n04477548 -n04478512 -n04478657 -n04480527 -n04481524 -n04487724 -n04488427 -n04489008 -n04489817 -n04490091 -n04491769 -n04493109 -n04494204 -n04495450 -n04497442 -n04497570 -n04498523 -n04499446 -n04499554 -n04500060 -n04501837 -n04502197 -n04502502 -n04502670 -n04502851 -n04504141 -n04504770 -n04505036 -n04506994 -n04507453 -n04508163 -n04508489 -n04508949 -n04509260 -n04509592 -n04511002 -n04514241 -n04516116 -n04516214 -n04516672 -n04518132 -n04519153 -n04520170 -n04520382 -n04521987 -n04524313 -n04527648 -n04529681 -n04530566 -n04531098 -n04531873 -n04533042 -n04533199 -n04533700 -n04534127 -n04534895 -n04536153 -n04538552 -n04539203 -n04540761 -n04541320 -n04543158 -n04544450 -n04546194 -n04546855 -n04547592 -n04549122 -n04549919 -n04551055 -n04552696 -n04553389 -n04554871 -n04555600 -n04555897 -n04556948 -n04557308 -n04557751 -n04558059 -n04558804 -n04559023 -n04559730 -n04562262 -n04563204 -n04565375 -n04566257 -n04567098 -n04568069 -n04568557 -n04569520 -n04569822 -n04570958 -n04571292 -n04571566 -n04571958 -n04572935 -n04574471 -n04574999 -n04576002 -n04576211 -n04576971 -n04577426 -n04577769 -n04578801 -n04579230 -n04580493 -n04581595 -n04582349 -n04583620 -n04585745 -n04585980 -n04586932 -n04587648 -n04588739 -n04589190 -n04589434 -n04591056 -n04591887 -n04592005 -n04592099 -n04594218 -n04594489 -n04595285 -n04595855 -n04596852 -n04597066 -n04597804 -n04598136 -n04598582 -n04599124 -n04600312 -n04600486 -n04600912 -n04603729 -n04603872 -n04605726 -n04606574 -n04608329 -n04608567 -n04609531 -n04609651 -n04610176 -n04610503 -n04610676 -n04611916 -n04613015 -n04615226 -n04615644 -n04950713 -n04951373 -n04958634 -n04959672 -n04960277 -n04961691 -n04963740 -n04965179 -n04965661 -n04967191 -n04968895 -n04970059 -n04970631 -n04970916 -n04972801 -n04973386 -n04976952 -n05238282 -n05241218 -n05242070 -n05244934 -n05266879 -n05399034 -n05447757 -n05449959 -n05453657 -n05467758 -n05586759 -n06254669 -n06262567 -n06263369 -n06263609 -n06263762 -n06266417 -n06266710 -n06267145 -n06271778 -n06272290 -n06272803 -n06274092 -n06275353 -n06276697 -n06277280 -n06281040 -n06359467 -n06359657 -n06418693 -n06591815 -n06592078 -n06595351 -n06613686 -n06793231 -n07556637 -n07556970 -n07557165 -n07557434 -n07560652 -n07561112 -n07562495 -n07563800 -n07564629 -n07564971 -n07565725 -n07565945 -n07566340 -n07566863 -n07567390 -n07567707 -n07568818 -n07569106 -n07569543 -n07570720 -n07572353 -n07572957 -n07573103 -n07573696 -n07574602 -n07575076 -n07575726 -n07575984 -n07576182 -n07576438 -n07576577 -n07577374 -n07579575 -n07580053 -n07580359 -n07580470 -n07581346 -n07581775 -n07582277 -n07582441 -n07582609 -n07583197 -n07584228 -n07584593 -n07585208 -n07587441 -n07587700 -n07588947 -n07590320 -n07591473 -n07592094 -n07592656 -n07593774 -n07595914 -n07596046 -n07596452 -n07596684 -n07597145 -n07597365 -n07598734 -n07599468 -n07599783 -n07599998 -n07600506 -n07601407 -n07605474 -n07605944 -n07606278 -n07606764 -n07607707 -n07609407 -n07609840 -n07611148 -n07611358 -n07611839 -n07611991 -n07612367 -n07612632 -n07612996 -n07613671 -n07614198 -n07614825 -n07615052 -n07615190 -n07615460 -n07615569 -n07615671 -n07616590 -n07617188 -n07619004 -n07623136 -n07624466 -n07627931 -n07628068 -n07641928 -n07642471 -n07642933 -n07643306 -n07643474 -n07643764 -n07643981 -n07644244 -n07663899 -n07678729 -n07679356 -n07680517 -n07680932 -n07681926 -n07682316 -n07682624 -n07683786 -n07684600 -n07685730 -n07686873 -n07687211 -n07687469 -n07687789 -n07689003 -n07690273 -n07690892 -n07692405 -n07692614 -n07693889 -n07693972 -n07694403 -n07695878 -n07695965 -n07697100 -n07704054 -n07705931 -n07707451 -n07708512 -n07708798 -n07709333 -n07710007 -n07710283 -n07710616 -n07710952 -n07712063 -n07712382 -n07712748 -n07712856 -n07713395 -n07713895 -n07714078 -n07714802 -n07714895 -n07715561 -n07715721 -n07716034 -n07717070 -n07717858 -n07718671 -n07719437 -n07719839 -n07720442 -n07720615 -n07721325 -n07721456 -n07721678 -n07722217 -n07722763 -n07723330 -n07723559 -n07723753 -n07724943 -n07725376 -n07725531 -n07726796 -n07727578 -n07727868 -n07728804 -n07729000 -n07729485 -n07730406 -n07730855 -n07731122 -n07731587 -n07731952 -n07732302 -n07732747 -n07734017 -n07734292 -n07735052 -n07735803 -n07737081 -n07739125 -n07739506 -n07740220 -n07740954 -n07741461 -n07742012 -n07742704 -n07744246 -n07747055 -n07747811 -n07747951 -n07748753 -n07748912 -n07749095 -n07749192 -n07749312 -n07749731 -n07750586 -n07751451 -n07752377 -n07752664 -n07753743 -n07755089 -n07755411 -n07755707 -n07756096 -n07757132 -n07757312 -n07757602 -n07757990 -n07758680 -n07758950 -n07759424 -n07759691 -n07759816 -n07760501 -n07761141 -n07761309 -n07761611 -n07761777 -n07761954 -n07767344 -n07767847 -n07770571 -n07771212 -n07800091 -n07800740 -n07801508 -n07802152 -n07802417 -n07803093 -n07803545 -n07804323 -n07805254 -n07805594 -n07805731 -n07806221 -n07806633 -n07807317 -n07807710 -n07807922 -n07809096 -n07809368 -n07810907 -n07811416 -n07812184 -n07814203 -n07815588 -n07818277 -n07819480 -n07820497 -n07820814 -n07823951 -n07824702 -n07824988 -n07825717 -n07828987 -n07829412 -n07830593 -n07832902 -n07834507 -n07836731 -n07837002 -n07837362 -n07838233 -n07841495 -n07841639 -n07841907 -n07842753 -n07842972 -n07843464 -n07843775 -n07844042 -n07844604 -n07846143 -n07847198 -n07848338 -n07848771 -n07849336 -n07850083 -n07850329 -n07851298 -n07852045 -n07852919 -n07854813 -n07856270 -n07857959 -n07858595 -n07859284 -n07859583 -n07860805 -n07861158 -n07861813 -n07863374 -n07864638 -n07865105 -n07867421 -n07867883 -n07869391 -n07869775 -n07870313 -n07871436 -n07873464 -n07874063 -n07874159 -n07874259 -n07874343 -n07874441 -n07874780 -n07875693 -n07875835 -n07876281 -n07880751 -n07881117 -n07881205 -n07881404 -n07881800 -n07882497 -n07882886 -n07883031 -n07883251 -n07883384 -n07884567 -n07886572 -n07886849 -n07887634 -n07888465 -n07888909 -n07889510 -n07890352 -n07890750 -n07891726 -n07892813 -n07893528 -n07893891 -n07894102 -n07894298 -n07894965 -n07895237 -n07895435 -n07895595 -n07895710 -n07895839 -n07896287 -n07897200 -n07897865 -n07898117 -n07898333 -n07898745 -n07899108 -n07900406 -n07900616 -n07901587 -n07903208 -n07904395 -n07905038 -n07906284 -n07906877 -n07907161 -n07907548 -n07907943 -n07909129 -n07909811 -n07911371 -n07911677 -n07912211 -n07913393 -n07914413 -n07915618 -n07916041 -n07917618 -n07918028 -n07920222 -n07921455 -n07921948 -n07923748 -n07924033 -n07924560 -n07924834 -n07925966 -n07926920 -n07927197 -n07927931 -n07929519 -n07930554 -n07931001 -n07931096 -n07932614 -n07932841 -n07933274 -n07933891 -n07934032 -n07934530 -n07935152 -n07935504 -n07936263 -n07936745 -n07938149 -n07951464 -n08554440 -n08558963 -n08596076 -n08598301 -n08616050 -n08640531 -n08659446 -n09191635 -n09206896 -n09206985 -n09210862 -n09213434 -n09213565 -n09214060 -n09214916 -n09215437 -n09217230 -n09230041 -n09233446 -n09238926 -n09255070 -n09259025 -n09259219 -n09262690 -n09265620 -n09269882 -n09270735 -n09287968 -n09289331 -n09289596 -n09290444 -n09295946 -n09300306 -n09302616 -n09303008 -n09303528 -n09304750 -n09305031 -n09308572 -n09309292 -n09315159 -n09326662 -n09335693 -n09335809 -n09336555 -n09337253 -n09344198 -n09352849 -n09359803 -n09362945 -n09366017 -n09366317 -n09375606 -n09376526 -n09381242 -n09393605 -n09396465 -n09398677 -n09405787 -n09406793 -n09409512 -n09409752 -n09410224 -n09416076 -n09421799 -n09428628 -n09432990 -n09433442 -n09437454 -n09439213 -n09443641 -n09453008 -n09458269 -n09472413 -n09474010 -n09505153 -n09606009 -n09606527 -n09608709 -n09610405 -n09613191 -n09615336 -n09616922 -n09619168 -n09619452 -n09620078 -n09620794 -n09622049 -n09622302 -n09624168 -n09624559 -n09625401 -n09626238 -n09627906 -n09629246 -n09629752 -n09631129 -n09632274 -n09632518 -n09633969 -n09636339 -n09638875 -n09639919 -n09641002 -n09644152 -n09648743 -n09651123 -n09665545 -n09669631 -n09670280 -n09676884 -n09679925 -n09690208 -n09694771 -n09696585 -n09697401 -n09700964 -n09701148 -n09701833 -n09705124 -n09708750 -n09710164 -n09716047 -n09718217 -n09722658 -n09724785 -n09725229 -n09725772 -n09726621 -n09727440 -n09727826 -n09730204 -n09731436 -n09731571 -n09735258 -n09738400 -n09744679 -n09754217 -n09758173 -n09758885 -n09761068 -n09763784 -n09764201 -n09764598 -n09765278 -n09767197 -n09769076 -n09770179 -n09771435 -n09772746 -n09773962 -n09774783 -n09790482 -n09792555 -n09795124 -n09795334 -n09800964 -n09802445 -n09802641 -n09805151 -n09805475 -n09809538 -n09809749 -n09810166 -n09811712 -n09814660 -n09815790 -n09816771 -n09818022 -n09820263 -n09821831 -n09823502 -n09824135 -n09824609 -n09826204 -n09830194 -n09831962 -n09834699 -n09836160 -n09840217 -n09841188 -n09841515 -n09841696 -n09842047 -n09848489 -n09851575 -n09853645 -n09853881 -n09854915 -n09857007 -n09861946 -n09865398 -n09868270 -n09871681 -n09877951 -n09889691 -n09892693 -n09894654 -n09895222 -n09895701 -n09902353 -n09903153 -n09910374 -n09917593 -n09918248 -n09923418 -n09923673 -n09924996 -n09927089 -n09927451 -n09928136 -n09928451 -n09929298 -n09930257 -n09930876 -n09931640 -n09933098 -n09935434 -n09936892 -n09937056 -n09941964 -n09942970 -n09943239 -n09943811 -n09944160 -n09945319 -n09950457 -n09951070 -n09951274 -n09960688 -n09962966 -n09964411 -n09968845 -n09974648 -n09976728 -n09979321 -n09983572 -n09989502 -n09990415 -n09991867 -n09992538 -n09992837 -n09993252 -n09994673 -n09996481 -n09997622 -n10001217 -n10006748 -n10007684 -n10009484 -n10009671 -n10015215 -n10015897 -n10017422 -n10018861 -n10020890 -n10024362 -n10029068 -n10034201 -n10034614 -n10035952 -n10036266 -n10036929 -n10037385 -n10040945 -n10041887 -n10042690 -n10043643 -n10044879 -n10047459 -n10048367 -n10048836 -n10052694 -n10053808 -n10054657 -n10055730 -n10055847 -n10060175 -n10067968 -n10070711 -n10077593 -n10078131 -n10078806 -n10079399 -n10079893 -n10080869 -n10083823 -n10084043 -n10084295 -n10086383 -n10091651 -n10092488 -n10093475 -n10094584 -n10095869 -n10098710 -n10098862 -n10099375 -n10101634 -n10102800 -n10105085 -n10107303 -n10109662 -n10111903 -n10112129 -n10118844 -n10126177 -n10126424 -n10126708 -n10127689 -n10129825 -n10134396 -n10134982 -n10136959 -n10142747 -n10142946 -n10143172 -n10143725 -n10145340 -n10145774 -n10148305 -n10150071 -n10150940 -n10151570 -n10153594 -n10154186 -n10154601 -n10155849 -n10162194 -n10164233 -n10165448 -n10168183 -n10168584 -n10171567 -n10182190 -n10185793 -n10186774 -n10187130 -n10195593 -n10200781 -n10202624 -n10205457 -n10206173 -n10207169 -n10210137 -n10215623 -n10216106 -n10224578 -n10225219 -n10228278 -n10235385 -n10237069 -n10241300 -n10243664 -n10245639 -n10249270 -n10249459 -n10249950 -n10257221 -n10259348 -n10263411 -n10266328 -n10266848 -n10271677 -n10273064 -n10274815 -n10276045 -n10282672 -n10284064 -n10284965 -n10296444 -n10299250 -n10299700 -n10305635 -n10305802 -n10306004 -n10308732 -n10312287 -n10314054 -n10315561 -n10316360 -n10317007 -n10317500 -n10320863 -n10321340 -n10322238 -n10323999 -n10324560 -n10328437 -n10332385 -n10335246 -n10335931 -n10340312 -n10341573 -n10343554 -n10345100 -n10353016 -n10353355 -n10355142 -n10355449 -n10355688 -n10356450 -n10357613 -n10360747 -n10366966 -n10369528 -n10370381 -n10376523 -n10377021 -n10379376 -n10380672 -n10383816 -n10386984 -n10387196 -n10387324 -n10393909 -n10396106 -n10399130 -n10400998 -n10402824 -n10403876 -n10405694 -n10407954 -n10409752 -n10411551 -n10415037 -n10417551 -n10418101 -n10419047 -n10420031 -n10421016 -n10426454 -n10427764 -n10428004 -n10433737 -n10435716 -n10435988 -n10438172 -n10439851 -n10444194 -n10450303 -n10462860 -n10464052 -n10466918 -n10467179 -n10470779 -n10474064 -n10474645 -n10478960 -n10481268 -n10482054 -n10482921 -n10484858 -n10488309 -n10495421 -n10499355 -n10499857 -n10506544 -n10508710 -n10512372 -n10512708 -n10519494 -n10521100 -n10521662 -n10522035 -n10522324 -n10522759 -n10523341 -n10525134 -n10525436 -n10525617 -n10527334 -n10529231 -n10541833 -n10542888 -n10543161 -n10544232 -n10544748 -n10546633 -n10548537 -n10548681 -n10554846 -n10556518 -n10557854 -n10559288 -n10560637 -n10568200 -n10570019 -n10575787 -n10576962 -n10577284 -n10580535 -n10582746 -n10583387 -n10594147 -n10595164 -n10595647 -n10599806 -n10602985 -n10604634 -n10605253 -n10610465 -n10612210 -n10614629 -n10617193 -n10618685 -n10618848 -n10619642 -n10620758 -n10622053 -n10624074 -n10624310 -n10625860 -n10628644 -n10630188 -n10632576 -n10633450 -n10648237 -n10648696 -n10654932 -n10657835 -n10661002 -n10661563 -n10665698 -n10669991 -n10674130 -n10676018 -n10679174 -n10682953 -n10686073 -n10692883 -n10693824 -n10694258 -n10698368 -n10700201 -n10700640 -n10701180 -n10703336 -n10703692 -n10705615 -n10707233 -n10708454 -n10709529 -n10713686 -n10720453 -n10721321 -n10722575 -n10722965 -n10726786 -n10735298 -n10740868 -n10741152 -n10742997 -n10744164 -n10747119 -n10751265 -n10752480 -n10759151 -n10759982 -n10763383 -n10763620 -n10765679 -n10766260 -n10768903 -n10779610 -n10780632 -n10782791 -n10782940 -n10787470 -n10791221 -n10792335 -n10793570 -n10794014 -n11531193 -n11537327 -n11542640 -n11545524 -n11545714 -n11547562 -n11547855 -n11552386 -n11553240 -n11596108 -n11598686 -n11600372 -n11601177 -n11601918 -n11608250 -n11609475 -n11609684 -n11612923 -n11614250 -n11618861 -n11620673 -n11621029 -n11623105 -n11624531 -n11627168 -n11628456 -n11630017 -n11630489 -n11643835 -n11645914 -n11647306 -n11649878 -n11650558 -n11650759 -n11661372 -n11665372 -n11666854 -n11669921 -n11672400 -n11674332 -n11676500 -n11684264 -n11689483 -n11693981 -n11697560 -n11700864 -n11703669 -n11708658 -n11709674 -n11713164 -n11720353 -n11722982 -n11723770 -n11725015 -n11725623 -n11727091 -n11729478 -n11733054 -n11736694 -n11741350 -n11745817 -n11747468 -n11748002 -n11751765 -n11752578 -n11756092 -n11756669 -n11759224 -n11763625 -n11767354 -n11769621 -n11771539 -n11774513 -n11775340 -n11779300 -n11782036 -n11783920 -n11785668 -n11789438 -n11789962 -n11790788 -n11793779 -n11794519 -n11796005 -n11801392 -n11805956 -n11807108 -n11807979 -n11808721 -n11811473 -n11815491 -n11817914 -n11820965 -n11823043 -n11830714 -n11830906 -n11832214 -n11836722 -n11839568 -n11845557 -n11851578 -n11855274 -n11857696 -n11862835 -n11865071 -n11866248 -n11868814 -n11869351 -n11869689 -n11872146 -n11875691 -n11875938 -n11877473 -n11878283 -n11887119 -n11890022 -n11892637 -n11894327 -n11898639 -n11900569 -n11902709 -n11915214 -n11915658 -n11915899 -n11916467 -n11918286 -n11919447 -n11920498 -n11924445 -n11928352 -n11928858 -n11931918 -n11932745 -n11939699 -n11940006 -n11943407 -n11944196 -n11945367 -n11946727 -n11947251 -n11948264 -n11950345 -n11951511 -n11952346 -n11953884 -n11954484 -n11956850 -n11965627 -n11967744 -n11970101 -n11971248 -n11971783 -n11972759 -n11973341 -n11976170 -n11977303 -n11978233 -n11982115 -n11985053 -n11985739 -n11988893 -n11991263 -n11997032 -n11997969 -n12006766 -n12008252 -n12008749 -n12010628 -n12013511 -n12015959 -n12018760 -n12020507 -n12024176 -n12030654 -n12034141 -n12036067 -n12036939 -n12041446 -n12043444 -n12045860 -n12050959 -n12053405 -n12056217 -n12057447 -n12062468 -n12065316 -n12065777 -n12075151 -n12076577 -n12080395 -n12083591 -n12086012 -n12086539 -n12087961 -n12090890 -n12092262 -n12094244 -n12095020 -n12096395 -n12101870 -n12102133 -n12105125 -n12107970 -n12108432 -n12109827 -n12110778 -n12112008 -n12112918 -n12113657 -n12117017 -n12119099 -n12119238 -n12121033 -n12124627 -n12126360 -n12131550 -n12135898 -n12136720 -n12137120 -n12137569 -n12139575 -n12141495 -n12142085 -n12143676 -n12144313 -n12146311 -n12147226 -n12152532 -n12153580 -n12154773 -n12155583 -n12156819 -n12157056 -n12157769 -n12158031 -n12158798 -n12159055 -n12159555 -n12160490 -n12161285 -n12163035 -n12164363 -n12166424 -n12168565 -n12170585 -n12173664 -n12174311 -n12174926 -n12182049 -n12187663 -n12188289 -n12195391 -n12196129 -n12199266 -n12201580 -n12202936 -n12205694 -n12214789 -n12215579 -n12217453 -n12221191 -n12224978 -n12225349 -n12226932 -n12231192 -n12236546 -n12237486 -n12244153 -n12245695 -n12246232 -n12252168 -n12252866 -n12253229 -n12256112 -n12257570 -n12260799 -n12262553 -n12265394 -n12266217 -n12266796 -n12268246 -n12269241 -n12269652 -n12271643 -n12274630 -n12275489 -n12281241 -n12284262 -n12286826 -n12287642 -n12288823 -n12290748 -n12293723 -n12296432 -n12300840 -n12302071 -n12303462 -n12305475 -n12306717 -n12307756 -n12310349 -n12316444 -n12318378 -n12320010 -n12322501 -n12328398 -n12330469 -n12334293 -n12334891 -n12335483 -n12335664 -n12335800 -n12340383 -n12341542 -n12342299 -n12343480 -n12344283 -n12346578 -n12350758 -n12352287 -n12355760 -n12360108 -n12360684 -n12364604 -n12367611 -n12374418 -n12377198 -n12381511 -n12385429 -n12387633 -n12387839 -n12392070 -n12396924 -n12399132 -n12401335 -n12401684 -n12405714 -n12409231 -n12411461 -n12412355 -n12412606 -n12416423 -n12419037 -n12420535 -n12421467 -n12421683 -n12425281 -n12430198 -n12431434 -n12437513 -n12437769 -n12441958 -n12446200 -n12446519 -n12449296 -n12450344 -n12451915 -n12454159 -n12459629 -n12460697 -n12461466 -n12462032 -n12463743 -n12464476 -n12466727 -n12470092 -n12474167 -n12475035 -n12476510 -n12480895 -n12491826 -n12495146 -n12499163 -n12506181 -n12508309 -n12509476 -n12511856 -n12516584 -n12522188 -n12524188 -n12526516 -n12527738 -n12539074 -n12539306 -n12546183 -n12548280 -n12550210 -n12554526 -n12556656 -n12560282 -n12560775 -n12562577 -n12572546 -n12573256 -n12575322 -n12582231 -n12582665 -n12582846 -n12583126 -n12583401 -n12584191 -n12586298 -n12590232 -n12594989 -n12595964 -n12602262 -n12602980 -n12612170 -n12614477 -n12615710 -n12620196 -n12622875 -n12624381 -n12625383 -n12631331 -n12633638 -n12634211 -n12634429 -n12635744 -n12636885 -n12638218 -n12638556 -n12639736 -n12640607 -n12641413 -n12641931 -n12642200 -n12643473 -n12644902 -n12645174 -n12647376 -n12649065 -n12650556 -n12651821 -n12653218 -n12655869 -n12658118 -n12658846 -n12659356 -n12660601 -n12662772 -n12663804 -n12665048 -n12667406 -n12667964 -n12674120 -n12674685 -n12682411 -n12683407 -n12685431 -n12685831 -n12688716 -n12690653 -n12695144 -n12698435 -n12705013 -n12707781 -n12708293 -n12709901 -n12711596 -n12713063 -n12714755 -n12715914 -n12717072 -n12719684 -n12724942 -n12725521 -n12727301 -n12731401 -n12732491 -n12732756 -n12733647 -n12741222 -n12742741 -n12743823 -n12746884 -n12749049 -n12752205 -n12755225 -n12756457 -n12762896 -n12768369 -n12771192 -n12772753 -n12777436 -n12778605 -n12779603 -n12785724 -n12791064 -n12793015 -n12794985 -n12798284 -n12800586 -n12801520 -n12805146 -n12806732 -n12810595 -n12812235 -n12814643 -n12817464 -n12822769 -n12823717 -n12823859 -n12832315 -n12833985 -n12834798 -n12836212 -n12836862 -n12839979 -n12840749 -n12842302 -n12842887 -n12844939 -n12849061 -n12853080 -n12854048 -n12858150 -n12866968 -n12869478 -n12870535 -n12871272 -n12877244 -n12878169 -n12879963 -n12882779 -n12884260 -n12890265 -n12893463 -n12903367 -n12904938 -n12908645 -n12909421 -n12912670 -n12917901 -n12922763 -n12926480 -n12928071 -n12929403 -n12930778 -n12931906 -n12934036 -n12934479 -n12939104 -n12941536 -n12942395 -n12943443 -n12946849 -n12950126 -n12952165 -n12953206 -n12956170 -n12957608 -n12960378 -n12960863 -n12965626 -n12968136 -n12969131 -n12970193 -n12971400 -n12973791 -n12974987 -n12976198 -n12980840 -n12982468 -n12983961 -n12985773 -n12987056 -n12988158 -n12992868 -n12997654 -n12997919 -n13000891 -n13001041 -n13001206 -n13001366 -n13001529 -n13002750 -n13002925 -n13003061 -n13003254 -n13003522 -n13003712 -n13004423 -n13004640 -n13004826 -n13004992 -n13005329 -n13005984 -n13006171 -n13006631 -n13006894 -n13007417 -n13007629 -n13008157 -n13008315 -n13008485 -n13008689 -n13008839 -n13009085 -n13009244 -n13009429 -n13009656 -n13010694 -n13010951 -n13011221 -n13012253 -n13012469 -n13012973 -n13013534 -n13013764 -n13013965 -n13014097 -n13014265 -n13014409 -n13014581 -n13014741 -n13014879 -n13017102 -n13017240 -n13017439 -n13017610 -n13017789 -n13017979 -n13018088 -n13018232 -n13018407 -n13019496 -n13019643 -n13019835 -n13020191 -n13020481 -n13020964 -n13021166 -n13021332 -n13021543 -n13021689 -n13021867 -n13022210 -n13022709 -n13024012 -n13024500 -n13025647 -n13028611 -n13032115 -n13032923 -n13035241 -n13035389 -n13035707 -n13037585 -n13037805 -n13038068 -n13038376 -n13038744 -n13039349 -n13040629 -n13040796 -n13041312 -n13042982 -n13043926 -n13045210 -n13045975 -n13046130 -n13049953 -n13055423 -n13055577 -n13055792 -n13055949 -n13056135 -n13056349 -n13056607 -n13056799 -n13057054 -n13057242 -n13057422 -n13057639 -n13058037 -n13058272 -n13058608 -n13059298 -n13059657 -n13060017 -n13060190 -n13063269 -n13066129 -n13067191 -n13068917 -n13070308 -n13070875 -n13071371 -n13071553 -n13071815 -n13072031 -n13072209 -n13072350 -n13072528 -n13072706 -n13072863 -n13073055 -n13073703 -n13074619 -n13074814 -n13075020 -n13075272 -n13075441 -n13075684 -n13075847 -n13076041 -n13076405 -n13076643 -n13076831 -n13077033 -n13077295 -n13079419 -n13083023 -n13084184 -n13085113 -n13091620 -n13091774 -n13100156 -n13100677 -n13104059 -n13108131 -n13108662 -n13108841 -n13109733 -n13110915 -n13111174 -n13111881 -n13118707 -n13119870 -n13120211 -n13121104 -n13122364 -n13123431 -n13125117 -n13130161 -n13130726 -n13132034 -n13132338 -n13132486 -n13132940 -n13134302 -n13134947 -n13135832 -n13136316 -n13136556 -n13137409 -n13137672 -n13138308 -n13138658 -n13138842 -n13139055 -n13139647 -n13141141 -n13145444 -n13149296 -n13150894 -n13154841 -n13156986 -n13157137 -n13160831 -n13163991 -n13172923 -n13174670 -n13177529 -n13180534 -n13186388 -n13188096 -n13188268 -n13192625 -n13193642 -n13194572 -n13195761 -n13199970 -n13201969 -n13206817 -n13207736 -n13208705 -n13211790 -n13219422 -n13221529 -n13224673 -n13230662 -n13231678 -n13231919 -n13232106 -n13232363 -n13232779 -n13233727 -n13238375 -n13238988 -n13252672 -n13862780 -n13863186 -n13863473 -n13863771 -n13864153 -n13864965 -n13865298 -n13865483 -n13866144 -n13866827 -n13867492 -n13868248 -n13868371 -n13872592 -n13873502 -n13875392 -n13875571 -n13878306 -n13879320 -n13883603 -n13888491 -n13893786 -n13894434 -n13896100 -n13897996 -n13900287 -n13903079 -n13905121 -n13905275 -n13905792 -n13912260 -n13915999 -n14633206 -n14696793 -n14844693 -n14853210 -n14899328 -n14900184 -n14974264 -n14977504 -n14992287 -n15062057 -n15067877 -n15089258 -n15089472 -n15089645 -n15089803 -n15090742 -n15092409 -n15092751 diff --git a/build/darknet/x64/data/imagenet.shortnames.list b/build/darknet/x64/data/imagenet.shortnames.list deleted file mode 100644 index e9600eb5b93..00000000000 --- a/build/darknet/x64/data/imagenet.shortnames.list +++ /dev/null @@ -1,21842 +0,0 @@ -kit fox -English setter -Siberian husky -Australian terrier -English springer -grey whale -lesser panda -Egyptian cat -ibex -Persian cat -cougar -gazelle -porcupine -sea lion -malamute -badger -Great Dane -Walker hound -Welsh springer spaniel -whippet -Scottish deerhound -killer whale -mink -African elephant -Weimaraner -soft-coated wheaten terrier -Dandie Dinmont -red wolf -Old English sheepdog -jaguar -otterhound -bloodhound -Airedale -hyena -meerkat -giant schnauzer -titi -three-toed sloth -sorrel -black-footed ferret -dalmatian -black-and-tan coonhound -papillon -skunk -Staffordshire bullterrier -Mexican hairless -Bouvier des Flandres -weasel -miniature poodle -Cardigan -malinois -bighorn -fox squirrel -colobus -tiger cat -Lhasa -impala -coyote -Yorkshire terrier -Newfoundland -brown bear -red fox -Norwegian elkhound -Rottweiler -hartebeest -Saluki -grey fox -schipperke -Pekinese -Brabancon griffon -West Highland white terrier -Sealyham terrier -guenon -mongoose -indri -tiger -Irish wolfhound -wild boar -EntleBucher -zebra -ram -French bulldog -orangutan -basenji -leopard -Bernese mountain dog -Maltese dog -Norfolk terrier -toy terrier -vizsla -cairn -squirrel monkey -groenendael -clumber -Siamese cat -chimpanzee -komondor -Afghan hound -Japanese spaniel -proboscis monkey -guinea pig -white wolf -ice bear -gorilla -borzoi -toy poodle -Kerry blue terrier -ox -Scotch terrier -Tibetan mastiff -spider monkey -Doberman -Boston bull -Greater Swiss Mountain dog -Appenzeller -Shih-Tzu -Irish water spaniel -Pomeranian -Bedlington terrier -warthog -Arabian camel -siamang -miniature schnauzer -collie -golden retriever -Irish terrier -affenpinscher -Border collie -hare -boxer -silky terrier -beagle -Leonberg -German short-haired pointer -patas -dhole -baboon -macaque -Chesapeake Bay retriever -bull mastiff -kuvasz -capuchin -pug -curly-coated retriever -Norwich terrier -flat-coated retriever -hog -keeshond -Eskimo dog -Brittany spaniel -standard poodle -Lakeland terrier -snow leopard -Gordon setter -dingo -standard schnauzer -hamster -Tibetan terrier -Arctic fox -wire-haired fox terrier -basset -water buffalo -American black bear -Angora -bison -howler monkey -hippopotamus -chow -giant panda -American Staffordshire terrier -Shetland sheepdog -Great Pyrenees -Chihuahua -tabby -marmoset -Labrador retriever -Saint Bernard -armadillo -Samoyed -bluetick -redbone -polecat -marmot -kelpie -gibbon -llama -miniature pinscher -wood rabbit -Italian greyhound -lion -cocker spaniel -Irish setter -dugong -Indian elephant -beaver -Sussex spaniel -Pembroke -Blenheim spaniel -Madagascar cat -Rhodesian ridgeback -lynx -African hunting dog -langur -Ibizan hound -timber wolf -cheetah -English foxhound -briard -sloth bear -Border terrier -German shepherd -otter -koala -tusker -echidna -wallaby -platypus -wombat -revolver -umbrella -schooner -soccer ball -accordion -ant -starfish -chambered nautilus -grand piano -laptop -strawberry -airliner -warplane -airship -balloon -space shuttle -fireboat -gondola -speedboat -lifeboat -canoe -yawl -catamaran -trimaran -container ship -liner -pirate -aircraft carrier -submarine -wreck -half track -tank -missile -bobsled -dogsled -bicycle-built-for-two -mountain bike -freight car -passenger car -barrow -shopping cart -motor scooter -forklift -electric locomotive -steam locomotive -amphibian -ambulance -beach wagon -cab -convertible -jeep -limousine -minivan -Model T -racer -sports car -go-kart -golfcart -moped -snowplow -fire engine -garbage truck -pickup -tow truck -trailer truck -moving van -police van -recreational vehicle -streetcar -snowmobile -tractor -mobile home -tricycle -unicycle -horse cart -jinrikisha -oxcart -bassinet -cradle -crib -four-poster -bookcase -china cabinet -medicine chest -chiffonier -table lamp -file -park bench -barber chair -throne -folding chair -rocking chair -studio couch -toilet seat -desk -pool table -dining table -entertainment center -wardrobe -Granny Smith -orange -lemon -fig -pineapple -banana -jackfruit -custard apple -pomegranate -acorn -hip -ear -rapeseed -corn -buckeye -organ -upright -chime -drum -gong -maraca -marimba -steel drum -banjo -cello -violin -harp -acoustic guitar -electric guitar -cornet -French horn -trombone -harmonica -ocarina -panpipe -bassoon -oboe -sax -flute -daisy -yellow lady's slipper -cliff -valley -alp -volcano -promontory -sandbar -coral reef -lakeside -seashore -geyser -hatchet -cleaver -letter opener -plane -power drill -lawn mower -hammer -corkscrew -can opener -plunger -screwdriver -shovel -plow -chain saw -cock -hen -ostrich -brambling -goldfinch -house finch -junco -indigo bunting -robin -bulbul -jay -magpie -chickadee -water ouzel -kite -bald eagle -vulture -great grey owl -black grouse -ptarmigan -ruffed grouse -prairie chicken -peacock -quail -partridge -African grey -macaw -sulphur-crested cockatoo -lorikeet -coucal -bee eater -hornbill -hummingbird -jacamar -toucan -drake -red-breasted merganser -goose -black swan -white stork -black stork -spoonbill -flamingo -American egret -little blue heron -bittern -crane -limpkin -American coot -bustard -ruddy turnstone -red-backed sandpiper -redshank -dowitcher -oystercatcher -European gallinule -pelican -king penguin -albatross -great white shark -tiger shark -hammerhead -electric ray -stingray -barracouta -coho -tench -goldfish -eel -rock beauty -anemone fish -lionfish -puffer -sturgeon -gar -loggerhead -leatherback turtle -mud turtle -terrapin -box turtle -banded gecko -common iguana -American chameleon -whiptail -agama -frilled lizard -alligator lizard -Gila monster -green lizard -African chameleon -Komodo dragon -triceratops -African crocodile -American alligator -thunder snake -ringneck snake -hognose snake -green snake -king snake -garter snake -water snake -vine snake -night snake -boa constrictor -rock python -Indian cobra -green mamba -sea snake -horned viper -diamondback -sidewinder -European fire salamander -common newt -eft -spotted salamander -axolotl -bullfrog -tree frog -tailed frog -whistle -wing -paintbrush -hand blower -oxygen mask -snorkel -loudspeaker -microphone -screen -mouse -electric fan -oil filter -strainer -space heater -stove -guillotine -barometer -rule -odometer -scale -analog clock -digital clock -wall clock -hourglass -sundial -parking meter -stopwatch -digital watch -stethoscope -syringe -magnetic compass -binoculars -projector -sunglasses -loupe -radio telescope -bow -cannon -assault rifle -rifle -projectile -computer keyboard -typewriter keyboard -crane -lighter -abacus -cash machine -slide rule -desktop computer -hand-held computer -notebook -web site -harvester -thresher -printer -slot -vending machine -sewing machine -joystick -switch -hook -car wheel -paddlewheel -pinwheel -potter's wheel -gas pump -carousel -swing -reel -radiator -puck -hard disc -sunglass -pick -car mirror -solar dish -remote control -disk brake -buckle -hair slide -knot -combination lock -padlock -nail -safety pin -screw -muzzle -seat belt -ski -candle -jack-o'-lantern -spotlight -torch -neck brace -pier -tripod -maypole -mousetrap -spider web -trilobite -harvestman -scorpion -black and gold garden spider -barn spider -garden spider -black widow -tarantula -wolf spider -tick -centipede -isopod -Dungeness crab -rock crab -fiddler crab -king crab -American lobster -spiny lobster -crayfish -hermit crab -tiger beetle -ladybug -ground beetle -long-horned beetle -leaf beetle -dung beetle -rhinoceros beetle -weevil -fly -bee -grasshopper -cricket -walking stick -cockroach -mantis -cicada -leafhopper -lacewing -dragonfly -damselfly -admiral -ringlet -monarch -cabbage butterfly -sulphur butterfly -lycaenid -jellyfish -sea anemone -brain coral -flatworm -nematode -conch -snail -slug -sea slug -chiton -sea urchin -sea cucumber -iron -espresso maker -microwave -Dutch oven -rotisserie -toaster -waffle iron -vacuum -dishwasher -refrigerator -washer -Crock Pot -frying pan -wok -caldron -coffeepot -teapot -spatula -altar -triumphal arch -patio -steel arch bridge -suspension bridge -viaduct -barn -greenhouse -palace -monastery -library -apiary -boathouse -church -mosque -stupa -planetarium -restaurant -cinema -home theater -lumbermill -coil -obelisk -totem pole -castle -prison -grocery store -bakery -barbershop -bookshop -butcher shop -confectionery -shoe shop -tobacco shop -toyshop -fountain -cliff dwelling -yurt -dock -brass -megalith -bannister -breakwater -dam -chainlink fence -picket fence -worm fence -stone wall -grille -sliding door -turnstile -mountain tent -scoreboard -honeycomb -plate rack -pedestal -beacon -mashed potato -bell pepper -head cabbage -broccoli -cauliflower -zucchini -spaghetti squash -acorn squash -butternut squash -cucumber -artichoke -cardoon -mushroom -shower curtain -jean -carton -handkerchief -sandal -ashcan -safe -plate -necklace -croquet ball -fur coat -thimble -pajama -running shoe -cocktail shaker -chest -manhole cover -modem -tub -tray -balance beam -bagel -prayer rug -kimono -hot pot -whiskey jug -knee pad -book jacket -spindle -ski mask -beer bottle -crash helmet -bottlecap -tile roof -mask -maillot -Petri dish -football helmet -bathing cap -teddy -holster -pop bottle -photocopier -vestment -crossword puzzle -golf ball -trifle -suit -water tower -feather boa -cloak -red wine -drumstick -shield -Christmas stocking -hoopskirt -menu -stage -bonnet -meat loaf -baseball -face powder -scabbard -sunscreen -beer glass -hen-of-the-woods -guacamole -lampshade -wool -hay -bow tie -mailbag -water jug -bucket -dishrag -soup bowl -eggnog -mortar -trench coat -paddle -chain -swab -mixing bowl -potpie -wine bottle -shoji -bulletproof vest -drilling platform -binder -cardigan -sweatshirt -pot -birdhouse -hamper -ping-pong ball -pencil box -pay-phone -consomme -apron -punching bag -backpack -groom -bearskin -pencil sharpener -broom -mosquito net -abaya -mortarboard -poncho -crutch -Polaroid camera -space bar -cup -racket -traffic light -quill -radio -dough -cuirass -military uniform -lipstick -shower cap -monitor -oscilloscope -mitten -brassiere -French loaf -vase -milk can -rugby ball -paper towel -earthstar -envelope -miniskirt -cowboy hat -trolleybus -perfume -bathtub -hotdog -coral fungus -bullet train -pillow -toilet tissue -cassette -carpenter's kit -ladle -stinkhorn -lotion -hair spray -academic gown -dome -crate -wig -burrito -pill bottle -chain mail -theater curtain -window shade -barrel -washbasin -ballpoint -basketball -bath towel -cowboy boot -gown -window screen -agaric -cellular telephone -nipple -barbell -mailbox -lab coat -fire screen -minibus -packet -maze -pole -horizontal bar -sombrero -pickelhaube -rain barrel -wallet -cassette player -comic book -piggy bank -street sign -bell cote -fountain pen -Windsor tie -volleyball -overskirt -sarong -purse -bolo tie -bib -parachute -sleeping bag -television -swimming trunks -measuring cup -espresso -pizza -breastplate -shopping basket -wooden spoon -saltshaker -chocolate sauce -ballplayer -goblet -gyromitra -stretcher -water bottle -dial telephone -soap dispenser -jersey -school bus -jigsaw puzzle -plastic bag -reflex camera -diaper -Band Aid -ice lolly -velvet -tennis ball -gasmask -doormat -Loafer -ice cream -pretzel -quilt -maillot -tape player -clog -iPod -bolete -scuba diver -pitcher -matchstick -bikini -sock -CD player -lens cap -thatch -vault -beaker -bubble -cheeseburger -parallel bars -flagpole -coffee mug -rubber eraser -stole -carbonara -dumbbell -singles -Virginia deer -eastern grey squirrel -gelding -pylon -table-tennis table -peacock -Segway -surfing -tamandua -knocker -steering wheel -motorcycling -coati -sitar -range -backhoe -agaric -dashboard -water polo -concrete mixer -treadmill -golf bag -skateboarding -royal tennis -tartan -four-wheel drive -sport utility -sedan -print -luggage rack -softball -windmill -ben -red admiral -jalousie -towel rail -truss -strand -ice hockey -sconce -wind turbine -plush -stained-glass window -ballpark -thoroughbred -love seat -red-spotted purple -miller -Adelie -freight liner -clock tower -acrobatics -shaving brush -ewe -ottoman -African violet -bicycle wheel -cork -windmill -satin -comma -coffee mill -baggage -wasp's nest -batting glove -Ferris wheel -push-bike -porthole -football stadium -gas tank -barbecue -handlebar -hula-hoop -fairground -rapier -garter stitch -exercise bike -control tower -carryall -minute hand -cog -riverbank -water nymph -common dandelion -android -hairbrush -redberry -fret -display window -pepper mill -litterbin -drapery -ducking -fly-fishing -broad jump -sprinkler -water-skiing -chicory -sail -volleyball -rugby -Texas bluebonnet -computer monitor -tortoiseshell -airplane propeller -solar array -figure skating -air conditioner -purple loosestrife -gearshift -outboard motor -cowslip -Abyssinian -dip -workstation -cosy -bunker -neon lamp -campanile -casket -verbena -amphora -sumo -common foxglove -sprocket -jelly bean -emperor penguin -night-blooming cereus -clock radio -black birch -bomber jacket -Virginia bluebell -bayonet -walker -altarpiece -tattoo -bridle -rocker arm -water turkey -spiderwort -flange -mute swan -laser printer -carburetor -coverlet -mountainside -baritone -auto racing -baluster -gal -peach bells -taffeta -grandfather -asparagus -horizontal stabilizer -world -grate -marsh marigold -white rhinoceros -movement -split rail -rollerblading -longhorn -muffler -church tower -light bulb -American agave -backpacking tent -overall -New World goldfinch -sectional -wing chair -transom -integrated circuit -dad -spar -picture frame -no-hit game -alternator -drill press -strawflower -hepatica -rangefinder -blinker -Welsh pony -nib -wagon wheel -rotor -tie -denim -jetliner -sculling -external drive -window frame -mourning dove -censer -stapler -batting helmet -flagon -machete -windshield -hedgehog -weeping willow -chief executive officer -hepatica -pet -Asiatic black bear -chinchilla -uke -Atlantic bottlenose dolphin -hair -dishtowel -flintlock -Bermuda shorts -lavender -searchlight -millwheel -piano keyboard -luna moth -bumper -parrot -skirt -manhole -coffee table -footstool -judo -Dalai Lama -armored personnel carrier -voile -saber -thoroughbred -wild carrot -gemsbok -caster -butterfly orchid -cow -sideboard -horseshoe crab -match play -cassette recorder -photomicrograph -drafting table -pediment -tramline -shipping -kitten -wainscoting -fried rice -helix -marguerite -pumpkin -white-bellied swallow -Tulipa gesneriana -common dolphin -face -red squirrel -bicycling -shipwreck -banded purple -cornice -pendant earring -forsythia -aardvark -seashell -spat -shoulder bag -fallow deer -yearling -common teasel -tufted titmouse -ancient -professional golf -purl -vehicle -okra -great grandmother -common lilac -rose mallow -newspaper -crucifix -chukka -armlet -fulmar -wapiti -doily -Greco-Roman wrestling -bleeding heart -kitchen table -bluebonnet -Cape buffalo -spun yarn -crape myrtle -dewdrop -great blue heron -medalist -vaulting horse -spinning wheel -skyscraper -Tahitian -forget-me-not -watercourse -guitarist -gargoyle -bee balm -pumpkin -hunting knife -flutist -lectern -skateboarder -foil -pant leg -hedge sparrow -dresser -automatic pistol -chicory -dialog box -chamberpot -black rhinoceros -fireweed -half-mast -pillow sham -pavilion -scarf joint -microprocessor -filly -dressing gown -shell -Arabian -child -radio antenna -butterweed -morris dancer -sparrow hawk -groom -brioche -floret -rainbow -earthworm -cellist -tine -toupee -balldress -map -angel's trumpet -ruin -fur -pronghorn -speed skating -used-car -stick -early spider orchid -stuffed peppers -snowdrift -flats -least sandpiper -stick -console table -ventilator -portable -kepi -pylon -viceroy -shoreline -Olympian Zeus -pestle -great-niece -life -air compressor -fanjet -scuba diving -fieldfare -tree swallow -personnel carrier -night-blooming cereus -sonogram -assembly hall -circuit breaker -chair -speed skate -soapwort -worsted -raspberry -burlap -flat panel display -Pyracantha -cemetery -turban -deer hunting -bottle green -dandelion green -pieta -aigrette -turntable -cover girl -clutch bag -kiwi -pea jacket -color guard -Malay -shire -crock -french fries -credenza -hockey stick -mourning cloak -potty seat -glass -balsamroot -medal play -red clover -gravy boat -garter belt -Guinness -meadow buttercup -jackass penguin -coursing -tooth -hawfinch -housetop -fluorescent lamp -black-backed gull -bookshelf -earplug -millipede -fawn -baseball bat -soup-strainer -organ loft -bugloss -tomahawk -blackcap -black-necked stilt -hand truck -bedstead -tempura -rose window -crimson -snow thrower -lesser whitethroat -palomino -ball -staff sergeant -wicker -garbage heap -great-nephew -parquet -coupe -nave -eggs Benedict -damask -flush toilet -Angora -pedometer -control room -bristle brush -kookaburra -telephone booth -Windsor chair -red-winged blackbird -cinnamon roll -briefs -cloister -sundress -mammillaria -unicyclist -covered bridge -coelogyne -fairy bluebird -phoebe -beer mug -headstock -parhelion -gorse -common European dogwood -fire-eater -professional football -rock climbing -cyclamen -tin -marjoram -Japanese morning glory -pipe -smasher -hang glider -abutment -birdbath -jotter -litter -artist's model -butterfly bush -dining area -sausage dog -piggery -English sparrow -Turk's-cap -platinum blond -song sparrow -alarm clock -tortoiseshell -chaise longue -flintlock -academic costume -graffito -Arnica montana -adding machine -waterside -director -jonquil -pipefitting -stud -Swedish meatball -musk rose -Venus's flytrap -raven -bougainvillea -little brother -field bindweed -finder -white admiral -tinfoil -serval -sheet -carthorse -people -potto -stockroom -sphinx -slate roof -mountain laurel -majolica -coal black -repository -bufo -pique -binder -tread -attorney general -hydraulic press -videocassette recorder -bumper car -professional baseball -cow parsley -ern -blue peafowl -common hyacinth -jack-in-the-pulpit -ice hockey rink -sport -camper -tailback -flash -stacks -pulp -Christmas cactus -netball -calliandra -curler -large periwinkle -cobweb -forward -Roman arch -cross bun -stoneware -banana bread -cape jasmine -settle -tongue -frock -pepper shaker -pitching coach -CD-R -casing -faience -hand cream -CD-ROM -recliner -striped bass -clary -sketch -risotto -reticle -white clover -touch football -kitty -great-aunt -Japanese maple -sidecar -muscovy duck -hack -rope bridge -organist -stinging nettle -pocket watch -Indian pipe -amorphophallus -bird's-foot violet -caller ID -furnishing -carriageway -dish rack -heiress -nail polish -beldam -Dall sheep -teriyaki -stateroom -laughing gull -chow -bookmark -timer -toga virilis -deviled egg -coltsfoot -Papuan -native -cygnet -automation -portfolio -cabbage palm -cube -broiler -radish -broodmare -castor-oil plant -pith hat -talus -lass -thatch -common marigold -young buck -igloo -prairie rattlesnake -soccer player -spoke -place -slide fastener -tapestry -toy -headboard -cross-country skiing -harness -sconce -rim -ballet skirt -transvestite -saddlebag -common evening primrose -taillight -challah -willet -ready-to-wear -cloud -answering machine -waterfront -vane -granddaughter -Chinese gooseberry -tureen -cab -truffle -viola -bootlace -chemise -taro -petal -candied apple -soccer -miniature golf -front porch -asparagus -Sauvignon blanc -daisy fleabane -ceiling -slip-on -bottle-nosed whale -redbud -black squirrel -snowsuit -ribbing -gravestone -creme brulee -ambassador -local -archery -love-in-a-mist -garbage -thyme -night-blooming cereus -goshawk -cuckoopint -azure -German iris -salad bowl -puppy -cockhorse -giant clam -biplane -stele -necklet -sea otter -crest -door -reformer -comforter -Byelorussian -bottle -hemline -book bag -leotard -owlet -spoon -sari -bidet -Latin -reticulated python -bowling shoe -futon -gaiter -coypu -tea urn -waders -bangle -snowbank -pencil -porter -azalea -English lavender -red spruce -team sport -cruet -high-rise -O ring -vodka -cormorant -Canada thistle -clasp -showjumping -rattan -red fox -sun parlor -Charolais -Tommy gun -bird's foot trefoil -sedge warbler -knot -chives -car tire -steam engine -adapter -spirea -common allamanda -oyster shell -harbor seal -baobab -wick -plumbago -downy woodpecker -coconut -leash -kasbah -hour hand -upholstery -mallard -cricket bat -lady -kitchenware -right-hander -leopard -olive green -common valerian -blue whale -blackboard -redhead -periwinkle -fingerboard -hard hat -locker -breakfast table -capybara -beekeeper -harness -feeder -water hyacinth -hexapod -brown thrasher -percale -lever -patriarch -arete -book -book -senator -bunya bunya -couch -durian -common lady's-slipper -mountain ash -golden barrel cactus -bicycle seat -beret -pop -musk mallow -manatee -cotton candy -boxing glove -backboard -tongue -saguaro -playground -capitol -sanderling -wagtail -deputy -tractor -tap -lady's smock -noseband -worsted -radiotelephone -camisole -forelock -muscat -sweet scabious -crane fly -butterfly weed -chestnut -pinata -inositol -borage -aquatic -belly -broadcaster -gondolier -egg yolk -blush wine -bufflehead -rambutan -oleander -horse-trail -sea holly -yard bird -conference room -lacrosse -belted kingfisher -defile -extremum -whistle -bear cub -grainfield -potage -watermelon -lasagna -sheik -Cooper's hawk -bulb -basketball court -paella -cassette tape -scatter rug -kid -impala lily -Minnesotan -Sudanese -chocolate -tail -quack-quack -whistling swan -shoulder patch -frozen custard -sumo wrestler -smoothie -bock -meat grinder -latch -palisade -radial -sake -kestrel -corn chowder -airframe -electrician -reamer -metropolitan -cotton flannel -cassowary -crossbill -operating room -winter aconite -flute -Tasmanian devil -billboard -suds -kilt -aperitif -cooling tower -avocado -hooded merganser -coleslaw -bee balm -ladder-back -insurance broker -scaffolding -polo mallet -double bed -two-hitter -bluff -gamboge -baby -lawn chair -frond -pistol grip -fancy dress -marquetry -jambalaya -fireweed -Eurasian kingfisher -cue ball -ice plant -horseweed -rose moss -musher -sun -viscount -white-breasted nuthatch -gin and tonic -thermos -Kenyan -first-aid kit -four-wheeler -tourist -stairwell -Gambian -liqueur glass -hovercraft -cocktail dress -twin -coriander -blister pack -Barrow's goldeneye -canteen -irrigation ditch -great white heron -tree sparrow -canal boat -lens -food processor -common raccoon -Baltimore oriole -black-eyed Susan -bush hibiscus -corolla -sire -mustachio -professional wrestling -elk -clustered bellflower -pannier -musk ox -crapaud -animal trainer -rosebud -ring-necked pheasant -little egret -cappuccino -rocker -bristlecone pine -cheerleader -hedge violet -semaphore -central processing unit -speedskater -delivery truck -assembly -hedgehog cactus -bergenia -bull thistle -bladder campion -cinquefoil -inula -cellulose tape -main rotor -bootee -autogiro -ice -grey -meadow cranesbill -hummus -valise -chassis -mountain goat -blacktail prairie dog -Chardonnay -romper -street -shoveler -wood ibis -topiary -chalice -silo -circus acrobat -Rollerblade -cosmos -woof -heroine -cold cream -marabou -herb robert -garden lettuce -nymph -floor lamp -automobile engine -heel -radiator -seeded player -fedora -father-in-law -peahen -Bahamian -wiper -wood pigeon -barn owl -pegboard -chorus frog -kin -roller skate -stob -rosemary -cowbird -hortensia -cranberry sauce -shot glass -Dixie cup -gnu -fire alarm -diet -booster -oxeye daisy -twayblade -high-definition television -truss bridge -bunk bed -mule -blackbuck -facsimile -frog orchid -point-and-shoot camera -brocade -gazebo -prairie gentian -concert -paintball -Cognac -maid -afghan -barbecued spareribs -pintail -tramway -commissioner -finger-painting -beef stew -caftan -Aberdeen Angus -demonstrator -sea trout -pigtail -thrush nightingale -barbados cherry -sashimi -ridgeling -lamppost -gabardine -red-shouldered hawk -bath salts -cavern -cymbid -Haitian -boater -southern buckthorn -arctic -motorcycle cop -red gum -Clydesdale -Zamboni -beagling -villa -demitasse -Sheetrock -lollipop -hybrid petunia -post horse -carabiner -brussels sprouts -Durham -stylist -pothole -sleigh bed -scallop shell -harrier eagle -papaya -Japanese persimmon -sachet -wild rice -chipboard -gun enclosure -menorah -chinook -headset -white campion -ocean -Secretary of State -G-string -bone china -basil -greenish blue -camcorder -concrete -screech owl -trumpet honeysuckle -flugelhorn -layette -cattle egret -case knife -mandarin duck -robber fly -salwar -dressing table -doughnut -facade -runner -honeypot -surf casting -diver -angel's trumpet -spin dryer -chameleon -wand -snow -vitamin A1 -manageress -volleyball net -antiperspirant -street clothes -tree sparrow -cords -sundew -bricks and mortar -caryatid -bridesmaid -trestle bridge -eyepiece -celebrant -scarlet pimpernel -gas range -onion -green salad -squill -creepy-crawly -hunk -little owl -salad nicoise -earflap -bird feeder -spray gun -bunny -Cheops -amazon -blue tit -Nissen hut -Kalashnikov -skylark -kremlin -shoebill -shopping bag -frigate bird -telephoto lens -peplum -moss pink -echidna -wastepaper basket -wood ibis -workroom -ankle brace -telpherage -Michaelmas daisy -figure skate -swami -nylons -cardoon -cocotte -headstall -twin bed -parsley -dirndl -corn poppy -nut bread -cloche -light heavyweight -mayor -lip-gloss -punch bowl -pottage -mango -fledgling -mousse -four-wheel drive -barrel -banana boat -trouser -bathroom -Sauterne -ring -settee -lavaliere -safe-deposit -godson -leatherette -schoolmate -radish -hedge trimmer -dahlia -euphonium -palace -vaulter -singlet -slicer -Pilsner -cockateel -kangaroo paw -Cub Scout -master bedroom -hexagon -cenotaph -Barberton daisy -Netherlander -intersection -Korean -gravel -chandelier -hospital bed -flash memory -pier -whole wheat flour -maroon -pale ale -special -snow bunting -crinoline -dustpan -barrette -common wood sorrel -yolk -pothos -speakerphone -tendril -cabinetwork -farm horse -brake disk -streetlight -superhighway -bandsaw -panting -pressure cooker -girdle -old man -cereal bowl -felt -hurling -architecture -harmonium -chain -blueberry -cellar -smocking -scrub brush -tablespoon -sweet corn -graining -library -street -bill -felt-tip pen -monkshood -crowd -log cabin -newel post -hack -elephant seal -golden pothos -popcorn -outhouse -patch pocket -fish and chips -tape -wax plant -eaves -fried egg -emerald -tea cart -fan blade -daily -Bowie knife -rowing boat -leaf shape -man -crayon -trumpetfish -chipping sparrow -whiskey bottle -pillion -city hall -golden pheasant -cheerleader -creeping bugle -couch -Dumpster -Homo sapiens sapiens -cranberry juice -cockpit -demagogue -joinery -scrambled eggs -technician -sidewalk -sheep -keyhole -power line -polyanthus -roulette -first lieutenant -checkout -tabletop -nasturtium -schnapps -engineering -skateboard -ground fir -bouquet -bunk -resort area -fleur-de-lis -power steering -opera -Bolivian -Friesian -buckskins -bay -slider -frozen yogurt -cabin cruiser -saunterer -lean-to -fishing eagle -bog star -cantaloupe -mouth -music stand -fiddlestick -brilliantine -pinball machine -bairn -barred owl -bath oil -signorina -Mason jar -nymph -rubber band -garden nasturtium -razorbill -Japanese beetle -batting cage -trestle -borage -Secretary of the Interior -scanner -baguet -baseball cap -chow mein -pen -jewelweed -barbet -chasm -pectoral sandpiper -holster -glasses case -sand -crevice -Kickapoo -snowboard -locket -satchel -tankard -alpinist -moorhen -cow pen -whooper -crown -chain -silversword -wild geranium -hi-fi -Tibetan -waterwheel -bee orchid -ruby-crowned kinglet -common broom -tabloid -javelin -sauna -klammath weed -zebra finch -spider orchid -velour -chiffon -lecture room -barrel -loggia -millstone -flatlet -soupspoon -econometrician -golf-club head -daphnia -parlor -fire-eater -juggler -attache case -hay bale -kisser -knitting needle -news magazine -flatbed -Senegalese -trumpeter -trampoline -brogan -bone -caftan -lobster pot -gazpacho -anthill -ramekin -mainsail -penitentiary -spotted flycatcher -cookstove -root beer -broom beard grass -pogo stick -plywood -epee -gas oven -Global Positioning System -sweet false chamomile -breakfast area -bullring -second cousin -wave -decolletage -rodeo -won ton -swastika -bobby pin -papaw -retaining wall -Muscadet -heavyweight -energizer -banner -amusement park -whinchat -drugstore -waxwork -meander -congee -heat sink -switch grass -commuter -peony -western white pine -wild raspberry -nightgown -saute -cardinal -claret -pollinator -biryani -pina colada -cassette deck -European sandpiper -block -flan -birdcage -baby -lieutenant colonel -ticking -European white lily -dog violet -coat hanger -premature baby -organza -string bean -balloonist -hurricane deck -window box -hang glider -bullfighting -piste -seahorse -hard cider -batik -common mullein -petite marmite -stuffed mushroom -tequila -ground ivy -fountain grass -stray -putter -buffer -comet -bomber -woodcarving -baseball glove -halter -garnish -selvage -megaphone -sea fan -rabbit hutch -very important person -analog watch -long-head coneflower -northern pike -roll-on -cigarette butt -terraced house -penknife -windshield wiper -cricket -straightener -snow pea -cockerel -canister -sour bread -recovery room -toilet bowl -tyrannosaur -big sister -quartz battery -television receiver -vitamin C -tailpipe -field thistle -stonechat -col -monstrance -gift wrapping -herbivore -quarter horse -ice-cream sundae -rumpus room -eyepatch -clary sage -French lavender -snorkel -choir -tent-fly -cat box -horse racing -high priest -barrel cactus -pin oak -wild thyme -keyboardist -raiser -hammock -hail -bungee -chocolate mousse -major -buzzard -gopher tortoise -Chablis -water meter -benthos -donna -blender -Mauser -avocet -rye -mulch -chancel -dusty miller -mate -corbel -minaret -frittata -French toast -mosaic -home brew -water faucet -beard -swivel chair -acropolis -largemouth -abbey -tabby -driver -copperhead -stirrup -Boston fern -Tennessee walker -artichoke -honor guard -chapatti -enchantress -sweat pants -electric organ -column -dry vermouth -range hood -Red Delicious -rape -splint -catapult -gourd -antipasto -plaza -carnation -star -wood anemone -English primrose -male fern -boot -atrium -Japanese deer -carnivore -yearling -doe -guelder rose -chicory -stretch pants -ice-cream cake -frogfish -tarpaulin -chicken soup -balaclava -tor -feverfew -three-hitter -flyweight -aqua vitae -locker room -wether -teacup -wide-angle lens -hook -ladder-back -osprey -awning -wedding -chest protector -pooch -rose mallow -orange daisy -fondant -envelope -duckling -blackberry -goosander -snorkeling -philatelist -broad bean -Frank -bok choy -basket -absinth -cayenne -blackbird -bottled water -trooper -timber -stable -chestnut -tomatillo -bell -banquet -rainbow trout -macrame -appointee -heart -chipmunk -purple clematis -safety bicycle -shuttle bus -Japanese black pine -lentil soup -downhill -field mustard -brass -hand-me-down -greater yellowlegs -fanny pack -croquet mallet -hip roof -duffel bag -Ritz -document -pie plant -staff member -lifeguard -white-throated sparrow -Cameroonian -hydrofoil -platter -common ageratum -middleweight -chairlift -brunch -pharmacist -lemon -driveshaft -green snake -lip -London plane -mangrove -crystal -siskin -common jasmine -hollandaise -villa -cross-country riding -mother-in-law's tongue -generator -Tanzanian -whisk -seeder -ashtray -griddle -evening bag -bluebird -bran muffin -square dancer -luggage compartment -tropical pitcher plant -autofocus -tape drive -silencer -Hawaiian guitar -swamp sparrow -Zimbabwean -drawing room -weekender -liparis -streambed -samosa -hitter -water heater -tidal basin -ossuary -dik-dik -camouflage -fiance -Jordanian -rolling pin -slingback -turret -hen -jennet -playpen -woodhewer -bushing -church bell -bear grass -double knit -tennis pro -Joe-Pye weed -pave -pochard -painted beauty -crinoline -gumbo -trestle table -schnitzel -balloon flower -Turkish coffee -extension cord -wireless local area network -sluice -umbel -microeconomist -sky -aisle -commander in chief -hydroplane racing -poll -Coca Cola -fuel injection -bird pepper -monkey puzzle -English muffin -riverbed -varietal -kachina -airport -saltwort -oolong -red-hot poker -mihrab -cocoa -jersey -Walkman -syndic -Hessian boot -millstone -carpenter -outfall -curbstone -mocha -field pansy -patriarch -slacks -switchblade -killdeer -whelk -pampas grass -racquetball -platform bed -Indian rhinoceros -Japanese iris -blacktop -dinner jacket -stud -jodhpurs -telephone pole -business district -kurta -basil -handset -file folder -gloriosa -orphan -cantle -cookie sheet -cafe au lait -drawbridge -hill myna -Western diamondback -watch case -cardcase -bowling alley -mattress cover -canvasback -pompadour -cornice -matador -cigar cutter -skunk cabbage -baptismal font -bitters -refectory -egg -parula warbler -tiger lily -field house -nanny -skin-diver -soda water -lymphocyte -carport -chocolate fudge -amphitheater -sugar candy -sea hare -open-face sandwich -dessert spoon -staple gun -envelope -worker bee -general -garment bag -maypop -autobahn -Atlantic puffin -polo shirt -Humvee -spice rack -grotto -banderillero -gaillardia -black-crowned night heron -oboist -weigela -Dictaphone -dwarf iris -marsh mallow -yarrow -eccentric -catsup -jade green -mistress -henbit -beachwear -head -commuter -strawberry tree -chickpea -clothespin -fleabane -brussels sprout -winter melon -Laconian -great horned owl -caricaturist -nan -flowerbed -triple sec -dairy -round of golf -cardinal -kauri -Zulu -Armagnac -cowberry -mouthpiece -wild calla -bling -puppeteer -beer drinker -adder -field sparrow -chocolate pudding -blacksmith -finback -Shetland pony -cheese fondue -panty girdle -soda can -electrolytic -florist's chrysanthemum -yellow jasmine -tudung -equalizer -ridge -dulcimer -grappa -barn swallow -coneflower -enamel -poached egg -halfback -yak -toby -Fleet Street -blue catfish -sand tiger -flying buttress -snaffle -stoop -first base -cultivated land -first lady -waratah -headquarters -arnica -lovebird -common morel -parasol -disk clutch -Xerox -vitamin P -vitamin B12 -long sleeve -certified public accountant -hot pants -pitch pine -pantie -drawers -cake mix -boar -grey -bride -false sago -bullion -coach house -bass guitar -Japanese banana -meadow clary -black belt -Canterbury bell -smallmouth -treadmill -great white heron -enchilada -rummer -captain -camisole -wild garlic -oak fern -ultramarine -peach -hawkweed -autostrada -adit -anaconda -artwork -skinhead -jello -hermit thrush -Bewick's swan -dress suit -trail bike -stubble -common polypody -Riesling -Easter lily -telegraph key -envelope -garlic bread -perianth -salad bar -steppe -club sandwich -nude -garden forget-me-not -Tuareg -flood -Statehouse -charcoal -boy scout -Rhone wine -parfait -spoor -lanyard -octagon -brown bread -quarterback -quilted bedspread -hookah -Pepsi -hamburger bun -entrepreneur -saddle oxford -snake's head fritillary -undies -chemise -skidder -chickpea -carnation -honey bun -mortar -Montrachet -automobile horn -skylight -gingham -rafter -pantile -climbing frame -scarlet runner -cable -cornstalk -mockingbird -raisin bread -chili sauce -hand calculator -concert-goer -detached house -coq au vin -lasso -hyssop -globe thistle -paper clip -slide -Jerusalem artichoke -tetrahedron -mock orange -lemon lily -finger -little sister -handcuff -horse wrangler -pavlova -oilcloth -snow-in-summer -common mugwort -greenshank -ice-cream cone -rubber boot -gunnysack -disk jockey -long trousers -sorghum -pontoon -calf -fire extinguisher -cotton thistle -pilot whale -ao dai -steamroller -wristwatch -tawny owl -city -country store -ironweed -kennel -bathrobe -rattan -drawer -fly tent -choline -musk thistle -courthouse -Yugoslav -bush -trawler -shellflower -jade vine -ragged orchid -pea soup -King Charles spaniel -hubcap -snook -paddy -bow and arrow -shovel -dill -cliff swallow -cadaver -hijab -masterpiece -fish geranium -kettle -sanitary napkin -carrot stick -Mountie -peanut brittle -dam -jackal -windowsill -butterfly orchid -bodice -picador -pale yellow -beanie -petiole -tenor saxophonist -bungalow -gnomon -stock saddle -field glass -rigging -wood grain -Speaker -settlement house -swamp milkweed -paper nautilus -tangerine -champagne -crescent roll -library -Schmidt telescope -stemless carline thistle -motorcyclist -alpine ash -planchet -water closet -casuist -hand luggage -hyssop -spaghetti and meatballs -cannelloni -cedar waxwing -water dog -brick red -linkage -sweep hand -purple heather -macaroni and cheese -butter knife -refreshment -malt -St. Augustine grass -wainscot -compass -gas heater -tamale -table saw -referee -borsch -projector -dracaena -peppermint -Reuben -Abyssinian banana -glassblower -floss -small stores -artilleryman -lapwing -ranch -garbage man -dwarf banana -commelina -currant -adulteress -landlocked salmon -pasqueflower -nan -tiger lily -Eritrean -rotunda -catsup bottle -mezzanine -royal fern -blended whiskey -bowler hat -mistletoe -manor -fusee drive -pistachio -dispensary -swamp -amputee -sculptor -schoolmaster -Chinese anise -dwarf iris -livestock -chronograph -nectarine -jockey -plaster -motel room -swamp azalea -hippeastrum -space station -duchess -catacomb -dovetail -cockscomb -common spotted orchid -brittlebush -cleats -cloche -hotchpotch -cabin car -prey -indigo -light beer -bear's breech -jonquil -analyzer -alyssum -spur gear -ice tea -honey buzzard -twayblade -dirndl -atlas moth -croquette -carafe -flyweight -professional basketball -multivitamin -air terminal -phial -roll-on -skunk cabbage -bird of paradise -rose -cooter -camping -divided highway -herbage -sweet vermouth -common comfrey -eggplant -office building -glutton -gefilte fish -bicycle rack -swamp birch -Venetian blind -Pernod -Norway spruce -portrait camera -bastion -vitamin Bc -Ugandan -Indian red -okapi -emu -vin ordinaire -chintz -shrimp cocktail -numbat -tall oat grass -cable car -stopcock -ham sandwich -Yemeni -stanhopea -plate -chicken broth -common yellowthroat -California poppy -radio -chocolate egg -mess jacket -tea table -physostegia -Japanese flowering cherry -confectionery -chicken cacciatore -painted nettle -popover -white rice -strapless -mohair -electrical cable -coil spring -arterial road -miniature fan palm -spectator pump -pesto -interlocutor -eastern kingbird -dongle -vitamin B6 -stuffed tomato -cough drop -okra -black -barbecue -burial mound -firstborn -corn snake -amberjack -bollard -horn -Black African -elbow pad -Camembert -circle -Japanese apricot -hearing aid -rock star -creature -taster -bubble gum -scull -lemon balm -chaetodon -anemometer -brake drum -fuselage -courthouse -aqualung -yellow adder's tongue -reception desk -guy -buffalo wing -ginger beer -robin -pantothenic acid -marsh hawk -yellow journalism -exhaust -cardamom -Tabasco -ax handle -patriarch -floor -pine snake -spoiler -hood -sphagnum -parrotfish -orphanage -redpoll -beef Wellington -white spruce -cherry plum -scapular -field lens -broomstick -mouser -wood thrush -Nebraskan -hotelier -milk thistle -soya milk -Munich beer -boucle -snowy egret -dust storm -steward -kudzu -oriental poppy -presbytery -burro -orange soda -stonecrop -splashboard -menagerie -dormer -wire cutter -yellow bells -Dubliner -shore pine -cousin -racing gig -Morgan -gold plate -villager -snifter -granny's bonnets -egg roll -Spode -amabilis fir -babbler -pestle -heliopsis -halter -black spruce -President of the United States -ski slope -chocolate fondue -lockstitch -motel -Epipactis helleborine -tabbouleh -Yorkshire pudding -overpass -Timorese -presbyter -tablefork -bottle gourd -tiara -vintage -pilgrim -reindeer moss -shower stall -towel rack -kachina -chef's salad -breeder -cow parsnip -walker -Black woman -Irish coffee -portrait lens -lateen -gilt -successor -cargo container -Lithuanian -mayapple -paisley -highchair -strawberry jam -flying fox -field scabious -blue-eyed grass -screw -Frisbee -dressing room -cholla -walkie-talkie -red currant -centrifugal pump -smorgasbord -hot rod -marcher -rowanberry -welwitschia -amphitheater -pew -concert band -bosom -pillbox -seagrass -openwork -meadow goldenrod -shower -chicken sandwich -Boston ivy -plastron -oilfield -stuffed tomato -juniper berries -frame -Spanish mackerel -family room -powder horn -fight -maguey -bunker -work-shirt -air filter -nosh -sugar bowl -foothill -reliquary -tugboat -horsebox -grater -palace -board member -campsite -halibut -geneva -ginger ale -high commissioner -genet -bodywork -spaghetti -protractor -pipe cutter -wood anemone -turkey cock -surge suppressor -green turtle -spoiler -bedsitting room -television room -ballot box -shasta daisy -impeller -capote -bitter -California wine -lock -spinnaker -gill fungus -baby's breath -nut and bolt -moonflower -houseboat -distributor cap -coffee bean -gusset -bowling ball -knitwear -frieze -mistflower -roadster -cue -circuitry -brake -butt hinge -Chickasaw -leopard frog -wing tip -puree -mantel -pantheon -grandfather clock -cockchafer -pomegranate -cleaners -eyeshadow -Oregon cedar -rock hopper -hawksbill turtle -agriculturist -yellow-crowned night heron -Albanian -pumpkin seed -chateau -goggles -camper trailer -bracket fungus -cigarette case -signal box -saddle blanket -poison ivy -set gun -cattleya -dry fly -concert hall -personal digital assistant -talcum -deodorant -common starling -painted turtle -kea -plenipotentiary -pantyhose -masjid -buskin -hurdle -cocktail lounge -belting -sour dock -knife blade -sugar snap pea -paddle -dickeybird -brace -keep -call center -yacht -lead pencil -tumbler -production line -tetra -private -French window -express -ski boot -pinto -broad bean -American crow -screech owl -snapper -power cord -Manx -rambutan -sun deck -stonefish -golden eagle -national monument -readout -cork oak -hacksaw -beer can -bathe -tussock bellflower -wet suit -mihrab -big game -highlighter -sprocket -measuring worm -grapefruit -samovar -distributor point -steak knife -incubator -loon -temporary hookup -hippodrome -hot spring -spacesuit -flea market -clay pigeon -catbird -earmuff -tetherball -yellowfin -cellophane -lanolin -clapperboard -velveteen -police dog -cashew -sequencer -mango -duplex house -bazaar -Golden Delicious -red carpet -collet -kickstand -broadloom -diskette -tank engine -compact -diesel-electric locomotive -whale shark -water moccasin -mountain avens -tropic bird -ginkgo -ski cap -fixative -glockenspiel -chopine -ethernet -herring gull -skeleton key -finger paint -conference table -great crested grebe -harbor -white-crowned sparrow -Bullock's oriole -guestroom -boutique -cable television -roulette wheel -Luger -Latin American -trumpeter -blindfold -baby -freshwater bass -home plate -bonefish -giant sunflower -giant tortoise -planking -pigeon hawk -oceanfront -door -bazaar -common wasp -conformation -kick starter -kid glove -corydalis -shuttlecock -writing desk -ivory gull -shirttail -diving suit -weka -downy birch -altar -wild sage -tufted puffin -cabinet -Orpington -cineraria -bottom -dial -coracle -resort hotel -soap dish -spotted owl -billiard room -ghetto blaster -red-breasted nuthatch -hatchling -chalet -bracteole -crusher -mixer -net melon -farmhouse -Dutch oven -transept -penlight -palmyra -stewing pan -solar cell -crochet needle -black-winged stilt -germander speedwell -crinkleroot -truncheon -bunchberry -hatchback -sounding board -mixing faucet -chess master -bisque -Brie -Sitka spruce -pawn -Mexican-American -space rocket -choreographer -collared peccary -duffel -nacho -patchcord -carpet snake -omnivore -watering can -hall of residence -streamer fly -sunroof -great grandson -oil refinery -billiard player -ivy geranium -key palm -pinwheel -yellow-shafted flicker -purple onion -soldering iron -condominium -fishing gear -heat pump -marine iguana -cuckoo clock -Bletilla striata -headrest -spotted salamander -field hockey ball -pound -carboy -vertical stabilizer -groundsheet -cinnamon bread -acorn squash -sheathing -lakefront -Jeffrey pine -synthesizer -olive -apple -pannier -ponderosa -Jew's-ear -latch -equatorial -metasequoia -permit -bloomers -town hall -fava bean -casino -bier -jampot -common snapping turtle -clary sage -oatmeal -Dutchman's breeches -massif -Guyanese -heifer -handball -sweat suit -pomelo -Iceland moss -customhouse -sandbag -archer -gyrfalcon -sword cane -marmite -whole snipe -blue crab -sugar spoon -brownstone -chicken wire -lizardfish -dump truck -chicken yard -chamois -electric -idle pulley -jujube -wrestling mat -aoudad -Burmese cat -water shamrock -dormitory -Unknown Soldier -hearse -bumper -clipper -desert pea -critter -semitrailer -backboard -common St John's wort -Atlantic manta -song thrush -jukebox -quoin -eastern chipmunk -copper beech -paintball gun -bull -package store -fraise -royal poinciana -niqab -traction engine -objective -day nursery -ski lodge -orphan -summer house -cereal box -router -sleuth -jodhpur -polyp -croquet -sport kite -green onion -tulle -etagere -tussock caterpillar -rest house -elderberry -bridal wreath -Torrey pine -silver wattle -kidney bean -pentode -laelia -Allen wrench -sporran -red drum -tricot -heterodyne receiver -magazine rack -stone curlew -trawler -suckling -niblick -sandwich plate -double door -Togolese -pitching wedge -desert tortoise -cloth cap -date palm -webbing -jumper -frogmouth -copperhead -covered couch -black mallee -riser -scraper -gauntlet -pantheon -food court -muntjac -grocery bag -bread-bin -transmission shaft -primigravida -window seat -crab apple -seat -Fresnel lens -dendrobium -hatchback -little theater -butter dish -back porch -umbrella tree -carrot -seventy-eight -coconut -music stool -Tesla coil -bay willow -American basswood -sabot -wheel and axle -gazette -lute -bassinet -hart -mecca -breadbasket -silverfish -handball -Scotch pine -box camera -stately home -Hereford -tread -single-breasted jacket -desk phone -deodar -professional boxing -fly casting -box wrench -black oak -martello tower -red campion -bullock -sweet William -bay leaf -dollhouse -flounder -fox hunting -beanbag -king mackerel -rouge -film advance -common mallow -parasitic jaeger -satellite receiver -nurse shark -chesterfield -tomatillo -plimsoll -hatbox -bloomer -foul-weather gear -longleaf pine -horse mackerel -tree lizard -bark -belfry -Treasury -perch -purple finch -stag beetle -fragrant orchid -tachymeter -tadpole -cookie jar -knee piece -agueweed -bones -chick -golf glove -toothpick -taboret -rotor blade -field artillery -purple willow -redhead -spark plug -guava -voice mail -cross -butterfly valve -star magnolia -olive -room light -Australian turtledove -embassy -Iraqi -singles -nestling -spinning rod -radial engine -rowan -sandbox -boss -moccasin flower -veneer -mint -American chestnut -white whale -CPU board -florist -press box -hurricane lamp -giant kangaroo -greater whitethroat -winter jasmine -blue -department store -southern red oak -saber saw -corn muffin -bellbottom trousers -toaster oven -red eft -condominium -galago -sunbather -redpoll -common European earwig -songbird -linnet -light meter -bracer -tepee -gumbo -water glass -roofing -spathiphyllum -shofar -sand lizard -washroom -Brussels carpet -brachyuran -home room -floatplane -knee brace -solar heater -felucca -gas ring -maguey -manse -blue columbine -cuppa -cigar band -male orchis -mudskipper -couscous -Chinese parasol tree -dude ranch -banyan -gopher snake -sundrops -aviary -African daisy -missel thrush -Photostat -stone pine -circus tent -tangle -printer cable -grease-gun -rose chafer -light pen -plantain -hearth -bullfinch -post oak -slow loris -Newtonian telescope -head -punt -spindle -New England aster -spotted sandpiper -pond pine -grass skirt -bug -black rat snake -tabasco -bull shark -tennis camp -scrambler -popinjay -bing cherry -ministry -cash register -redheaded woodpecker -kameez -farmer's market -roan -harpy -European toad -pizzeria -camshaft -hemp nettle -chicken coop -cottage pink -daybed -observatory -airdock -mountain devil -newsstand -kingfish -snow gum -jackdaw -lacquerware -peeler -miro -sister ship -damask rose -pack -snowshoe -Liberian -paramecium -tidytips -professional tennis -bookend -wood swallow -cayuse -cranberry -rock squirrel -steak au poivre -soul patch -female mammal -sash fastener -songwriter -oxeye daisy -apse -floor joist -hand towel -wheatear -cero -soul mate -golden fig -bus stop -psycholinguist -convenience store -manor hall -mountain sandwort -Euopean hoopoe -haricot vert -mausoleum -violist -flashlight battery -chard -fixer-upper -bank martin -testudo -diving duck -kohlrabi -Omani -sphygmomanometer -greyhound racing -chestnut -rattlesnake plantain -chaffinch -wolf pup -teakettle -cairn -souk -resident commissioner -chuckwalla -gaiter -capercaillie -liver chestnut -bean sprout -land line -ambassador -green pepper -common chickweed -Sharpie -Oriental arborvitae -oncidium -pallone -currawong -sweet alyssum -fire tower -eyebrow pencil -redfish -apricot -clementine -blucher -wigwam -pangolin -buggy -common oak -jumbojet -laser -cigarette holder -racquetball -georgette -cleft -scouring pad -drum printer -pond scum -American red squirrel -caranday -swamp willow -blindworm -brook trout -defense system -nyala -three-way calling -mizzen -shuttle -African lily -Oregon white oak -rain tree -fuel gauge -oriental cherry -wahoo -pear -jungle gym -bass fiddle -outrigger -angelfish -Old World coot -lime -battlement -yarmulke -herpes varicella zoster -burp gun -Alpine glacier -stun gun -pilot boat -Southern crab apple -bushtit -pullet -polo pony -jackfruit -raw vegetable -French marigold -golden shower tree -spike lavender -wahoo -brass knucks -cabbage palm -diesel-hydraulic locomotive -red jungle fowl -prairie sunflower -rye -loofa -icecap -shade tree -secretary bird -saffron -cos -muskrat -videodisk -Carolina wren -candy bar -Bohemian waxwing -flowering almond -cold frame -raglan -pine siskin -quince -western red cedar -red maple -adobe -agora -kumquat -tenement -bantam -bayberry -water jump -great granddaughter -snips -porcupinefish -brochette -love-in-a-mist -Iceland poppy -common sage -pace car -camel racing -slipcover -nopal -shoehorn -calypso -rhea -in-basket -maple syrup -cold chisel -Pacific ridley -dietary -aperture -lapin -rock hyrax -house wren -litchi -ragged robin -control center -shoebox -arabesque -eider -silver birch -bantamweight -ax head -softball -blue gum -Bechtel crab -tomato sauce -green douglas fir -sweet gum -macaroni salad -red phalarope -budgerigar -Bedford cord -Uzi -green woodpecker -ohmmeter -bacon-lettuce-tomato sandwich -hackney -Easter egg -motmot -red pine -opium poppy -gat -pussy willow -greater scaup -ocelot -persimmon -western hemlock -carambola -pinion -Malcolm stock -bobsled -larkspur -wood drake -pinetum -red gum -draft beer -funnel -terrarium -Pinot blanc -doodlebug -brittle star -salsa -cantaloup -pollack -stockpot -eastern hemlock -rock wren -burqa -squash -aircraft engine -billy -flamingo flower -odontoglossum -old squaw -redstart -sheepskin coat -mate -flathead catfish -gentianella -bilberry -bog rein orchid -incense cedar -mew -Colorado spruce -cob -portmanteau -grenadine -common ginger -masdevallia -compound microscope -sobralia -white fungus -guppy -chapterhouse -honey -green frog -sea swallow -African marigold -astrolabe -verdigris -yellowhammer -carrot juice -oxlip -medicine ball -highboy -grass frog -gamebag -surgery -mincer -mulloway -cactus wren -box office -resonator -table-mountain pine -European curlew -supernova -cabbageworm -peach -plane seat -asp -Yquem -tomato hornworm -rook -quadruped -chador -micrometer -dabchick -Afro-wig -balsam fir -bucket seat -sage green -macon -blue poppy -chinquapin oak -black pine -spinach -chrysalis -carnauba -tee -bearberry -shirt button -tree of heaven -southern white cedar -covered wagon -brood hen -spadix -European catfish -winter wren -bulldog clip -carpetbag -study hall -chino -simian -closeup lens -cookie cutter -grapefruit -mandola -sassaby -Allegheny plum -piaffe -scorpion fly -booby -draft animal -field tent -cumin -laurel oak -smooth-leaved elm -American arborvitae -American toad -grinding wheel -mountain ash -cuttlefish -pipistrelle -parer -safety rail -Clark's nutcracker -side-blotched lizard -giant hornet -wicket -dugout -electric toothbrush -dhow -common four-o'clock -long-eared owl -anchor -near beer -tansy -creme caramel -guided missile frigate -shelduck -durian -compact -iron tree -shiitake -polo -camouflage -pedal pusher -salon -tangerine -lacebark -Swiss mountain pine -goalpost -poolroom -space capsule -wild cherry -dress hat -wave -raglan sleeve -cassia -Jerusalem artichoke -cabbage palmetto -marsh harrier -American redstart -sea squirt -cliff diving -sparrow hawk -watch cap -frankfurter bun -police boat -flash camera -neem -eastern meadowlark -Italian cypress -orb-weaving spider -graniteware -sewing basket -latex paint -rock dove -stator -leaf lettuce -roulette -broadcloth -Spork -panicle -sternwheeler -cider vinegar -brown creeper -cowfish -closed gentian -chickpea -port -pimento -sheeting -matilija poppy -hawk owl -guava -papaya -huisache -European shrike -racing skiff -yellow warbler -gumbo-limbo -North Carolinian -staysail -court -iced coffee -money belt -shaver -Psychopsis papilio -sumo ring -refection -kingfish -clock pendulum -greater butterfly orchid -disk harrow -tawny eagle -polyphemus moth -pieplant -Nicaraguan -bocce ball -California box elder -porbeagle -crown of thorns -Mexican sunflower -fennel -stream orchid -slip ring -white fir -fold -moss campion -fairy ring -hose -pony-trekking -western larch -meadow pipit -Cape May warbler -longan -bookmobile -junk shop -lemon shark -smelling bottle -solan -widow -sea pen -universal joint -day game -goldcrest -maiden pink -biographer -rotunda -oriel -arranger -gambrel -Angora -fen orchid -leading rein -Wilson's snipe -European nuthatch -natterjack -athletic supporter -mouflon -emergency room -swallow-tailed coat -western meadowlark -feather star -Navy SEAL -toilet bag -loquat -lesser butterfly orchid -thumbhole -breathalyzer -featherweight -collards -mayfly -confessional -mountain ebony -redwing -Norway maple -refractometer -stagecoach -gasoline gauge -octopus -baker -Rhode Island red -European tortoise -cardiologist -Punjabi -Arkansas kingbird -tamarind -drum brake -flash -yellowtail -stokes' aster -emperor -free house -sour gum -ruddy duck -hamadryad -command module -tinamou -Norway lobster -washstand -European hornbeam -roaster -black-necked grebe -tallgrass -leopard lizard -anastigmat -Blackburn -deutzia -ground rattler -Christmas fern -wild pink -sesame seed -carrycot -Italian parsley -nectar -roll-on roll-off -true laurel -anisette -candy corn -flowering maple -revers -dun -tobacco hornworm -common sunflower -common grape hyacinth -cardiograph -electric meter -herb Paris -goalmouth -spruce grouse -canopy -wind poppy -stemma -gateleg table -lumper -speckled rattlesnake -gudgeon -rough-legged hawk -internal drive -pomelo -piece de resistance -storm door -clementine -Japanese pink -settler -yellow jacket -Fraser fir -royal palm -cicada killer -cayenne -guava -bluewing -red baneberry -lesser yellowlegs -cache -bog rose -sparring partner -ski jumping -sherry -glacier lily -beer mat -shredder -American widgeon -protectionist -green olive -black-tailed deer -Alpine fir -dispatch case -whipping cream -African daisy -cantilever bridge -maraschino -rhea -ink bottle -dacha -hagberry tree -lesser rorqual -orchard oriole -candidate -cuticle -breadfruit -fishbowl -giant puffball -closed gentian -Joshua tree -tie rod -beard lichen -flame tree -stegosaur -acerola -Swan River daisy -common murre -flowering almond -protegee -loggerhead shrike -Wilson's warbler -Japanese honeysuckle -basilisk -skimmer -hybrid tuberous begonia -pumpkin ash -chafing dish -collared lizard -iced-tea spoon -scrubbird -Iceland poppy -grey kingbird -wallflower -slick -diesel -Swiss pine -ethernet cable -ketch -lightship -black cherry -swordtail -Monterey cypress -lightweight -Floridian -Sabine -stall -contact -viola da gamba -hemstitch -upland sandpiper -box spring -sassafras -radome -lesser scaup -bluefin -yellow-bellied sapsucker -armored car -cabin class -Moorish arch -webcam -aquavit -overall -sergeant major -soft shield fern -gin and it -bobolink -subcompact -falconer -black morel -roadrunner -lab bench -thong -coffee urn -weeping beech -caladenia -southern live oak -scanner -wine vinegar -common speedwell -European roller -fuji -snag -piping plover -concertina -secateurs -meat thermometer -supercomputer -funnel -dais -western fence lizard -spruce pine -pommel horse -Cassegrainian telescope -pitta -India-rubber tree -mangosteen -tamp -aposematic coloration -dustcloth -birth -Atlas cedar -reed bunting -jabiru -sainfoin -press photographer -golden oriole -laryngoscope -thermal printer -winder -doubles -cricket ball -dabbling duck -tonic -Buddhist -Morris chair -swatter -quaking aspen -ancient pine -American larch -evaporative cooler -click beetle -yellow-breasted chat -souchong -bluegill -pied-billed grebe -tricorn -spring beauty -southern magnolia -rowel -chili -hard roll -flathead -satsuma -gangplank -bourguignon -cockfighting -greenwing -plum tomato -fly orchid -gnatcatcher -spotted eagle ray -ovenbird -brassavola -mocha -candy cane -afterburner -thriftshop -study -winter crookneck -grinder -muskellunge -sacred ibis -inverter -sandwort -deer fern -stair-carpet -Cotes de Provence -ovenbird -rex begonia -American woodcock -poison ash -lowland fir -pawpaw -loblolly pine -kinkajou -European hackberry -pest -coralwood -Bedouin -acetate rayon -snuffbox -radiator cap -basket oak -table-tennis racquet -smew -midge -telescopic sight -radish -great burdock -separate -damask violet -broadbill -bourbon -blacktip shark -gift shop -khimar -date -woodland caribou -policeman bird -grey birch -American elm -strawflower -officiant -hart's-tongue -straight razor -Spanish elm -radicchio -white croaker -vicuna -soft-shell clam -flannel -adonis -bonito -kittiwake -English walnut -soldierfish -hipflask -spotted crake -Streptopelia turtur -American maidenhair fern -corn cockle -telephone cord -canopy -playback -diocesan -marsh orchid -manakin -purple grackle -cob -fishmonger -otoscope -vermillion flycatcher -inhaler -instar -licentiate -myrtle warbler -goat herder -benthos -toggle -drumhead -piranha -doorplate -vault -triptych -red-necked grebe -transporter -vernier caliper -flathead -Portuguese man-of-war -countrywoman -vacation home -Bactrian camel -night-light -module -lemon curd -carancha -painted daisy -bok choy -ratatouille -troll -escarpment -cinnabar -computerized axial tomography scanner -lychgate -sowbread -bedside -guided missile cruiser -reel -cleat -hemostat -blue shark -Seven Wonders of the Ancient World -motorized wheelchair -pillow block -horned puffin -prickly pear -electric range -mother's daughter -vein -Oregon maple -bird dog -faceplate -wren warbler -feather reed grass -common alder -Adam's needle -straitjacket -organ-grinder -gantry -bikini pants -peristyle -herpes -terry -toad lily -celandine -red-breasted sapsucker -bragger -green peafowl -fuschia -quoits -house martin -dome -herpes simplex 1 -touraco -meeting house -vacuum gauge -cat's-ear -crisphead lettuce -carpet moth -European rabbit -puff adder -Old World scops owl -fire pink -fruit punch -ant bear -black walnut -stroboscope -white mangrove -pine grosbeak -cast -check-in -ring-necked parakeet -matai -shingle oak -fieldwork -rue anemone -landing net -ouzo -herringbone -lyceum -hydrogen bomb -mullein pink -masher -evening grosbeak -water vole -livingstone daisy -tomatillo -cavalier hat -interphone -wild lupine -goosefish -sugar maple -plantain -white dead nettle -Monterey pine -bugle -veloute -marsh gentian -Bermuda buttercup -alehouse -Peter Pan -thong -LP -tulip tree -scanner -scarlet tanager -music hall -angel shark -pecan -eight ball -rosy boa -outboard motorboat -garage -fanlight -black cottonwood -notornis -mountain fern -lunar crater -reddish orange -whitetip shark -executant -European ladies' tresses -washboard -revolving door -case knife -balloonfish -greater kudu -tarpan -cog -wet fly -Irish soda bread -basement -broken arch -canopic jar -muscat -kazoo -bobsledding -loaner -black guillemot -English saddle -garlic mustard -Foucault pendulum -mulberry -clotted cream -dove's foot geranium -Atlantic ridley -convector -ground floor -European wildcat -poinsettia -hideaway -great barracuda -black beech -bushy aster -cornflower -tam -true slime mold -carving knife -holly fern -railroad tunnel -crimson clover -disposal -etamine -suspension -plasmodium -political scientist -minnow -Spanish rice -twist bit -subway train -Scleroderma citrinum -saw palmetto -console -gimlet -hand pump -waratah -rock rattlesnake -keel -server -curlew sandpiper -hone -sable antelope -inkle -photostat -foresail -sallet -tiger salamander -chutney -onlooker -Exmoor -tiramisu -drawing room -battery -sour orange -juniper berry -beeper -funeral home -fescue -Maksutov telescope -ranch house -jai alai -carob -socket -popcorn -sandbar shark -pipal -summer tanager -oast -skipjack -rolling stock -dropper -great snipe -turnip greens -cowpea -honeycomb -ichneumon fly -maternity hospital -harp seal -nylon -bomb shelter -horse tick -litchi -camel's hair -mimosa -bur oak -anvil -belay -pinhead -continental breakfast -burglar alarm -Mojave rattlesnake -auxiliary storage -lightwood -ratepayer -cecropia -retractor -quadrate -pepper tree -Venus' slipper -abattoir -strawflower -firewater -purple saxifrage -black rat -pack -pepper pot -mayweed -winger -whitetip shark -great yellow gentian -snowdrop anemone -garden angelica -soy sauce -white poplar -inkwell -crouton -gas gun -honey locust -house of cards -ice maker -moquette -arrack -casualty -butterfly orchid -eau de vie -mosquitofish -prairie smoke -haft -horseshoe -steel -peach orchard -Mexican hat -encaustic -shoe -pennywhistle -sweet woodruff -hull -doorsill -globe amaranth -day school -housedog -crown princess -oxbow -maxi -positron emission tomography scanner -compere -European turkey oak -peanut -sentry box -house physician -hot line -loquat -rove beetle -riband -flowering fern -fan vaulting -ceibo -bongo -bat boy -omelet pan -European ash -breadwinner -gaff topsail -clerestory -bushbuck -bluethroat -khukuri -Father -portcullis -candy egg -brake lining -lawn furniture -buckskin -garden pea -Brazilian rosewood -Italian bread -horn poppy -silk tree -Christmasberry -hotel-casino -poplin -false lupine -desert sunflower -mimeograph -alpenstock -cork tree -cultivar -common mosquito -pollard -black marlin -understudy -lancet window -college -breadfruit -Herero -Labourite -bar printer -squaw grass -stelis -firing chamber -sycamore -artificial horizon -radiologist -pansy orchid -bicycle pump -wraparound -bell gable -home computer -orchard grass -carving fork -bergamot -honeycreeper -sewing room -radiator -core -brown bat -goose grass -adjutant general -Erlenmeyer flask -massasauga -tail rotor -cardinal tetra -Drambuie -wine palm -Sarcoscypha coccinea -shantung -Calvados -garganey -vicar -house mouse -creeping oxalis -digital subscriber line -cedar elm -backgammon board -blackberry-lily -pallid bat -New Zealander -Barbadian -rose geranium -European spider crab -gharry -electric hammer -mustard -Chinese lantern -laundry cart -filament -mozzarella -gooseberry -sukiyaki -porkpie -culvert -altazimuth -plum pudding -serin -Spanish dagger -Asian crocodile -crevalle jack -mascara -pig bed -alderman -northern shrike -Sufi -purple-fringed orchid -derringer -linseed -hockey skate -bell jar -Japanese wistaria -mantled ground squirrel -western toad -lieutenant commander -mechanical piano -ovoid -paddlefish -demijohn -coast live oak -brick -gearset -tailstock -phonograph needle -winery -tuberose -mother's boy -shot tower -crucian carp -carpet pad -lamb's-quarter -Menorah -common white dogwood -hypanthium -rosebay -wild medlar -soil horizon -sweet orange -bitterroot -hand glass -cloisonne -towpath -gum ball -margay -carambola -bolt cutter -charger -vibraphone -gueridon -elephant tree -wood-frog -ash grey -duffel coat -third base -chunga -glebe house -lake trout -encephalartos -Japanese oak -northern red oak -pruner -blue orchid -Biloxi -western wood pewee -corselet -alabaster -anechoic chamber -grass pink -wax begonia -blue daisy -pennyroyal -Asian tiger mosquito -cheese souffle -flat bench -caramel -sump pump -bush violet -common fennel -corner -skullcap -asparagus fern -white mangrove -calceolaria -sateen -saltbox -hollowware -head nurse -coal miner -mountain lily -tufted vetch -European perch -line officer -steamer -stickball -shin guard -cauliflower -Monegasque -hatpin -wolffish -trackball -khaki -arthrogram -rocket larkspur -naval commander -Gemini -ski binding -department head -Chenin blanc -wingstem -knothole -aerides -sweet bay -tautog -gangway -waterspout -Hudsonian godwit -armyworm -incinerator -kidney vetch -pine nut -cypress vine -hip tile -sorrel tree -relay -bench press -Kentucky coffee tree -dobson -sapling -false lily of the valley -veld -phaius -vitamin B2 -beaker -wall tent -sieva bean -dusty miller -sewing kit -cavalry horse -diaper -butterfly pea -Spam -saddlebill -pearly everlasting -kowhai -Sister -moneywort -organdy -pine marten -bareboat -hot-water bottle -baby blue-eyes -silver lime -common cotton grass -malmsey -blue pea -baggage car -pineapple -folding saw -cotton rose -brawler -black duck -Weizenbock -pool player -Gujarati -wild duck -purple sage -sage grouse -mail train -arm guard -short-spurred fragrant orchid -queen -eparchy -spring peeper -ortolan -shoulder -fighter pilot -American beech -snowcap -novitiate -roller -butcherbird -canyon oak -brompton stock -firebrick -rudder -light cream -Primus stove -nonsmoker -probationer -harp -kosher -surcoat -videotape -zebu -first class -yam -car -rissole -miso -funambulism -attic -curling iron -shutter -encolure -split-pea soup -yellow rocket -gas oven -ultracentrifuge -chamomile -canteen -eyeliner -yellow squash -Irish stew -collar -doublet -machinist -septic tank -snap bean -Polyporus squamosus -western tanager -creeping St John's wort -back -sinkhole -perforation -Romanian -epergne -fez -comfrey -sidecar -beach pea -screen door -instigator -plughole -woodbine -pigweed -hip pocket -common scoter -squeegee -Surinam cherry -porringer -body stocking -eatage -shallot -enlarger -common canary -trophy case -gun case -plow horse -hot plate -pearl oyster -margarita -madras -backspace key -pigeon guillemot -pajama -buckthorn berry -homestead -bedbug -Linotype -trundle bed -granadilla -theremin -chin rest -bouillabaisse -tumble-dryer -truffle -cassava -kurrajong -gyroscope -European silver fir -C-clamp -politician -green soybean -exponent -flame tree -scissortail -achimenes -crown daisy -soft tree fern -spaghetti squash -pale violet -beaver -dashiki -washboard -driving wheel -sack -foulard -sputnik -boatbill -English elm -sack coat -grog -golliwog -Malayan tapir -May wine -calash -stile -windjammer -American sycamore -rotor head -fast food -balata -dragonet -Emmenthal -metronome -negative -meadow saxifrage -rabbit ears -chenille -round -hobby -crankshaft -Wilson's phalarope -Murphy bed -soil pipe -forecourt -policyholder -tarmacadam -loyalist -gyro -Queen's crape myrtle -shortcake -apple butter -pumpkinseed -heronry -yellow perch -baggage claim -escarpment -diaphragm -mescal bean -shunter -flax -columbarium -Joe-Pye weed -Neandertal man -casement -hole-in-the-wall -Verdicchio -futurist -eaglet -tassel hyacinth -pup tent -fawn lily -cabbage palm -pogonia -hospital ship -water mill -Oregon grape -lentil -grindstone -banana split -inkberry -coonskin cap -bazooka -wrap -anise hyssop -Java sparrow -red-eyed vireo -common opossum -clintonia -bustle -booster -tribesman -soy -panhandle -jaboticaba -locking pliers -Sauvignon grape -ghat -screw -oximeter -white croaker -saucepot -eggbeater -reticule -cabbage bark -looking-glass plant -head gasket -California sycamore -cowbell -Aleuria aurantia -Herr -lever -spider orchid -cashew -shift key -solar house -wood chisel -white -mantilla -stamp -bolero -rear admiral -garden rake -Lao -crowbar -lapdog -buttermilk biscuit -yellow bedstraw -pickerel frog -dowel -serjeant-at-law -mill-hand -lambrequin -state treasurer -red silk-cotton tree -coiffeur -star anise -shoulder pad -marshal -sitar player -gown -ground cedar -hedge maple -caddie -pitahaya -corn marigold -stick cinnamon -woodland star -Eurasian green toad -anti -blueweed -medicinal leech -gaur -chocolate kiss -kit fox -mother -butte -audio CD -blast furnace -vitamin D -nutgrass -cornice -black sheep -hearing aid -lingonberry -quad -lentil -riding crop -pratincole -pentagon -sea lavender -nerita -flatmate -catboat -water clover -angiopteris -mushy peas -crown imperial -music school -woodshed -platy -Turk's-cap -rundle -reading teacher -hardtack -balloon sail -oriental spruce -bluefish -white mulberry -horned violet -satin bowerbird -treasure flower -sustaining pedal -mimosa -spurge nettle -sea green -hasp -lederhosen -pink cockatoo -long johns -basket weave -freewheel -thrust bearing -timber tree -orphan -falafel -common camas -bird of passage -bird's foot trefoil -electric eel -fizz -grape arbor -serape -brace -hazelnut -kylix -horse mackerel -cassia bark -lizard orchid -spat -Brown Swiss -pocket flap -pillory -purplish blue -rolling mill -tappet -broccoli rabe -semi-detached house -mushroom coral -fly orchid -nougat bar -ball hawk -sand wedge -shirred egg -black locust -strip lighting -drop scone -brush turkey -ball -tragopan -dallisgrass -tuatara -great knapweed -potentiometer -Kiliwa -Pacific bottlenose dolphin -accelerator -Darwin tulip -osteopath -Arizona cypress -manna ash -butterbur -cornelian cherry -American holly -nopal -tanker -foreshore -ditty bag -gas lamp -safety razor -chanter -fomite -chip -striped killifish -catalytic converter -plaice -dusty miller -takin -gerenuk -corn chamomile -Japanese pagoda tree -boneset -common osier -Guinean -taro -plotter -celandine poppy -churn -steenbok -edible mussel -sensitive fern -triode -black raspberry -zoo keeper -feather ball -dredger -starlet -cornpone -coat button -rosinweed -toy Manchester -crested cariama -finger food -basilisk -shotgun shell -comfort food -mountain hemlock -candytuft -Stilton -record changer -anklet -ball valve -Mediterranean snapdragon -BVD -sand cat -Galloway -nutmeg -water-mint -woodwaxen -citron -ark shell -federalist -drone -cheekpiece -hyperbaric chamber -addax -field-emission microscope -synchronous converter -men's room -medlar -electronic fetal monitor -Sazerac -false indigo -roof -passe-partout -meadow spittlebug -Phytophthora infestans -oast house -hedge nettle -voting booth -slender salamander -telephone jack -true bug -scouring rush -Scotch egg -matchbook -aperea -cytomegalovirus -garlic press -cove -whitebark pine -Slovene -narrow wale -mother's milk -Audubon's warbler -prickly poppy -cowl -tailorbird -mud brick -bamboo palm -welt -Afghan -Virginia spring beauty -dinner bell -night jasmine -fly rod -microtome -aerie -carinate -picker -brick trowel -loving cup -swathe -green mayonnaise -rivet -bandbox -newsroom -tea tortrix -bobby -gig -hush puppy -garlic chive -piston rod -aspidistra -bluejack oak -harvest-lice -strap hinge -sour mash -macadamia nut -histiocyte -fan belt -shelf bracket -abelia -Hottentot fig -fish chowder -abettor -compote -beige -dioon -hop -haymaker -oilskin -magnetometer -tool bag -tambour -call girl -gringo -fairy light -broad-leaved plantain -second base -zebra mussel -Japanese cedar -pistia -swamp chestnut oak -cashmere -double cream -samisen -lamb curry -companion -kapok -julep -sweet woodruff -gardener -jewfish -inspector general -collembolan -wheel bug -bass -scrubland -wryneck -macrozamia -trouser press -clove -tiger cowrie -yawl -collard -dildo -pony cart -ormer -annual -tessera -chancellery -two-toed sloth -queen -old lady -wringer -spritzer -baggage -black mangrove -black-eyed Susan -semifinalist -highlighter -alfalfa -Easter daisy -escapement -operating table -neutral spirits -bursar -roble -entablature -girl wonder -farm boy -ring ouzel -permanent press -auklet -beefsteak tomato -gaming table -tea bag -manul -giant bamboo -Ozark chinkapin -matzo -furrow -smoothhound -CD-ROM drive -powdery mildew -copilot -garden -American merganser -bunsen burner -Asian longhorned beetle -lead tree -creeping buttercup -Percheron -back brace -axseed -cub -soul food -rabbi -edelweiss -mineshaft -fox grape -sandwort -torque wrench -leisure wear -Mae West -broccoli -loach -maraschino -heavy cream -silkworm -cirque -vintner -whitewash -butterfly pea -two-toed sloth -midiron -ceriman -Bulgarian -operating microscope -sambuca -California fuchsia -silver maple -tangelo -black bean -lugsail -starting gate -leek -sunflower seed -fish fry -clinker -synagogue -coscoroba -brae -uphill -common limpet -golden plover -cedar of Lebanon -amphibian -Canary wine -taipan -agua -feeder -parallel -mater -pink calla -meat counter -yagi -crab cactus -cacao bean -bowfin -alley cat -stonefly -Eastern cottonwood -vernier scale -marginal wood fern -dancing-master -detective -yam -textile screw pine -hooch -spinet -single prop -sassafras -goose barnacle -triple cream -China tree -peeper -dressmaker -snatch block -ironmongery -dressing case -creeping bellflower -silver sage -honeydew -eastern red-backed salamander -peg -nombril -danish -mashie -anarchist -alligator snapping turtle -shepherd -American white pine -runner -chalice vine -rheumatologist -defibrillator -yellow chamomile -lemon balm -peacekeeper -native beech -sandwich board -Bavarian -titrator -paneling -deer mouse -poteen -sugar snap pea -meadow salsify -town crier -best -basinet -common myrtle -night lizard -cushaw -Tampax -camphor tree -gentile -orange peel -putty knife -pyromaniac -Brummie -fever tree -double -nest -inferior -cabbage tree -graduated cylinder -mucor -woodborer -earthwork -potato salad -four-hitter -gooseberry -water vole -ziggurat -grapefruit juice -four-in-hand -cranberry bush -diode -videotape -Mohican -niacin -beetroot -shirtsleeve -cork tree -two-eyed violet -white ash -drawing chalk -baked Alaska -bone-ash cup -toastrack -diastema -bed jacket -dwarf astilbe -yellow honeysuckle -cow pasture -sheet pile -saxhorn -upholstery material -California white oak -Spanish bayonet -horsemint -littleneck -deflector -magician -standard transmission -blue marlin -shallot -feijoa -collar -board -jump suit -common staghorn fern -priory -Xhosa -Loranthaceae -barbecued wing -barmaid -spit -lemon juice -umbrella plant -field pennycress -centenarian -queen bee -fish stick -black bread -dirk -secularist -German American -spotted weakfish -iron foundry -speed bump -yellow-fever mosquito -gag -frame -black-eyed pea -alcoholic -involucre -sperm whale -balanced diet -wax bean -butcher's broom -winter heath -Mainer -Australian pine -gas guzzler -double-breasted jacket -pod -palo verde -trimmer -wattmeter -dyer's woad -crotalaria -vine maple -sulky -jack pine -thumb -Wilton -Panchen Lama -welder -badminton court -business editor -Arabian coffee -Kamchatkan sea eagle -foamflower -steep -plane -freckle -cerebral cortex -Vouvray -tea -forest tent caterpillar -neckerchief -accelerator -jig -bridal wreath -highball glass -New England clam chowder -beach strawberry -call waiting -baton twirler -double boiler -Dutch elm -car bomb -filmy fern -breviary -Florida gallinule -dace -parsnip -riparian forest -crescent -earplug -grab bar -cusk -foglamp -screwtop -black mangrove -mascot -Welsh poppy -gas holder -support hose -salsify -red beech -Indian python -caroler -pineapple juice -lowboy -terra sigillata -black olive -hypodermic needle -radio-phonograph -moussaka -miter joint -creche -tuning fork -black wattle -affiliate -vertical tail -kiwi -red morning-glory -piping crow -runway -Kashmiri -studio apartment -sea feather -Judas tree -boatbuilder -corn earworm -fallboard -Victrola -lechwe -goat willow -turret clock -Canada anemone -leaf lettuce -savoy cabbage -headpiece -Lebanese -fothergilla -hemlock -toolshed -silver tree -blue-headed vireo -weatherman -cylinder -caltrop -adjutant bird -driving iron -millet -European woolly thistle -rose apple -clown -schoolfriend -eastern coral snake -barbecue -executive vice president -long-billed marsh wren -brittle bladder fern -tank destroyer -left-hander -matting -catchment -balsa raft -eastern fence lizard -color tube -corncrib -electric typewriter -westland pine -elder statesman -whey -plonk -mound -cittern -nest egg -copyholder -China aster -basking shark -gavial -common duckweed -vanilla orchid -red-shafted flicker -granadilla -sylph -sty -vest pocket -potherb -little brown bat -Trapezium -ordinary -adult -purple-fringed orchid -abseiler -disco -metal detector -beefsteak fungus -ilang-ilang -barley grass -hawser -suture -brake shoe -staghorn coral -barbecue sauce -Browning machine gun -sarcophagus -disa -oven thermometer -rosemary -track -gorget -quince -royal -piston ring -teak -pin cherry -Komi -walking fern -sloe -synchronous motor -fire-bellied toad -Teleprompter -co-star -cape gooseberry -oscillograph -bass clarinet -cock of the rock -Tyke -showy milkweed -safety valve -branch water -sweet marjoram -hugger -crampon -fairy godmother -band-tailed pigeon -snow-on-the-mountain -minibar -foreland -grosgrain -dita -rampion -calligrapher -jointed charlock -master -sheepshead -barrelhouse -Carolina allspice -mastic -brake pad -whiskey sour -casement window -conveyer belt -stolon -pavonia -shinny -witch elm -logwood -hostel -pageboy -vesper sparrow -pyrrhuloxia -common carline thistle -wafer -boysenberry -screw augur -hack -American white oak -governor general -Mother Hubbard -game fowl -drosophila -delft -nymphet -tollbooth -chough -Russian dressing -plum tomato -American saddle horse -dusky salamander -black medick -red valerian -cordage -Elastoplast -conacaste -backlighting -swell -riveting machine -cowpen daisy -openbill -water speedwell -picture hat -crested myna -servo -bletia -garden trowel -muscadine -common caper -false lily of the valley -aralia -sharp-tailed grouse -cigar smoker -bandoneon -Chinese alligator -crazy -point lace -charcoal -Texas horned lizard -marinara -backstay -Gatling gun -piston -game fish -fall armyworm -grammarian -beer hall -guadalupe fur seal -sugar palm -peanut -velvet ant -light machine gun -rya -cling film -adobo -myrtle oak -angelica -balsam apple -windbreak -brother-in-law -snap brim -automobile factory -clavichord -dusky shark -edible banana -altar boy -California lady's slipper -schoolbag -wax bean -Atlantic walrus -bullpen -straw wine -thatch palm -potluck -tamarind -charcuterie -sod house -tie rack -liebfraumilch -clinician -scarlet lychnis -Spanish iris -bread knife -water oak -bedpan -Angolan -bassarisk -Alaska fur seal -African wild ass -milk float -froghopper -Verpa bohemica -water cooler -chop suey -ranker -red helleborine -Prince of Wales -marmalade tree -car train -giant red paintbrush -desert sand verbena -right whale -baron -stevia -asterism -five-spot -catapult -Silex -fiberscope -refresher -beef Bourguignonne -snood -divot -waterproof -crabeater seal -Missouri primrose -bumper guard -rock opera -Lilo -coffee can -smokehouse -buffalo grass -propjet -ice tongs -poop deck -acorn barnacle -veal parmesan -shower room -collins -ringhals -silage -jawfish -trouser cuff -contour feather -songstress -rachis -White Russian -stanchion -mastaba -flatbed press -viand -legal representative -espalier -organic light-emitting diode -sushi -scorer -haricot -pinna -plectranthus -jungle cat -dried apricot -coach horse -white fringed orchis -veal cordon bleu -bath -dallier -marching order -donkey jacket -Panama tree -aerator -klaxon -pinnacle -shouldered arch -lesser celandine -common eland -Grand Marnier -cock of the rock -phlomis -Japanese umbrella pine -morning room -dead-man's-fingers -little auk -bascule -house paint -home fries -great skua -cesspool -flying gurnard -wild crab -checkerbloom -Wollemi pine -cheese dip -coif -charwoman -tea ball -waif -Arctic ground squirrel -parishioner -stabilizer bar -potentiometer -black cohosh -medlar -willow oak -cascara buckthorn -scoutmaster -Canada lily -poppy seed -paper mulberry -blackthorn -garrison cap -inductee -aeschynanthus -interior live oak -black spleenwort -wild service tree -sling -nicad -swab -sego lily -eiderdown -fruit cocktail -pallasite -weeping spruce -shiv -sea lamprey -coachman -half binding -American white birch -gainer -Concord grape -yellow birch -fucus -common room -io moth -red osier -crucible -galangal -salmagundi -pepper steak -cap opener -swizzle stick -tomato juice -Nobelist -Sarawakian -African monitor -sleeping beauty -stereoscope -curd -pyramid bugle -applejack -dosser -rake handle -pilot light -Eames chair -Scotch and soda -bell heather -dinette -blackpoll -dogie -sound camera -cattle guard -mashie niblick -edible cockle -monocle -steak tartare -partaker -sidesaddle -communications satellite -porkfish -water hemlock -drawbar -ultramicroscope -Jamaican cherry -craftsman -lovage -common apricot -drum majorette -backsword -smooth alder -Amniota -dribbler -theosophist -dolman -ivory tree -Green Beret -pipe smoker -mayoress -mignonette -crampon -henbane -kirtle -death's-head moth -instep -great St John's wort -lorry -black-necked cobra -ball carrier -Jordan almond -byway -earless lizard -marble -andiron -high-protein diet -buzzer -ice floe -crankcase -Bofors gun -sockeye -veery -Delaware -caravansary -prairie coneflower -star apple -suiting -cot -call forwarding -American gallinule -glossy snake -rose chafer -instant coffee -placket -Tarahumara -pulsar -philodendron -orange tortrix -cypress spurge -Welsh rarebit -music box -giant crab -vanilla bean -water thrush -prayer shawl -gouge -promoter -dagga -black currant -bitter cassava -drain basket -snare -digital audiotape -retainer -olive drab -gluten bread -graham cracker -cheddar pink -caregiver -spray paint -Anglo-American -boatyard -backbencher -Link trainer -bell arch -weir -arbor -millionairess -sour cream -earthtongue -crawlspace -crossjack -balalaika -crupper -western redbud -guinea hen -rangeland -gaboon viper -common louse -single-leaf -horseshoe -balsam poplar -triskelion -jack-in-the-box -jester -rain stick -glove compartment -imperial moth -Japanese beech -biotin -turnip -oligarch -western skink -mudguard -retsina -data system -green bristlegrass -visiting professor -beaded lizard -weathercock -Sloppy Joe -high tea -lightweight -record sleeve -cooler -nodding onion -pigs in blankets -torque converter -district attorney -bunting -orrery -radiator hose -common plum -wood spurge -calamus -chicken Kiev -pin -lath -telephone bell -thistledown -audiotape -gypsy moth -snuffer -pari-mutuel machine -peanut butter -hearthrug -sack -Old World yew -chives -stovepipe -xenolith -mattock -mangle -electric chair -backup system -Empire -blackwash -dodder -Allegheny chinkapin -finger plate -junk -brown rice -wild angelica -chinaberry -mason -rasp -den -violet wood sorrel -nosewheel -plenum -merino -kirtle -Igbo -ensign -sex symbol -Belgian endive -sugarberry -yellow salsify -purple emperor -atlas -African clawed frog -leatherjacket -midwife -sac fungus -European cuckoo -three-day event -Mexican poppy -wagon tire -armyworm -rain gauge -Oregon ash -columbarium -spectrophotometer -Milanese -pointing trowel -casualty -Eastern hop hornbeam -lobe -mouthpiece -au pair girl -giant water bug -Browning automatic rifle -laser-guided bomb -drone -white alder -cockleshell -mufti -gravy -berm -boat hook -marshmallow -pet shop -cowpea -tactician -wading pool -anchovy dressing -flip -shackle -Wedgwood -thick-billed murre -erecting prism -giant salamander -sleeper -quiver -chain store -wing tip -New World tapir -witches' butter -gendarme -ginseng -common maidenhair -graduate nurse -balsam pear -hoatzin -philanthropist -axle bar -gas meter -moth mullein -ragbag -Chinese cabbage -celery stick -rutabaga -scalpel -cape marigold -variometer -argali -brig -shuffleboard -wort -Orlon -epiphyllum -allice shad -coffee filter -solar telescope -Japanese linden -thinning shears -golden wattle -queen triggerfish -millinery -surfbird -flame fish -clove -dicamptodon -red-bellied terrapin -turmeric -baya -air horn -Indian coral tree -punnet -sharkskin -water crowfoot -bight -desert iguana -Texas toad -volva -dredge -Turkey red -chemical plant -gemma -dice cup -orange marmalade -mistletoe -surveyor -frozen orange juice -pallette -poultryman -burbot -courlan -captain -saddlery -bodyguard -dwarf tulip -black ash -pulse -nailbrush -tickseed sunflower -legless lizard -shirtwaist -polling booth -chickeree -garlic chive -common thyme -multichannel recorder -screw thread -sangoma -calliopsis -geoduck -colleen -bandicoot rat -pastis -swamp sunflower -scorekeeper -Honduras mahogany -Australian pitcher plant -triangle -elevator shaft -green pea soup -carrel -prairie aster -bird's-nest fungus -scarlet clematis -gook -mescal button -carcase -mulatto -ejection seat -strawberry daiquiri -goat grass -car battery -babu -chief of staff -monilia -Siberian crab -ridge rope -Morchella semilibera -nutmeg -moosewood -graham bread -California four o'clock -zwieback -velvetleaf -abelmosk -shadow box -corned beef hash -newsreader -backstairs -cutwork -sherbert -tooth fungus -angel-wing begonia -greasepaint -common milkwort -potato vine -CD drive -crepe de Chine -sporting man -koto -armet -barking frog -celeriac -drainage ditch -black box -steel blue -clotheshorse -corn speedwell -drawknife -spritsail -vichyssoise -modeler -pocketcomb -limey -suslik -cockpit -digester -brig -raita -troll -benedictine -rock wren -lock -Barnaby's thistle -school bell -school ship -Soave -falchion -swaddling clothes -terrine -smoke screen -rivulus -sweet lemon -cullis -bustier -peppermint -Philadelphia fleabane -Hampshire -active -charnel house -face guard -Quebecois -facilitator -tongue depressor -bitternut -heath aster -sapodilla -bluestem -centrist -Canterbury bell -needlenose pliers -groats -tapa -Qatari -paper feed -tilt-top table -plastering trowel -brazil nut -rotogravure -patriot -manicurist -bacon and eggs -puffbird -lightweight -golden willow -kaiser roll -duff -girandole -seaside daisy -Kurdistan -Skivvies -showboat -fire bell -lock-gate -greater masterwort -weald -ice ax -toetoe -mess kit -bucking bronco -black turnstone -backscratcher -backpacker -basement -marbleization -trigger -satsuma -fall-blooming hydrangea -mountain lady's slipper -yellow oleander -crookneck -ex-president -Venn diagram -psaltery -bulwark -old boy -linear leaf -aril -butt weld -fall webworm -pruner -bald-faced hornet -nougat -tailgate -field speedwell -potsherd -center punch -long beech fern -desert paintbrush -canyon treefrog -bushel basket -Eurasian -swamp horsetail -cryptanalyst -wicket -school newspaper -captive -spider brake -electric mixer -tumbleweed -mason wasp -sash window -paddock -wet bar -oxtongue -stevia -wheat rust -scute -switch engine -mud dauber -dotterel -snailflower -common barberry -mulligatawny -cinnamon bark -cigar box -trivet -proof spirit -cream soda -western grey squirrel -baby powder -Bren -Japanese yew -sailcloth -Basket Maker -bannock -basidiocarp -aphelion -erect bugle -limiter -bosc -Przewalski's horse -helmet orchid -audiometer -battle cruiser -grass widower -staphylococcus -Congolese -common pitcher plant -parliamentary agent -Virginia snakeroot -mockernut -Siberian elm -backbench -rough -chervil -chlamys -nationalist -galantine -screwdriver -falsifier -cancerweed -spur -jerkin -porte-cochere -dill pickle -Montagu's harrier -tetrode -true fungus -American quaking aspen -vitamin B1 -leopard lily -eggdrop soup -aurochs -core bit -Jaws of Life -trousseau -parquetry -Disciotis venosa -tender -beef goulash -vitamin K1 -pepper spray -covered smut -hook -sports announcer -weapons carrier -foxtail grass -sloe gin -mezereon -antifouling paint -pavior -pile driver -security consultant -monkey-wrench -Indian hemp -amaretto -American wistaria -A-line -market strategist -rainbow runner -souvlaki -binturong -stiletto -gastrula -Vietnamese -Old World hop hornbeam -cold cathode -pier table -houndstooth check -prop root -leaf-footed bug -sedge wren -Dutch iris -drop curtain -opossum rat -lame -pollen tube -doubletree -compression bandage -pinon pine -catmint -pier arch -kingmaker -deanery -loofah -fullback -fencing mask -flying boat -carpet sweeper -lemon-scented gum -Accipitriformes -kit -pigfish -clipper -dolmas -lesser centaury -blood agar -water violet -raw milk -lemonade -vicar-general -supply closet -Anzac -confectioner -ignition key -velvet grass -white willow -John Dory -ruddiness -wheel -common horsetail -hubbard squash -speculum -Spanish bayonet -mountain mint -glint -foxhole -housemate -bootjack -sleigh bell -clog dancer -Mexican mint -rendering -Hausa -star saxifrage -spring squill -clothesbrush -liquid metal reactor -Columbia tiger lily -sorrel -cartwheel -Jersey -Caucasian walnut -desert willow -surveyor -elbow -Santa Gertrudis -fringe bush -industry analyst -lyrebird -Cortland -arroz con pollo -catechist -tank top -jew's harp -cereal oat -heartleaf -short sleeve -butty -butterfly plant -stud finder -felloe -beer garden -clevis -wood warbler -demerara -cornetfish -mince -Jamaica rum -Spanish broom -binnacle -camise -ferrule -Copt -hall -minicar -scimitar -cryptogam -miter box -limestone fern -Marsala -Parliamentarian -gravy -woolly bear moth -formula -squash bug -pigmentation -plate -skin graft -radiotelegraph -hellbender -soft pedal -lavender cotton -propagator -Bailey bridge -cottage pie -rotgut -A battery -pintle -off-line equipment -European swift -shrimp butter -plumb bob -trunk lid -succotash -yellow cypress -heartleaf -antelope squirrel -sambar -maternity ward -deciduous plant -bartlett -Riesling -sour cherry -Klansman -poke -academician -sociolinguist -bird's nest fern -common privet -scale fern -tachograph -oyster stuffing -pusher -green June beetle -staghorn sumac -lockage -master -bap -harlequin -blackfly -spotted coral root -kahikatea -cabana -riot gun -apple mint -kob -praline -confidant -pahautea -float -city father -Zen Buddhist -pessimist -conference center -banksia rose -comfit -sweet cicely -winged bean -henroost -myope -bunt -nailfile -yellow mountain saxifrage -cruise control -abandoned ship -water chinquapin -spanker -wing nut -puccoon -pier glass -Atlantic sailfish -medlar -buttercrunch -rough-skinned newt -planter's punch -Dutch iris -control key -committeewoman -torpedo-boat destroyer -garambulla -tree heath -gladiator -September elm -inclinometer -snowbell -call-in -sunsuit -microfiche -bluestocking -cheval glass -server -franking machine -sugar syrup -Macoun -transport ship -alderfly -wash-and-wear -Abbe condenser -bush nasturtium -wild leek -canary seed -Northern Baptist -sweet wormwood -jaboticaba -cardroom -autoradiograph -ash-pan -sprinkler system -rattrap -claymore -parts bin -forest red gum -thermonuclear reactor -Indian crocus -lector -heir apparent -leafy spurge -masquerader -varicella zoster virus -cucumber tree -hedger -Shumard oak -zooplankton -quartermaster -arrester -bridge -hop clover -meadow foxtail -winter hazel -portable circular saw -penuche -limpa -blue toadflax -mesophyte -Alpine anemone -pet sitter -avocado -streptococcus -fiber optic cable -river red gum -hornist -chicken taco -red spider -tape grass -densitometer -salmonberry -tiger snake -hot toddy -silver fern -candlenut -buckram -local call -defoliator -king -mahoe -lever lock -social insect -winter purslane -bootblack -fireball -ramie -bellbird -prepuce -capote -Chinese forget-me-not -Pisces -costume -California black oak -tree lupine -golden polypody -liger -California whipsnake -urodele -sapodilla -skillet bread -duckpin -supremo -asparagus bean -kampong -endameba -cow pony -rider -motherwort -Persian iris -soursop -kohlrabi -Parisienne -irons -doubles -feijoa -farmplace -cottage cheese -bezoar goat -subcontractor -blunderbuss -down -purple martin -Lapp -crenate leaf -tobacco pouch -beach towel -Santa Lucia fir -monetarist -stringer -ocellated turkey -Texas purple spike -ackee -caddy -hedge mustard -second-rater -strawberry bush -valedictorian -steak sauce -prairie gourd -aspirant -mint -Valenciennes -vodka martini -American persimmon -big brown bat -Mycenaen -mouthpiece -norfolk island pine -pennyroyal -Jewish rye bread -granadilla -tract house -wall -shuttle helicopter -blackjack oak -Lippizan -storm window -white zinnia -sickle -sushi bar -polish -baldric -brooklime -church hat -control circuit -vicuna -death adder -eukaryote -durmast -field soybean -jacket potato -wild basil -queen consort -brooklime -octant -blue false indigo -broccoli raab -step-down transformer -date bread -blue ash -duffer -oak chestnut -pennant -wedge -Florentine iris -morion -weakfish -morning dress -public address system -spearmint -Ashkenazi -sow -interpreter -Metis -pita -iron lung -parfait glass -cylinder lock -immortelle -obstetrical toad -tee hinge -successor -western -working girl -julienne -AND circuit -spaghetti junction -fer-de-lance -enlisted woman -star -lightning rod -bilge pump -pacer -horse nettle -African oil palm -blastocyst -air hammer -bamboo fern -remote terminal -lambkin -money cowrie -Pelham -clinical thermometer -wiggler -guru -false indigo -tea bag -foredeck -king -baby shoe -mule -grab bag -silver-bell tree -knitting machine -cobia -roulette ball -larder -button pink -rumble seat -noria -queen mother -solar thermal system -aquaplane -highbrow -rusty blackbird -desktop -lima bean -pontoon bridge -watercress -wild cabbage -tumbleweed -dressing sack -compact-disk burner -spittoon -marrow -sporophyte -second fiddle -pot-au-feu -specialty store -dry -mole -khadi -japonica -lovage -squamous cell -lobe -European creeper -brown pine -bladderpod -rumble -French Canadian -mascarpone -Pacific halibut -perennial ryegrass -wine lover -turbot -longwool -silver tree fern -dust cover -synchromesh -corn pudding -alpine azalea -garboard -cane sugar -observation dome -condensation pump -hind -taximeter -hand drill -gas thermometer -jammer -buffing wheel -handstamp -prairie mallow -turkey stew -sun spurge -duck pate -kibble -Cassin's kingbird -apadana -Devon -grinner -oocyte -blank -header -schoolmaster -guard ship -intravenous pyelogram -rimu -luff -Mediterranean fruit fly -singlestick -lady-in-waiting -curb -birch -limekiln -orthoscope -serotine -Spanish oak -swamp cottonwood -edger -city man -picnicker -white basswood -Parsons table -Christmas begonia -perspirer -Pacific tree toad -Cape tulip -finger bowl -blue pike -greengage -handcar -milkweed -potbelly -river dolphin -creel -typewriter carriage -banteng -pawnbroker's shop -huon pine -biennial -man of action -foundress -caveman -featheredge -jordan almond -sandblaster -coralberry -low-calorie diet -hoot owl -garter -bain-marie -wrecker -fenugreek -double-hung window -idol -scullery -balloon vine -summer savory -winged spindle tree -Helvella crispa -walrus mustache -gas engine -boulle -rush grass -rue -hoe handle -cat fancier -deerstalker -dunker -American red plum -fall dandelion -groover -sprag -stair-rod -wish-wash -pricket -architrave -California laurel -net melon -Arizona sycamore -executive secretary -silverweed -silky cornel -surface ship -square sail -common purslane -villa -holly-leaved cherry -sweet birch -pecan -artillery shell -breast pocket -pirogi -scarlet runner -rabbit brush -mealworm -leather carp -palette knife -Jerusalem sage -boneshaker -slit lamp -digital voltmeter -polar glacier -square-rigger -homogenized milk -Sten gun -lesser calamint -pyrograph -Korean lawn grass -Zinfandel -crepe fern -western ragweed -clasp knife -distributor housing -cartouche -scooter -ski parka -jackknife -Carolina spring beauty -soft diet -candlesnuffer -horse trader -step stool -agouti -accelerometer -annual fern -judge advocate -angelica -roll film -treehopper -ombu -comer -sultanate -kitchen help -hooded ladies' tresses -milking machine -knuckle joint -Jamaica honeysuckle -music teacher -sauerkraut -Weston cell -slivovitz -Worcester sauce -tall bellflower -chancery -prophetess -casquet -shortfin mako -sorus -visual display unit -asp -grenadier -black pepper -crottle -erasable programmable read-only memory -jabot -ratchet -disk controller -chief petty officer -tap wrench -white mountain ash -cultivated rice -flying phalanger -skillet corn bread -BB gun -Elamite -European red elder -reed rhapis -ciderpress -inga -torpedo -wild teasel -bean curd -oeil de boeuf -acuminate leaf -bitter lemon -hitchrack -Lorraine cross -hostess -European dogtooth -adz -polonaise -rock sandwort -Waldorf salad -myrmecophile -klystron -mole rat -draba -corn borer -robusta coffee -chub mackerel -leatherleaf -chronometer -Moselle -sea aster -fennel -slop basin -constable -Brunswick stew -hydraulic pump -French omelet -icebreaker -Manx shearwater -press of sail -ninepin -blue succory -bootstrap -hallstand -chit -firefly -bearded seal -fuel filter -jezebel -mate -Roquefort -cheesecloth -plasterer -blue pimpernel -lake dwelling -shrink-wrap -goat cheese -common gum cistus -coastland -Sunday best -wild tobacco -mandrake -common unicorn plant -barbican -culotte -blockhouse -German iris -tarragon -caramel -wild rosemary -grain -voyager -squirting cucumber -eastern narrow-mouthed toad -creeping fern -luge -saffron -garland flower -furnace room -starship -Oriental scops owl -Italian honeysuckle -berserker -Chinese elm -scrubber -bishop pine -French polish -compromiser -skimmer -river shad -lobster thermidor -leadwort -man-of-the-earth -razorblade -vicegerent -empress -link -ham and eggs -wild lily of the valley -blackfish -splicer -fossa -mara -moneygrubber -brachiopod -fauteuil -caldera -finish coat -croupier -termer -leopard's-bane -sei whale -molucca balm -dolly -dog food -term infant -soft roll -episcia -sewer -inquiry agent -active citizen -perry -California newt -moon shell -bladderwrack -common shrew -dill -Dutch elm fungus -key lime -electrometer -divorce lawyer -lamb's-quarters -apple turnover -shipmate -Guernsey -legionnaire -electric blanket -Rocky mountain pinon -tobacco mildew -stinking iris -forestiera -departure lounge -wiper motor -jurist -scarlet runner -pallbearer -batter's box -inertial guidance system -fines herbes -oilcan -sisal -mustache cup -steamed pudding -Visayan -fiesta flower -lady tulip -lungless salamander -batiste -electrical system -blazing star -car carrier -Walloon -mother hen -stump -mulled cider -secondary coil -Alexandria senna -etui -scrumpy -Havasupai -jawbreaker -glume -ex-husband -Eskimo -Joint Direct Attack Munition -number theorist -five-hitter -pinstripe -Olympian -common mackerel -stone bass -bigos -Bahraini -airbrush -great ragweed -glass lizard -hand fern -roundel -riding master -shoetree -yellow avens -old fashioned -dolman -stinger -nursling -legate -faille -golden fern -bedpost -shop steward -kidney bean -bladderwort -internist -limeade -Bruneian -Coloradan -playsuit -wintergreen oil -Cantabrigian -mutton snapper -shot putter -hand grenade -moccasin -cobnut -marrow -separatist -cockscomb -discharge pipe -Gabonese -spade bit -chicken cordon bleu -varnish tree -European wood mouse -striped gentian -Ayrshire -curassow -moo goo gai pan -malarial mosquito -glow tube -ledger board -bib-and-tucker -European chestnut -suffragette -color wash -gaffsail -golden larch -voting machine -Kahlua -lungi -amusement arcade -Uzbek -butternut -mold -mule's ears -dickey -shrimper -trophozoite -dreadnought -shepherd's purse -greenhouse whitefly -spotted gum -copperware -perfect game -semigloss -spawn -telecom hotel -stakeholder -mason wasp -flibbertigibbet -chin strap -fringed pink -saki -urchin -memorizer -roulade -whiting -cling -corncrake -Queen of England -choo-choo -empty -heating pad -playmate -visualizer -popcorn ball -absconder -sou'wester -target acquisition system -mock-up -dental floss -tray cloth -haddock -bulblet fern -housing commissioner -delayed action -anchor light -harbor porpoise -water wings -PT boat -night latch -fennel -doorframe -green-tailed towhee -grey polypody -torture chamber -American germander -Chinese wistaria -cattalo -accompanist -rifleman -alpine clover -contrarian -lemon peel -Mexican cypress -sprog -dado -Galilean telescope -desmid -lockup -Latin -American raspberry -mescal -butternut -prairie orchid -downy yellow violet -green hellebore -radio compass -bread and butter pickle -Cherokee rose -knish -destroyer escort -Arkansan -langlaufer -pyxis -winter savory -velocipede -motley -winter savory -law student -barren ground caribou -apple dumpling -field hospital -works -city editor -European flatfish -Morchella crassipes -life office -boot camp -cream sauce -cape aloe -acetate disk -devil ray -tile cutter -Plymouth Rock -microspore -godown -Syrian -tiercel -American cranberry -lesser spearwort -anopheline -Spanish oyster plant -wire cloth -attic fan -birch beer -small computer system interface -crook -ribbon fern -explorer's gentian -nagami -I-beam -rosebud cherry -Jerusalem artichoke -Stillson wrench -pluralist -district manager -Levantine -orangeade -part-timer -post horn -Oregon grape -contadino -cargo helicopter -silverpoint -chaja -California bluebell -case -Shasta -cheese cutter -Leishmania -avalanche lily -iron horse -bialy -Yana -Delawarean -Prussian -nonpareil -hammer -hoper -chewink -anil -skim milk -desert four o'clock -crescent wrench -white marlin -blue jasmine -malacca -anadama bread -purple poppy mallow -ganglion cell -ligature -no-parking zone -golden clematis -Cotswold -aliterate -shebeen -yardarm -superbug -fanaloka -stinking cedar -spirochete -wort -pater -heaume -thermocouple -ironing -naval tactical data system -European goatsucker -prairie cordgrass -accused -foreign agent -halberd -western mugwort -esthetician -Persian lilac -cracked-wheat bread -crosscut saw -rock penstemon -paper cutter -crematory -ideologist -cattley guava -margarine -creosote bush -hoary plantain -spark gap -lumberjack -Greek valerian -mission bells -tight end -bigeye -large crabgrass -stone marten -cleat -lentil -bay scallop -lector -charger -assemblywoman -second lieutenant -boil smut -sarsaparilla -hydromel -cat flea -pinfish -whole milk -hairnet -myeloblast -peasant -blind curve -first offender -dwarf-white trillium -Brother -coatdress -gun emplacement -tamarisk gerbil -snap -air cushion -trailing edge -potato vine -gig -everlasting pea -champion -dibble -rattail cactus -timothy -prince's-feather -cutlas -lockring -sealing wax -Brussels lace -corn mint -highboard -she-oak -wild celery -pillar -Burberry -Hakka -leucothoe -bell tent -gallery -coontie -leather fern -smack -adenovirus -linoleum -chain wrench -tammy -gas fixture -nut bar -baneberry -butterscotch -goat's rue -bullock -grey snapper -mother-in-law -hyson -wayfaring tree -mollie -needle spike rush -buckwheat -bayberry -brush-tailed phalanger -dry rot -harborage -stormy petrel -Oriental beetle -Atlantic halibut -coping saw -simple fruit -viscose rayon -surgeonfish -upstairs -security system -common ragweed -verticillium -pancake batter -hawk's-beard -Dutchman's-pipe -refrigeration system -European parsley fern -Ivy Leaguer -totalitarian -gonococcus -towhead -showy sunflower -pallium -multiengine airplane -hair trigger -rabbit-eared bandicoot -siskiyou lewisia -fuel system -flat arch -broad beech fern -Alpine lady fern -bracken -Kentucky black bass -rut -mountain maple -tunaburger -umbrella fern -white-headed stilt -meat hook -panhandler -washhouse -barnyard -safety lamp -leg -ripple mark -paper -sagebrush lizard -light heavyweight -common nutcracker -operator -stalking-horse -horseless carriage -fishhook -suction cup -peg -Ungulata -false teeth -round-bottom flask -Luba -campaign hat -firebox -rudder -parapet -ice pack -appellant -spirit stove -metheglin -common bamboo -soapwort gentian -pannikin -time capsule -burn bag -folk poet -tropical prawn -end man -new caledonian pine -linen -web -free trader -jury box -railing -pignut -leaker -potboy -rubber boa -white snakeroot -plumber -Candida albicans -surfboat -woman -promulgator -eyecup -wild China tree -rattlesnake master -Viyella -alpine salamander -ailanthus silkworm -Albatrellus ovinus -war room -meadow vole -robotics equipment -rotary actuator -Engelmann spruce -pinesap -beefcake -native speaker -ridge -injector -water chute -salmonberry -decoupage -bottlebrush -date plum -circlet -American mountain ash -pocketbook -horsemint -sweet four o'clock -kirpan -pinto bean -chervil -equator -range animal -candy thermometer -calanthe -cul -stipendiary -brahman -pelican crossing -topgallant -wild senna -sliding window -carrier pigeon -Tatar -quadruplet -bumboat -spearmint oil -slip clutch -young Turk -golden yarrow -shank -glasswort -dental plaque -Manduca sexta -Northern bedstraw -dent corn -Life Saver -western wall flower -bedder -wherry -Tuscarora -scrapple -borstal -reflux condenser -problem solver -nondriver -perforation -eastern cricket frog -white wood aster -broad buckler-fern -Cape primrose -herringbone -head louse -earl -baton -recording system -primary color for light -cherry laurel -pomfret -ratafia -chocolate milk -obscurantist -revisionist -rood screen -magnetic needle -commensal -oil tycoon -celebrant -domicile -harvest mouse -California nutmeg -greater spearwort -black-billed cuckoo -winepress -demographer -straw boss -diabetic diet -sweetmeat -rabbet -ming tree -basketweaver -freestone -walk-in -Aryan -box coat -audio amplifier -chicken salad -churidars -whydah -box -batman -siren -selectman -gouger -drip coffee -Caesar salad -interpreter -whinstone -grey goldenrod -minicomputer -honey crisp -hypercoaster -Irishman -swamp white oak -reed canary grass -globeflower -cynthia moth -fennel seed -canthus -chino -blind date -tar pit -watermelon begonia -fishtail palm -overcast -Pearmain -primary color for pigments -coal seam -wherry -safety bolt -cretonne -Michigan lily -inflater -moneybag -huckleberry -brassard -bush vetch -looking glass tree -pinwheel roll -alfalfa sprout -sea kale -clinometer -achira -lorgnette -potter wasp -gilded flicker -tody -capulin -captain's chair -crackle -gerardia -prie-dieu -venture capitalist -New Jerseyan -block and tackle -elf cup -bur reed -automatic transmission -wax palm -flytrap -crack willow -coachwhip -swizzle -lugger -Dewar flask -baster -oxyacetylene torch -Culex quinquefasciatus -St Peter's wort -wild hyacinth -Russian almond -burrfish -wintergreen -katsura tree -butcher knife -perfumery -thresher -porte-cochere -sheepwalk -hypotenuse -Dalmatian iris -buttercup squash -demiglace -goldenseal -preceptor -rigger -poikilotherm -old-age pensioner -posthouse -wood horsetail -repeater -reciprocating engine -Rambouillet -terra cotta -togs -battledore -horizontal tail -missile defense system -trier -morello -woolly adelgid -munition -double creme -in-fighting -squirrel corn -crow's nest -antler moth -brake cylinder -bandoleer -noticer -Parmesan -hipline -cheapskate -Dubonnet -mole rat -bog aster -ribbon tree -meadow rue -nard -ratel -loose smut -snapping shrimp -golden glow -basil thyme -Florida strap fern -moonshine -flume -lace fern -black bream -orchestra pit -archerfish -exile -ringdove -career man -godfather -bottom-feeder -pasteurized milk -dental implant -pedicel -Catalpa speciosa -yellow foxglove -lancet arch -steam shovel -sampan -patrol boat -sailor cap -tollgate -monal -velociraptor -cacique -jack oak -cursed crowfoot -creep -Parry manzanita -common matrimony vine -grace cup -caecilian -spurge laurel -prickly lettuce -Regius professor -camail -Sitka willow -Courtelle -gin sling -dogmatist -guest -saltine -dust cover -sport -sweeper -feist -lady's-eardrop -vibist -wire stripper -tenpin -interplanetary space -beet green -pruning knife -drainage system -gunnery -ballet master -lime juice -flak catcher -lacrosse ball -Canadian aspen -beatnik -railhead -utilizer -spadefish -Arizona white oak -city university -dense blazing star -hedger -chain pickerel -right-hand man -namby-pamby -nacelle -redneck -tumbler -Chief Secretary -cannon -cupola -kummel -papaya juice -Burton -Stanley Steamer -loganberry -stylus -square meal -rock bass -western ladies' tresses -dramatist -assignee -tandoor -trumpetwood -segregator -green adder's mouth -coral necklace -ani -iceboat -densimeter -oxtail soup -kernel -cos lettuce -greenishness -panchromatic film -Parker House roll -oatmeal -backsaw -double Gloucester -bailey -storage cell -giant -coconut milk -broadtail -barouche -loir -soybean meal -white-leaved rockrose -junction barrier -spandrel -sweat bag -goldilocks -flowering wintergreen -cockspur -beef fondue -holding cell -cardamom -cagoule -Kamia -tangelo -Herschelian telescope -wine bar -kachina -sand sage -guy -ivory palm -citrus mealybug -topper -ladyfish -force pump -fanion -calaba -Iowa -orrisroot -ivorybill -Secretary of Agriculture -gagman -dry cell -hypnotist -kenaf -grey alder -deathwatch beetle -gagman -magnetic stripe -trap door -abdominal wall -prefab -broomcorn millet -architeuthis -angler -Pacific giant salamander -barbette carriage -low-fat diet -veal scallopini -B battery -wallah -landing flap -pistachio -jaguarundi -nagi -cicerone -felt fungus -Aertex -stocks -smooth aster -patchouli -lemon sole -sleeper -basket fern -dundathu pine -anjou -Moreton Bay chestnut -broom sedge -candid camera -red angel's trumpet -oilstone -cinnamon toast -Pacific walrus -fruit custard -Jehovah's Witness -mate -voyeur -Esselen -achromatic lens -sanguine -brine shrimp -dunce cap -swot -transit instrument -grey willow -pack -bench clamp -Nova Scotian -gadgetry -silvery spleenwort -enchantress -rough fish -morula -giant taro -sorus -roux -polyhedral angle -spruce beer -Chicano -cola extract -outfielder -kohleria -white-rumped shrike -car-ferry -subway token -spoon bread -totara -corn borer -bowhead -tensimeter -water scooter -flickertail -Catholicos -pleaser -blue-eyed Mary -calabash -handyman -cascades frog -facing -scarlet oak -lutist -ginger -tree tomato -Harvey Wallbanger -tent peg -insectivore -fusil -swale -chinning bar -bladderpod -New Dealer -dhoti -proscenium arch -common vetchling -channel -collect call -safflower -Texas tortoise -test equipment -theca -RAM disk -sheep sorrel -rammer -buttonhook -honey mesquite -dominus -babirusa -queen -Aspergillus fumigatus -crash barrier -nonmember -Muscovite -verdin -Australopithecus afarensis -Turkish Delight -stalked puffball -giardia -divider -mountain skink -head smut -pacemaker -evaporated milk -rattlesnake fern -flamethrower -navy bean -bather -steed -showy orchis -stone crab -artichoke heart -phantom orchid -space helmet -swamp laurel -privateer -junior -surcoat -bristlegrass -flower girl -aphid lion -penthouse -lemonade mix -coude telescope -natal plum -scriber -wood nettle -rape suspect -resplendent quetzel -western poppy -choir loft -fore-topsail -thyme-leaved sandwort -erotic -short circuit -outdoors -flowering tobacco -hookup -aviatrix -corker -horehound -horn -swamp pine -water biscuit -cherimoya -vaporizer -courtier -European sole -full skirt -Mother Carey's chicken -cymule -huck -white snapdragon -mountain nyala -country borage -bonduc -casein paint -grampus -shrimpfish -lodge -dragee -black walnut -caraway seed -roper -glass cutter -tab key -Richardson's geranium -demigod -chichipe -Italian ryegrass -cadet -electrograph -rudd -carpenteria -foie gras -lignum vitae -hedge nettle -pledger -American hackberry -flageolet -beaked hazelnut -reflectometer -sticky geranium -marriage bed -white pepper -japanese clover -whiteface -gnat -extrovert -Canada plum -talipot -chicken stew -egg foo yong -fraxinella -skibob -saucer magnolia -jacket -green smut fungus -cloakroom -landing skid -booth -ice milk -dipole -striped coral root -red buckeye -roughcast -breaststroker -cowherb -razor clam -first-aid station -briarroot -clambake -lander -Bramley's Seedling -frail -jird -minisub -luging -poison milkweed -European lobster -epidemiologist -spandex -paloverde -marumi -bypass condenser -punter -petty spurge -Coryphaena hippurus -bilberry -vermillion rockfish -witness box -viscometer -pulque -Massachusetts fern -herring salad -ridge tile -mesa -dwarf grey willow -southern aster -punch pliers -tarnished plant bug -hoop pine -Japanese red pine -benedick -rebozo -silver plate -silver willow -mouse-ear hawkweed -bonito shark -abutment arch -noble cane -tiger rattlesnake -pongee -jumping plant louse -pattypan squash -giant ryegrass -railroad bed -stiff aster -imperial Japanese morning glory -laundry -winter cress -large white petunia -tea maker -pen-and-ink -early warning system -lug -monocot -sea wormwood -breechblock -postage meter -third rail -Mongoloid -Australopithecus boisei -umbrella tent -stirrer -Dumpy level -beroe -post and lintel -green spleenwort -tomato paste -dishpan -stentor -sweatband -cobbler -New York fern -gaff -prairie willow -cyclops -jigsaw -rotavirus -pallet -eastern ground snake -boiling water reactor -acute triangle -agora -European cranberry -roebuck -surgical dressing -busboy -cannikin -feedlot -common pond-skater -cochin -horsehair lichen -fetter -sapote -fichu -dermatologist -fire tongs -creme anglais -foster-mother -laurelwood -chicken snake -mincemeat -rocker -wild spinach -powder and shot -butterwort -auxiliary engine -mamey -hart's-tongue -sucking pig -American turkey oak -troopship -buttermilk -divi-divi -boatswain's chair -soda fountain -southern flying squirrel -elastic -cutaway -housekeeper -renegade -apple rust -bridoon -machicolation -stunt -keyhole limpet -personality -solitary vireo -epidendron -Jihadist -boffin -bettong -terror -partial denture -pusher -saltcellar -capstan -large poodle -Bibb lettuce -low-bush blueberry -staple -banded krait -sickroom -barnyard grass -wandflower -woodworm -bluegrass -squirrel's-foot fern -rabbitfish -delta wing -milking shorthorn -limber pine -guru -gamine -scythe -sweetsop -Gruyere -bloodmobile -mine detector -American mistletoe -silver beech -hound's-tongue -Lombardy poplar -basket fern -pink-and-white everlasting -redtail -Aladdin's lamp -mace -outtake -condensed milk -Canada wild rye -silver perch -waxflower -taxer -Chinese chestnut -Our Lord's candle -mugwump -school system -salp -osso buco -dress shirt -butterweed -low-fat milk -couchette -broomcorn -proscenium -mill agent -smut grass -humpback -southern spadefoot -military leader -canebrake rattlesnake -tailor-made -ebony -beach house -flying gecko -hoary alison -typhoid bacillus -Romanov -vanilla pudding -sweet cicely -Spodoptera exigua -dress rack -flannel -skipjack -bolognese pasta sauce -rooibos -thunderer -blessed thistle -gauntlet -mahatma -granadilla -laurel sumac -Yuma -thyme-leaved speedwell -encyclical -twill -linocut -manna gum -spark arrester -cocklebur -Indian hemp -lemon oil -Hall's honeysuckle -raceway -flop -Himalayan lilac -one-flowered wintergreen -photosphere -silvery spleenwort -convex polygon -canarybird flower -foster-sister -fluffy omelet -palanquin -roll -dandelion green -Javanese -workpiece -Carmelite -bread mold -schlemiel -wild lily of the valley -grugru -solenoid -puff batter -skep -balance wheel -Gadaba -portia tree -mobcap -two-man tent -scuffle -firebrat -ant lion -anise -caster -giant petrel -American water spaniel -naboom -treasure ship -foster-son -fiddleneck -alidade -sugar refinery -wild oat -water beetle -generic -damson plum -abrocome -detainee -pitch pipe -coast -nilgai -radiotherapy equipment -heart-leaved aster -gristmill -grocer -Appaloosa -Cheviot -brake pedal -lantana -cave myotis -Rob Roy -sea spider -latrine -carpophore -recycling plant -coondog -brace and bit -funambulist -eggar -mantelet -postdoc -mezzanine -coco plum -pulse generator -high-vitamin diet -menhaden -mechanical engineer -bergamot mint -Chuvash -grated cheese -helicon -belladonna -beet armyworm -eelgrass -resuscitator -interrupted fern -arrow grass -cistern -Pacific herring -colostrum -journal bearing -Fauve -wrist pin -canape -choice morsel -quadraphony -guard boat -shortgrass -claymore mine -hitching post -cargo door -decoder -gym rat -Cocopa -commander -apple of Peru -seckel -yellow goatfish -dog flea -dodo -oconee bells -Tudor arch -turkey stuffing -ebony spleenwort -wheat flag smut -scolopendrium -Brazilian pepper tree -gusset -inspector -lunar excursion module -baron -plantigrade mammal -Creole -phosphate -aromatic aster -ghee -audiovisual -onychophoran -cotton stainer -lieutenant junior grade -spheroid -amen corner -caper sauce -Caladium bicolor -dyer's rocket -seaside goldenrod -flint corn -Very pistol -rotifer -steeplechaser -rouleau -escape wheel -Namibian -millivoltmeter -emmer -climatologist -agateware -sea lyme grass -inclinometer -water fennel -saddle seat -vicar -garden cress -ski rack -Norfolk jacket -casaba -coast rhododendron -sericea lespedeza -hematocrit -autopilot -tilter -finish coat -Pennsylvanian -shrubby St John's wort -podocarp -percussion cap -ceriman -peanut bar -gean -jack -durra -rotor -carob -cottage tulip -three-spined stickleback -trencher -elevator -kalumpang -abaca -Australopithecus robustus -active matrix screen -water bed -hatmaker -lodestone -cat food -overcup oak -balletomane -popgun -rheometer -process cheese -frog legs -heartleaf arnica -p-n-p transistor -steam turbine -Tulu -scalene triangle -licorice fern -coffee break -trade unionist -starved aster -firing pin -water gum -Masonite -hairspring -seminarian -blue racer -forecastle -scrub pine -Atlantic spiny dogfish -kopje -orphrey -fan tracery -gee-gee -vixen -interstellar space -Harris Tweed -sawmill -lemon mint -bitewing -ringlet -Chinese mustard -paleontologist -American hazel -brigantine -clay-colored robin -zombie -nectarine -West Indian jasmine -pineapple weed -rusher -gynecologist -pole -thylacine -myrtle beech -golden cup -woodruff -T-bar lift -terebinth -service club -homegirl -Blue Mountain tea -figwort -New Hampshirite -Stayman -tonometer -white turnip -messuage -cruet-stand -colliery -connecting room -lesser twayblade -bland diet -crown prince -beggarwoman -restharrow -bower actinidia -firebug -hepatic tanager -telegraph -Spodoptera frugiperda -spackle -carpenter's square -pyx -supermom -thickhead -whorled milkweed -Arctic char -Chinese rhubarb -pince-nez -wolverine -tomato concentrate -cascarilla bark -red underwing -leather flower -Jerusalem thorn -bullpen -Salisbury steak -anode -coffeeberry -bottling plant -fritter batter -aerial torpedo -matrix -local oscillator -stalked puffball -bruin -three-cornered leek -wassail -stabling -damping off fungus -myriapod -osier -lesser kudu -cownose ray -chokecherry -wagon -obstetrician -Glengarry -even-pinnate leaf -wine sauce -osteocyte -baker's yeast -heir presumptive -blackjack -tympanist -golden fern -fipple -Japanese oak -bar mask -stamping machine -argus -knobcone pine -oil beetle -lanai -upper berth -condenser -proctologist -catechu -wild spurge -vestry -ground snake -proton accelerator -walker -scarlet bush -transom -lagging -bouillon -slender loris -black currant -developer -football hero -plum sauce -striped mullet -prince charming -fictional animal -prosimian -lug wrench -lemonwood -kirsch -spy satellite -black caraway -Thompson Seedless -bead tree -purple fringeless orchid -Virginia strawberry -chigetai -punkie -gall wasp -addressing machine -rock polypody -good-king-henry -spring cankerworm -wimple -noncandidate -saskatoon -hacienda -Darjeeling -snowberry -lounging pajama -ascospore -ski-plane -hedgehog cereus -Welsh onion -yautia -coaster brake -sickle cell -parrot's beak -fuller's teasel -painted greenling -scablands -stuffed cabbage -barrel organ -etcher -dwarf maple -camp -Australian blacksnake -currycomb -obtuse triangle -rose gum -psychrometer -abridger -torpedo -carpet loom -sodalist -slender rush -loligo -sclerometer -wimp -dotted gayfeather -green ash -pinstripe -moralist -medusa's head -garden centipede -heath aster -fool's parsley -olla podrida -Potawatomi -Edam -toothache tree -hulk -seabag -narthex -compartment -prairie star -lookdown -B-flat clarinet -event planner -clip lead -shirting -milk punch -supercharger -macadamia nut -giant coreopsis -computer store -martingale -keyboard buffer -summer flounder -squash ball -gas turbine -object ball -plier -black mulberry -reef squirrelfish -scampi -willow aster -bowler -striped marlin -smooth muscle cell -diplodocus -Liberty ship -sponge cloth -guitarfish -walking leaf -showroom -California bluebell -bolo -turnbuckle -boysenberry -hardware -Gael -imago -endorser -jujube -dust bag -rapporteur -field wormwood -low-water mark -naval missile -Pacific yew -reversible -crabapple jelly -poniard -barricade -spawner -simnel -seltzer -deckle edge -needle -timbale -satellite transmitter -organization man -job candidate -orderly -native cranberry -fir clubmoss -coaming -chartered accountant -electron accelerator -Sierra plum -American foxhound -long underwear -Penobscot -blueberry yogurt -biretta -cascara -Paranthropus -Dorian -nun's habit -lenten rose -Augustinian -designer -northern phalarope -mombin -hazel mouse -reeve -waffler -telegraphy -Verpa conica -ignition coil -Japanese oyster -S-shape -divining rod -ant thrush -throat protector -interlocutor -Desmodus rotundus -pere david's deer -attenuator -Cypriot -red sandalwood -pendulum watch -broadcloth -striped drum -sequence -safety arch -diapensia -hog -western spadefoot -chlorella -comb-footed spider -Chechen -darning needle -C-ration -hard beech -piano action -scaling ladder -Nepal trumpet flower -ravigote -screw wrench -ramekin -Lyonnaise sauce -dinner napkin -partial veil -masseuse -coatrack -mooring tower -blue-eyed African daisy -English horn -baton -rope tow -toll bridge -massage parlor -quark cheese -lounging jacket -tall goldenrod -flying jib -coordinate axis -barley-sugar -integrator -worm gear -captain -sweatshop -class -layer -chili powder -dripping pan -oatcake -newsroom -tadpole shrimp -rake -trade magazine -silks -ram's-head -senior -knower -masseur -yam -peg -wheel tree -hardbake -test room -long-spurred violet -creeping spike rush -shrapnel -coffee senna -matchbox -creeping soft grass -welder's mask -pickaback plant -urial -hooded pitcher plant -incense cedar -Ohio buckeye -ant cow -skeleton fork fern -Indiaman -swamp ash -testatrix -marang -spherocyte -Winesap -Indian mallow -teju -Yersinia pestis -dye-works -sauerbraten -coral bean tree -safe house -postulator -eyas -lotus -wood vise -lady-of-the-night -East German -cymling -rock candy -western omelet -anoa -rainbow seaperch -crossover voter -Finn -tree shrew -hog plum -Federal -shagbark -clockwork -Alexandrian laurel -metal wood -brill -military chaplain -trend-setter -call-back -Indian rat snake -spurred gentian -Japanese maple -forest goat -bee moth -viola da braccio -duckboard -armyworm -hangnail -counterbore -cream-of-tartar tree -Mullah -bonbon -water hazard -temple orange -corporatist -rough bindweed -Turkish bath -mistletoe fig -beach sand verbena -caddisworm -English plantain -brown Betty -power pack -lion's-ear -Francis turbine -stayer -dichondra -marsh St-John's wort -squab -energizer -common horehound -mantispid -pullback -handwheel -spark arrester -yakuza -Virginian witch hazel -grunter -waterworks -bondwoman -chain printer -stockjobber -coconut milk -yardgrass -blue chip -bridle path -riser -pleurothallis -saltwort -salal -broadside -blackboard eraser -bastard -Para rubber tree -red bat -digital-analog converter -calabash -cashier -cow shark -horned pout -microphage -monologist -woolly monkey -Illinoisan -marsh horsetail -distaff -siris -eparch -gooseneck loosestrife -sounding rocket -multiprocessor -saiga -xerographic printer -madrona -right triangle -sweet gale -red maids -wolfsbane -pork-and-veal goulash -French sorrel -mutterer -Venetian sumac -drumlin -white crappie -squire -large-flowered calamint -northern cricket frog -mushroom sauce -supertanker -morello -auxiliary boiler -Virginia thimbleweed -cottage tent -bubble shell -big shellbark -wormwood sage -cider gum -coast lily -American feverfew -Peruvian balsam -purple silkweed -tobacco moth -desk dictionary -rock elm -eastern indigo snake -Japanese privet -lamb -levee -L-plate -soapfish -painted tongue -scuttle -markhor -Marburg virus -mackinaw -major -crypt -ball and chain -domestic silkworm moth -bottom feeder -mistress -death house -freight elevator -bellyband -Pulex irritans -Bacillus anthracis -fire control radar -hysterosalpingogram -turbogenerator -decompound leaf -vambrace -scentless camomile -Medinilla magnifica -prima ballerina -Northern Spy -quartz lamp -grains of paradise -justiciar -felt fern -seismograph -Madagascar jasmine -imaret -white perch -Alpine mouse-ear -tea bread -yellow bass -poseuse -espionage agent -punching bag -eurypterid -orange sneezeweed -banded stilt -armhole -postern -mother -kapuka -catechumen -Soubise -Sauvignon blanc -gunnery sergeant -self-starter -ceratozamia -Atlantic cod -Reoviridae -blood cup -horseshoe bat -oriental plane -voussoir -fetterbush -samara -truncated pyramid -lingcod -athenaeum -shyster -Carolina hemlock -submarine torpedo -floating fern -yataghan -sun tea -viola d'amore -conenose -ventilation shaft -walk-up apartment -saury -wild wheat -porcupine ball -tahini -kris -grass fern -drip pan -black bryony -Scotch broth -tapioca pudding -southwestern toad -Hare Krishna -guimpe -wild madder -megalocyte -teaching fellow -shrubby penstemon -lesser wintergreen -privet hedge -Fahrenheit thermometer -stern chaser -prickly ash -pump room -ricer -chicken mousse -wing commander -sun gear -bolus -alpine milk vetch -opera cloak -twinjet -Goldie's fern -abnegator -alphabet soup -node -grape jelly -early coral root -Tarzan -quarterstaff -greeter -Eurasian woodcock -primary coil -quirt -tinkerer -bolt -creme de fraise -voltage regulator -news photography -Jat -bristly locust -Gouda -dickey -lobster butter -dwarf flowering almond -fagot stitch -Reform Jew -ostrich fern -bathyscaphe -purple mullein -alpaca -civic leader -jellaba -Arizona ash -wasabi -Irishwoman -choke -stockinet -religionist -sewage disposal plant -bittersweet -Hyphantria cunea -pheasant under glass -screen actor -chapterhouse -quoit -horseshoe bat -rapper -cupule -planetary gear -cascade penstemon -redoubt -salt -areaway -megalomaniac -bush willow -amethystine python -plains spadefoot -colour supplement -kick pleat -bell apple -narwhal -slippery elm -stenograph -baa-lamb -quadrant -balker -jobcentre -spit curl -bastard indigo -malacca -serow -adobe lily -yacca -palestra -penalty box -scrub beefwood -reenactor -screening -white bryony -alderleaf Juneberry -harpoon -alpine clubmoss -neurosurgeon -surrey -sweet calabash -Scotch laburnum -coquille -French honeysuckle -extrados -pipe cleaner -southwestern white pine -Virginian stock -scaly lentinus -aileron -carob bar -swordfish -Alpine woodsia -negus -wireworm -sweep -goldfields -drop arch -European bream -roly-poly -pin -bastard wing -fustian -wild buckwheat -lake whitefish -overcoat -water filter -Bermuda chub -New Zealand spinach -high-hat cymbal -European larch -radiologic technologist -fine-tooth comb -brunch coat -splice -electronic converter -overmantel -extern -taper -cluster bomb -teletypewriter -pinwheel -trailing arbutus -quipu -creeping zinnia -orange milkwort -tabard -Australopithecus africanus -melancholy thistle -insole -courser -darkroom -surface-to-air missile system -bark-louse -Confederate -neritina -clip-on -spouter -trench knife -outside caliper -dhak -Limburger -chuck wagon -buttercup squash -shirtdress -pouter pigeon -dirty old man -zodiac -fennel flower -mother figure -appointment -Manichaean -lignum -bouffant -rum sling -Ravenna grass -hibachi -gin rickey -American harvest mouse -cocozelle -western wheatgrass -black crappie -rhombus -Missouri goldenrod -barndoor -wild mango -pneumococcus -Boston lettuce -ratline -desert holly -cobweb -fluoroscope -ethnologist -tor -bullshot -stockade -greave -rock sea bass -slip-joint pliers -taxi dancer -schizophrenic -zill -creme de menthe -orange-blossom orchid -divot -supplejack -busybody -casemaking clothes moth -ramrod -gearbox -birdcall -Wiffle -thwart -beauty consultant -chicken paprika -trawl -skep -spirometer -hopper -kvass -doggie bag -bath chair -showy daisy -wild tamarind -Tarsius syrichta -glyptics -Algerian -cargo area -bunk -Velveeta -iconoclast -clinch -New Caledonian yew -false mallow -Japanese tree lilac -convex polyhedron -water boatman -cruise missile -finisher -colonoscope -cumin -wickiup -saccharin -whipcord -trailer camp -eryngo -cuckold -yam bean -fighting chair -forewoman -galingale -citron -positivist -four-lined plant bug -suet pudding -field pea -Circaea lutetiana -deer grass -trap-door spider -common corn salad -mirror carp -sounder -second-in-command -seaside alder -burgoo -ming tree -curry sauce -courbaril -green alder -figure loom -fauld -halfbeak -squelch circuit -cladode -winter cress -tongue and groove joint -dwarf dandelion -joss house -western buttercup -welted thistle -potato tree -anglewing -cookfire -marzipan -hood latch -seed shrimp -common moonseed -toasting fork -bevel -three-quarter binding -midwife toad -stage director -Pentecostal -technical sergeant -golden-beard penstemon -drunk -silky oak -corn gluten feed -T-square -stoker -selling agent -cruse -server -rope-a-dope -bicorn -matzo meal -wide wale -roadblock -false foxglove -tuck box -bandsman -smoke bush -machinist's vise -Highlander -scholiast -self-starter -Swedish rye bread -spark transmitter -maverick -maquiladora -cabinetmaker -compress -rainbow shower -huntsman's horn -mackinaw -copper rockfish -lappet -nitrate bacterium -telephone plug -soutache -Dacron -toboggan -sissoo -yogi -laurel-tree -vice chancellor -Christ's-thorn -cartridge fuse -serial port -quassia -tarweed -pecopteris -beggarweed -anchovy pear -bookbindery -woodland oxeye -toad rush -sandalwood tree -marsh andromeda -Tyrian purple -boothose -tragedienne -fragrant cliff fern -festoon -bondwoman -melancholic -butternut squash -exhaust valve -semi-skimmed milk -glowworm -Virginia oyster -Identikit -ayah -gallows tree -Carioca -monoplane -jewels-of-opar -scallop -moth miller -marsh cress -lobed spleenwort -ricotta -emitter -arame -tub gurnard -army attache -maniac -organizer -pheasant's-eye -Melba toast -homeboy -Bavarian cream -Maximilian's sunflower -backstop -Tremella foliacea -yellow avens -spreading fleabane -plumb level -false rue anemone -zabaglione -climbing maidenhair -doeskin -walking shoe -lancewood -material -jacksnipe -South American poison toad -agonist -hinny -paper mill -psychophysicist -valley girl -toast mistress -jorum -tiler -chicken Tetrazzini -trivet -grasshopper -three-mile limit -kink -kiang -pole horse -jig -Cornish heath -hedge thorn -false alumroot -Popper -remount -photojournalist -sideroblast -stonecress -Agave tequilana -Japanese lilac -hawse -maenad -air bag -leaf spring -dwarf willow -soda cracker -contralto -moleskin -pilaster -Audubon's caracara -pia -American organ -bleu cheese dressing -betel palm -PC board -almond willow -socializer -tone arm -stammerer -free-liver -scaler -Gentianopsis crinita -leak -black haw -hound's-tongue -grass pea -Stassano furnace -coralbells -ministrant -perihelion -Luxemburger -powder-post termite -arboreal salamander -cushion flower -foramen magnum -pyrethrum -poacher -woolly mammoth -horned chameleon -tearaway -father-figure -tufted gentian -salmi -finger millet -physa -registrar -polyoma -bamboo shoot -matchlock -seine -congress boot -bulgur pilaf -monosodium glutamate -Kentucky wonder -mycologist -kedgeree -ragweed pollen -boarfish -yellow pimpernel -tan -northern Jacob's ladder -macrobiotic diet -migrant shrike -big-cone spruce -colonialist -white dogtooth violet -bath asparagus -webbing clothes moth -ladies' room -experimenter -prairie bird's-foot trefoil -bootleg -cognitive neuroscientist -fire chief -flagfish -dendrite -stinking goosefoot -fore edge -hogfish -Spanish cedar -hotel-casino -Tory -life-support system -pea flour -cash bar -Chenin blanc -white-footed mouse -Canada garlic -salt-rising bread -roomette -mastodon -bell founder -long iron -bi-fold door -fig-bird -European water shrew -dyer's weed -frog orchid -allosaur -Florida yew -wild potato vine -crape fern -flat-topped white aster -klebsiella -oil heater -waxmallow -enjoyer -mesocarp -semidesert -senior vice president -coccidium -burrawong -syllabub -jump suit -harrier -leaf roller -cherrystone -cinchona tree -touring car -eulogist -air force officer -red goosefoot -cat thyme -smoothbore -slugger -cardiac monitor -cobber -blister rust -musicologist -rolled biscuit -Braun's holly fern -hog plum -nonpasserine bird -pascal celery -damson -Jonathan -Sheraton -cohune palm -egg white -baton -sixth-former -Siberian pea tree -choanocyte -wineskin -auditor -detention home -Leichtlin's camas -Chartreuse -clusia -club car -wattle and daub -security blanket -common American shad -assistant professor -marsh pea -camomile tea -gopher hole -gravure -Freudian -spirillum -maharani -equilateral -crow garlic -mammee apple -felwort -hardtop -dillenia -curlycup gumweed -pilot engine -calcimine -wooly lip fern -bitter dock -wineberry -jumper -monolingual -spinning frame -old-timer -native cat -diving petrel -sodium-vapor lamp -marchand de vin -sexton -matelote -interior designer -windfall -mole salamander -minder -bodkin -neutron bomb -Caloscypha fulgens -slinger ring -mezzo-soprano -aura -Southern Baptist -viscacha -midfield -tie -prosthetist -round-headed leek -yellow mariposa tulip -canary grass -staddle -Tokay -Muenster -brazil nut -California black walnut -applesauce -penologist -virgin's bower -tenon -steward -Jerusalem oak -red-bellied snake -bindery -scow -fluid flywheel -bullhead -satinleaf -clove -double glazing -matron -wild parsnip -winged elm -shoot-'em-up -musk deer -white rust -lock -Cornishman -Vidalia onion -corn spurry -freeloader -justice of the peace -inlay -myxobacteria -tiglon -tangram -German ivy -scented fern -woolly daisy -caretaker -gastroscope -scuppernong -spotted sunfish -guilloche -codling -wormcast -Eskimo curlew -tayra -European fly honeysuckle -septuagenarian -third gear -coatee -red alder -water ice -cubitiere -frame buffer -gamboge tree -pernyi moth -chicken Marengo -Galliano -Lincoln -true sago palm -hunter's sauce -carpet beater -alpine goldenrod -arch support -vehicle-borne transmission -jilt -paternoster -redcap -Siberian larch -hoary plantain -swan's down -chicane -reverse -divan -kneeler -alexic -mock turtle soup -daffodil garlic -mission bells -squilla -ursinia -winter's bark -trifoliate orange -discina -frijole -Swiss steak -maildrop -knotgrass -dog fennel -drum sander -heroin addict -costume -camber arch -shining willow -lutefisk -red porgy -microfossil -good old boy -angle bracket -pitcher sage -bordelaise -heat exchanger -carrion -bush jacket -fanjet -coach -blackface -sicklepod -Manhattan clam chowder -daisywheel printer -olive -Sphacelotheca -Spanish needles -brown root rot fungus -boudoir -encyclopedist -V-8 juice -red haw -brass buttons -gym suit -skywalk -water wagon -gas-turbine ship -stoup -lisle -sailor suit -box beam -balm of gilead -housemaster -hayrack -neutralist -water elm -brook thistle -doyenne -nark -alpha-tocopheral -WASP -hydrilla -water-shield -footlocker -variola major -pargeting -ion engine -yellow globe lily -Malecite -bloodleaf -yellow sand verbena -whorled loosestrife -packinghouse -Carolina parakeet -Virginia waterleaf -armband -red rockfish -factory ship -moon trefoil -jump seat -water gillyflower -yerba mansa -chamfer bit -compass saw -hopsacking -Indian rhododendron -sickbed -treacle -honey eater -mailsorter -seabeach sandwort -sob sister -primrose jasmine -prince consort -elocutionist -wishing cap -runner -trestle -sugar water -half-and-half dressing -fringed poppy mallow -portiere -bung -swan orchid -weather satellite -beef broth -marblewood -sapper -agitator -wren-tit -grade -allspice tree -spacewalker -American hornbeam -sieva bean -dill seed -potoroo -love-in-winter -alembic -Cheshire cheese -small white aster -Oregonian -flipper -twill -differential gear -Prince Albert -licorice -foster-father -Melkite -portraitist -Yosemite toad -Cox's Orange Pippin -slender wheatgrass -knob -silique -Rocky Mountain bee plant -stirrup pump -chicken hawk -sweetbrier -Sierra lodgepole pine -poulette -biohazard suit -striated muscle cell -Geiger counter -World Wide Web -turmeric -prairie wake-robin -latchet -pushball -grill -shooting lodge -floating-moss -refried beans -boojum tree -red poll -toothbrush tree -rabbiteye blueberry -red haw -sweet vetch -delta -upland cotton -ballet mistress -padrone -complementary color -great Solomon's-seal -bud brush -brandy sling -spinster -Andorran -Mojave aster -mackinaw -golden calla -bottom rot fungus -segmental arch -periwinkle -hellion -topknot -copper -Mexican hyssop -weeping love grass -point woman -pathogen -fall cankerworm -common shiner -silverspot -corer -atomic pile -crystal detector -yellow spot fungus -truncated cone -saprobe -variegated horsetail -Cro-magnon -cercaria -aglet -pollster -oyster bed -pancake turner -egg cream -sporozoite -quirk molding -mutisia -sound bow -physic nut -sugar-bush -cow -magnetron -jungle hen -brassie -rock bit -taco sauce -seeded raisin -desert selaginella -folding door -vinegarroon -Pinot blanc -rye -ellipsoid -betel nut -tree of knowledge -ambrosia -long tom -breechloader -bicolor lespediza -cosmetician -monoblast -American oil palm -prancer -farina -caiman lizard -hardball -bullock's heart -cotton rat -whiting -weather ship -sharecropper -creamcups -gas bracket -divinity -ornithologist -yellow twining snapdragon -showy goldenrod -end man -heptagon -sand dropseed -round file -guama -blue elder -sand spurry -raccoon dog -zigzag goldenrod -fast reactor -arctic willow -cyclopean masonry -punter -sgraffito -slattern -storage ring -clipper -pulasan -short-tailed shrew -scammony -daybook -umbrella tree -coloring -element of a cone -gesneriad -cane -burgoo -western coral snake -friendship plant -Leydig cell -scrutineer -hairy golden aster -inclined fault -water milfoil -bryozoan -nardoo -native pomegranate -curly grass -Florence fennel -resurrection plant -ice water -crown -ploughman's lunch -clustered lady's slipper -kitchenette -sand sedge -pouched mouse -roadbed -parsley haw -predecessor -super heavyweight -seedless raisin -mailbag -sparling -codling moth -squama -Bercy -thermoelectric thermometer -Jaculus jaculus -saltpan -firmer chisel -round whitefish -ramrod -criollo -pinch bar -slash pocket -thigh pad -velvet plant -intergalactic space -brazilian ironwood -whaleboat -sirrah -hanging fly -aspirator -Dominican -dribbler -yellow-eyed grass -Cornish -geophysicist -tarmacadam -marchioness -rattlesnake orchid -Alaska Native -ilama -myrrh tree -zucchini -licorice root -nosebag -lounger -troposphere -virginal -spaghetti Western -Virgin Mary -waterwheel plant -dry nurse -enate -carpet shark -rijsttaffel -stuffing nut -caraway seed bread -Leotia lubrica -kaffiyeh -Boston baked beans -halophyte -backscratcher -instillator -trefoil arch -pip -digitizer -dosemeter -Carolinian -French sorrel -boards -historian -rangpur -clansman -goral -leatherjacket -coiner -fleece -white globe lily -storm cellar -roundhouse -mediatrix -butterfly flower -swamp gum -prairie vole -rhizomatous begonia -common tobacco -Marco Polo sheep -subarachnoid space -broomweed -safety net -silky wisteria -swagger stick -spectacled caiman -derris root -soap pad -chop-suey greens -summer hyacinth -palo santo -carbohydrate loading -chinch bug -roadman -sheep plant -messiah -desk officer -banquette -drugget -trumpet arch -great duckweed -purdah -heartbreaker -hasty pudding -alligator weed -dragee -yellow bristlegrass -Jacob's ladder -campstool -coffee fern -sweet fern -little chief hare -cat-o'-nine-tails -rep -American red elder -divorcee -black salsify -cambric -sennit -Canada ginger -wonderer -Formica -cream-colored courser -zooid -European beggar-ticks -sorrel tree -piddock -blolly -red-flowered silky oak -bay -Hooker's onion -dark horse -cone clutch -Roman hyacinth -paintbox -mestiza -green alder -bill -panicled aster -mammogram -snuffbox fern -Rediffusion -swamp fly honeysuckle -stoup -psychiatrist -nodding groundsel -student union -cold duck -bee beetle -playbox -Psychopsis krameriana -nosh-up -earthnut -narthex -single-rotor helicopter -revetment -sweetleaf -seasoned salt -piculet -speckled alder -mackerel scad -common yellowwood -devisee -static tube -Spanish heath -umbrella plant -fucoid -Chilean -coral-root bittercress -fanatic -cachou -agony aunt -bird's-foot fern -washwoman -torchbearer -placoderm -frosted bat -spicemill -Cape lobster -hard-shell crab -colonizer -camphor daisy -friar's-cowl -false tamarisk -toggle joint -tinsmith -theorist -hydrologist -loganberry -universal donor -northern whiting -tent-caterpillar moth -russet -kangaroo mouse -African scented mahogany -bastinado -breast implant -betel -grade separation -vox humana -stodge -Maryland chicken -Anguillan -oil pump -governor's plum -narcissist -deadwood -private citizen -winker -ropewalker -gidgee -Lothario -ski resort -major-domo -von Neumann machine -belaying pin -water parsnip -Fissipedia -luggage carrier -spring water -oyster stew -kohl -celesta -date-nut bread -punchboard -sunniness -hospital train -man -rack and pinion -mixer -pousse-cafe -narrow goldenrod -Maxim gun -stiff -recruiting-sergeant -watch glass -white hellebore -tung tree -prairie white-fringed orchid -beef Stroganoff -scoffer -grassy death camas -Shawnee cake -tapioca -Short's aster -banker -laparoscope -honeyflower -Caterpillar -electric clock -baling wire -huntress -Surinam toad -art school -incurable -Canton crepe -apple juice -hipline -bronchoscope -marshmallow fluff -Texan -wild fig -sawed-off shotgun -forestay -red kauri -fish slice -Egyptian grass -English walnut -brown sauce -ogee arch -nectary -chambray -leather flower -phloem -Persian violet -bomb calorimeter -western narrow-mouthed toad -soup du jour -sickle alfalfa -caracolito -periscope -coralberry -sword bean -sigmoidoscope -water locust -hygrodeik -sycamore -sheikdom -ballistocardiograph -clove -akee -fucoid -jacquard -cat's-ear -puritan -slender wild oat -smooth softshell -purchasing agent -landing craft -chartist -lace bug -sharksucker -Virginia chain fern -horseradish -namer -ripcord -personage -aspirin powder -puku -Wankel engine -nightcap -velvet bent -roridula -cytogeneticist -olm -almond extract -common heath -fringe-toed lizard -Kentucky yellowwood -lithosphere -cramp -bulgur -scurvy grass -officer's mess -frigate -electroscope -giant chinkapin -opah -rutabaga -wood hoopoe -Farley maidenhair -shingle tree -argentine -router -palm nut -quillwort -hiba arborvitae -runcible spoon -hireling -sickbay -alpine totara -white lupine -Cotoneaster horizontalis -desert plume -staghound -Sea Scout -opalescence -enophile -Jersey elm -coal house -Helvella acetabulum -selenium cell -white camas -creole-fish -auger -fragrant agrimony -research center -achromia -shank -cottonseed -mod con -extension -sugar beet -winter flounder -silky dogwood -strop -tokamak -rabbit ears -baby farmer -fireman's ax -serration -taproot -socket wrench -action officer -Chilean jasmine -Greek fire -stem-winder -body louse -lumpsucker -stink bomb -American lady crab -dicer -lie detector -maneuverer -black-headed snake -tiger moth -shooting stick -spermatid -babushka -deaconess -home -prior -chanfron -chickasaw plum -big-eared bat -rusty woodsia -tertigravida -miniver -combretum -habit -bluehead -angled loofah -gipsywort -fire-on-the-mountain -purple milk vetch -alpine gold -merozoite -loddon pondweed -Uniat -provost marshal -Gyromitra fastigiata -Coigue -proconsul -oarfish -San Jose scale -filature -chimney plant -spiny softshell -bluecoat -live axle -river limpet -clever Dick -pink bollworm -Japanese plum -roarer -caricature plant -wardroom -Texas chachalaca -Bahia grass -Moreton Bay tulipwood -accessory fruit -pearl barley -ashcake -bunt -Polynesian tattler -pine fern -laughing owl -potato fern -speaking trumpet -adjoining room -bearing rein -banana quit -redbrick university -Scleroderma bovista -magdalen -pressurized water reactor -advisee -NIMBY -poorwill -almond moth -comedian -star tulip -cracked wheat -water pump -guest of honor -yellow-breasted bunting -hire -pedate leaf -augur -purple locoweed -Socinian -upland white aster -guesthouse -double reed -detention basin -rollmops -hitch -bodega -mayeng -sparkplug wrench -attack dog -peach melba -heliozoan -tower mustard -blue mold fungus -lamplighter -banded sand snake -smooth crabgrass -elsholtzia -bodkin -Aegean island -bag lady -alewife -arcella -electrical contact -common ax -animist -concave polyhedron -coalface -climbing perch -yellowtail -hobble skirt -marquee -Russian dandelion -snow mushroom -polo ball -NADA daiquiri -cormous plant -chaparral mallow -inside caliper -milking stool -fallout shelter -sea gooseberry -Danish blue -grissino -chimney breast -mosquito fern -soundbox -spring chicken -epauliere -cape forget-me-not -japan -saddle oyster -white fritillary -push-button radio -bladder senna -bladder stone -macedoine -moire -Shawnee -starnose mole -douroucouli -horseradish sauce -electron gun -cotter -console -park commissioner -free press -lump sugar -western poison oak -apple maggot -keurboom -lisper -griffon -burin -horseshoe whipsnake -Jacobean lily -spinner -cochineal insect -emesis basin -sowbane -humanitarian -uakari -three-dimensional radar -wild hollyhock -heartseed -swinger -two-by-four -mop handle -common amsinckia -traitress -rush aster -fibrous-rooted begonia -violet-flowered petunia -milliammeter -alidade -azure aster -celery seed -snorer -scarlet plume -obtuse leaf -heathen -rose chestnut -headrace -dwarf buckeye -Pacific tripletail -wiggler -bounty hunter -Lowlander -slate pencil -typist -syconium -vaquita -skybox -business lunch -gusher -curacao -palometa -Diapsida -light diet -sourdine -thorny amaranth -potato fern -cartridge extractor -peshmerga -chaffweed -tahoka daisy -hematologist -massage parlor -diverging lens -breadroot -papyrus -amarelle -cover plate -hubbard squash -cryptomonad -whitetail prairie dog -rabbit burrow -orthochromatic film -goncalo alves -Chile bonito -tent-caterpillar moth -Manila grass -buck sergeant -mustard seed -crested wheatgrass -wise guy -asarabacca -field pea -bite plate -barbasco -heart-lung machine -mouse-eared bat -piping guan -gun pendulum -climbing onion -fungus gnat -Livonian -one-hitter -Chilean firebush -Sonoran whipsnake -round scad -myelogram -Rhodes grass -vomitory -roble beech -South-African yellowwood -molasses -Velcro -common calamint -radiation pyrometer -sketcher -chaparral pea -coffee stall -Australian nettle -bilimbi -Khedive -visionary -field spaniel -devilwood -collimator -Siberian spruce -sling -limestone salamander -ribbon worm -hazel -petter -coolant system -artillery plant -bailiff -chameleon tree frog -microsporophyll -maiden blue-eyed Mary -Drosophyllum lusitanicum -cocozelle -king post -nailer -knobkerrie -tovarich -Intelnet -worm lizard -drop forge -wool grass -brown bullhead -anthropoid -vitamin A2 -creche -hickory nut -whiffletree -deipnosophist -Muskhogean -masochist -hypsometer -gliricidia -complexifier -wild licorice -reconnaissance vehicle -fives -beefsteak plant -eastern dasyure -bookworm -crested coral root -wire recorder -cinnamon vine -bubble -Newfoundland dwarf birch -spruce bark beetle -teetotaler -fad diet -ascus -spicebush -African coral snake -soft-shell crab -Postum -packhorse -sand cherry -cricket-bat willow -middlebrow -Hungarian sauce -buffalo clover -jimsonweed -latanier -stablemate -jumper -zoospore -smooth woodsia -flowering ash -unilateralist -lomatia -flapper -wild cotton -Siberian wall flower -probe -bankrupt -blockade -lemon geranium -fig leaf -basic point defense missile system -clack valve -buttinsky -ingenue -mountain everlasting -zebra-tailed lizard -shaving-brush tree -evergreen huckleberry -core drill -lugworm -Cashmere goat -doorjamb -minelayer -student center -horsehair -European dewberry -white broom -arenavirus -eastern poison oak -rye ergot -Tupi -tensiometer -fleawort -coquille -icing sugar -junior lightweight -Doppler radar -mahuang -candlepin -chambermaid -evergreen blueberry -Eton jacket -parvis -solleret -molded salad -malvasia -birth-control campaigner -nonagon -backswimmer -ogee -bowstring -salt marsh mallow -trapezohedron -hoary willow -speech therapist -Zinjanthropus -core -red-backed mouse -eptatretus -mossy saxifrage -Aristotelian -Thessalonian -searing iron -bifocals -falangist -field pea -packsaddle -lay reader -hoecake -cuboid -white maire -iceman -lobscouse -neckcloth -color-blind person -Chinese holly -assemblyman -white-lipped peccary -kava -plastron -crab louse -hook wrench -trailing four o'clock -junior -skilly -internet -tonguefish -footman -sub-assembly -evangelist -track -bench lathe -desk clerk -scalded milk -chamois cloth -American marten -chachka -nondescript -pellitory-of-the-wall -swamp candles -procurator -cuddy -farkleberry -mountain male fern -trawl -dual scan display -fish meal -prospector -convener -guano bat -ant shrike -picture rail -sand rat -gynophore -quilting -sleeper -summer savory -Cotoneaster dammeri -smooth sumac -slumgullion -suite -catalufa -spherule -lean-to tent -gryphon -gas shell -short iron -sweet sultan -dewberry -Victoria plum -American water shrew -X-ray tube -macebearer -green arrow arum -abbe -poke milkweed -atheist -Fosbury flop -Ord kangaroo rat -moldboard -wheat germ -explosive trace detection -whippoorwill -examiner -tallyman -Crookes tube -wild peach -fringed grass of Parnassus -Crookes radiometer -Atlantic croaker -lobster stew -spring cress -maggot -pacer -hydra -Zionist -pepper tree -diamante -baize -Rhodesian man -county agent -respecter -Anglican -antimacassar -materialist -Swan River everlasting -cloud grass -toll line -C battery -chinese mustard -grass poly -warming pan -seasonal worker -common sickle pine -bathysphere -elegant Habenaria -card table -Chilean cedar -brocket -collimator -malted milk -avadavat -fire marshall -coloratura -yellow spiny daisy -fingerstall -narrow-leaf penstemon -indigo broom -pillwort -bearberry willow -Etonian -certified milk -climbing bird's nest fern -field coil -wrist pad -parr -kaoliang -engelmannia -stocker -satrap -Nantua -spearfish -caper tree -gold-tail moth -mountain chinchilla -sea milkwort -westerner -army cutworm -leaf-nosed snake -neurobiologist -xeranthemum -Eastern silvery aster -ecclesiastical attire -caper -Ukranian -bight -button fern -peach pit -oligodendrocyte -maar -digitigrade mammal -streptobacillus -sensitometer -preemptor -oat -bell foundry -crown lens -rock purslane -Junior -Brazilian guava -kicksorter -Ohio goldenrod -red mulberry -King's Counsel -mountain four o'clock -fairy shrimp -fell -oca -sycophant -chantry -dermatoglyphic -bomblet -keyhole saw -hangman's rope -little barley -lion-jaw forceps -giant scrambling fern -popper -dulcimer -Espagnole -tardigrade -smooth-haired fox terrier -bullbrier -rewa-rewa -Japanese poinsettia -trunk line -cannery -helminth -American spikenard -prince's-feather -arthroscope -ginger -aphakic -pilot bit -angle of refraction -low-sodium diet -wall creeper -growler -praetorium -Hall of Fame -soupfin shark -Molotov cocktail -kaffir boom -stitcher -sawwort -flagellant -Atlantic herring -Reticulitermes lucifugus -voltaic pile -snowy orchid -southern flounder -skysail -osage orange -white mullein -lined snake -tolu tree -poliovirus -foreman -burette -jackass bat -invigilator -electromyograph -acarus -presence chamber -columbian mammoth -hyacinth bean -pilot -meadow jumping mouse -Maria -outskirts -aftershaft -Queensland nut -schlockmeister -plainsman -afropavo -scarlet musk flower -five spice powder -gunboat -multiplex -Dutch uncle -louvered window -chimney corner -cuscus -psalmist -Vichy water -signer -amphiuma -harmonizer -authorizer -naiad -control rod -stentor -mountain bladder fern -gig -read-only memory chip -assenter -vixen -hermitage -corn dab -locksmith -cockspur thorn -variable-pitch propeller -western red-backed salamander -dolman sleeve -cultist -sweet buckeye -pine vole -Peking man -mountain swamp gum -nimblewill -bethel -aye-aye -lancelet -teff -Alpine celery pine -endive -nipa palm -center of curvature -seeder -Sabahan -sea scallop -social secretary -gorgonzola -western chokecherry -misanthrope -rabbitweed -beggarman -button fern -white mallee -doodia -mastiff bat -roper -prima donna -blanc -holding pen -fingerling -skyhook -flophouse -steam chest -crystallized ginger -acrocarp -horse pistol -true mahogany -costmary -ballistic galvanometer -jaunting car -bartonia -rep -mandibular notch -bubble and squeak -umpire -fringed loosestrife -bear oak -ski jump -staggerbush -plumcot -thermal reactor -field brome -bodkin -jackknife-fish -malope -writing arm -gold fern -Stayman Winesap -merlon -eclectic -fluxmeter -emeritus -imam -drum -pop tent -capital ship -subalpine larch -flail -Lorenzo dressing -tomboy -eastern woodrat -warrantee -Pacific spiny dogfish -sheepshead porgy -farthingale -Cryptoprocta -power loom -communicant -howdah -ectomorph -false foxglove -basset horn -odd-pinnate leaf -Wisconsin weeping willow -Queensland bottletree -dampener -corbel arch -silent butler -Circe -town clerk -Japanese chestnut -bloodwood tree -switcher -cup hook -spreader -rice rat -straightedge -traverser -fluid drive -Spanish paprika -sour milk -poison camas -bean dip -card table -vinegar fly -vizier -electric-discharge lamp -purple rock brake -dynamo -Japanese snowbell -Grindelia robusta -neuroglia -safflower seed -coronet -frown line -Renaissance man -Steller's sea cow -book scorpion -isosceles triangle -arthritic -spherical triangle -kangaroo mouse -garden orache -stemless hymenoxys -titi -out-basket -gent -columnea -mint sauce -mouthbreeder -Liebig condenser -cheerer -assegai -stickler -Merostomata -dimmer -grey poplar -common heath -scorzonera -glory hole -Blackfoot -oil slick -musketeer -apple geranium -daisyleaf grape fern -gas furnace -bijugate leaf -Arabist -star-thistle -hand throttle -huckleberry oak -lift pump -maulstick -Rome Beauty -Newburg sauce -pit -volunteer -Baldwin -ark -Asian horseshoe crab -black calla -marlinespike -Gentianopsid procera -guinea gold vine -tucker-bag -desk sergeant -piezometer -migrator -keelson -executrix -sackcloth -onion smut -buckboard -substitute -pudge -mess -cinchona -intervenor -gravimeter -pederast -censor -gastroenterologist -cutlassfish -launch -demerara -Diegueno -bog bilberry -aglet -soda fountain -crank call -harpoon gun -ribbon fern -Gurkha -output device -epilating wax -greasewood -water horehound -return key -fairy swallow -spatulate leaf -culverin -leptocephalus -kleptomaniac -barley water -bleeding tooth -Cheyenne -maleberry -limber -tapenade -whorled aster -toe -revenant -lap joint -vein -truant -florest's cineraria -morning dress -trichodesmium -nightshirt -element of a cylinder -shopaholic -section hand -electrodynamometer -Guadalupe cypress -rosebud -racist -avaram -keeled garlic -Alaska rein orchid -orange toast -cunner -dipstick -Neolentinus ponderosus -bulbil -charlotte -pull-through -header -Manduca quinquemaculata -persona grata -elegist -cafe royale -scup -semanticist -wood sage -field magnet -tundra -bay myrtle -alluvial flat -arrowleaf groundsel -celtuce -baryon -must -entrant -othonna -pied-a-terre -liza -sticky aster -grasshopper mouse -prison guard -tire iron -bomb rack -Spanish American -sheltered workshop -turfing daisy -backbone -tangle orchid -creeping willow -dumb bomb -horse cassia -barosaur -Yavapai -shrimp Newburg -peanut worm -dwarf chinkapin oak -corchorus -brick cheese -by-catch -stover -Urnula craterium -clasp -Kekchi -alpine coltsfoot -soybean future -altar wine -ripping chisel -encephalogram -mountain spleenwort -transferee -remoulade sauce -American rock brake -stenographer -read/write head -loblolly -ground -powdered mustard -brake band -sea dahlia -freak -proconsul -Coffey still -Sivapithecus -pellitory -palm cat -skew arch -American angelica tree -vigilante -candelilla -andryala -amarelle -swiftlet -petcock -associate professor -sclerite -open circuit -Virginia crownbeard -Last Supper -button tree -scyphozoan -margate -mercury cell -horsewhip -water scorpion -companionway -drop cloth -Amhara -miraculous food -pro-lifer -embryologist -Creole -bombazine -Indian blackwood -cubeb -trace detector -gros point -main-topsail -meringue kiss -spree killer -capstone -specimen bottle -woolly apple aphid -silverweed -American barberry -gallfly -European bog asphodel -northern flying squirrel -alliterator -Old Catholic -heliograph -Pteris cretica -tippler -pump well -allspice -balancer -scarlet bugler -lantern fly -white prairie aster -krummhorn -robin's plantain -Pacific sardine -patty-pan -decaffeinated coffee -western saxifrage -warrantee -colorimeter -ball bearing -makomako -foot -troika -apricot sauce -data multiplexer -rose-root -sound film -Northern dewberry -water hickory -swing door -spastic -Oligoporus leucospongia -botulinus -tamale pie -Sagittarius -muff -spicebush -petiolule -pump action -Parry's pinyon -split-pea -rudder blade -princess royal -wormseed mustard -honey guide -pip-squeak -fin keel -foretop -cyrilla -Navaho -melanocyte -deist -silver tree -citrus whitefly -Morrow's honeysuckle -green peach aphid -longanberry -call-board -wild yam -novelist -toothed spurge -alienee -pond apple -allspice -Carolina lupine -Jack of all trades -white false indigo -boiled dinner -princewood -sailor's-choice -false bracken -microbrewery -black grama -tutee -brickkiln -sea raven -guesser -wirework -European lemming -thyrse -plains lemon monarda -milo -shunt -spotted cowbane -anchovy sauce -grande dame -Maryland golden aster -Chinese puzzle -boarfish -burweed marsh elder -defense contractor -nitric bacteria -Belgian hare -beach plum -conformal projection -sand fly -steering linkage -quickset -Mahayanist -Geiger tube -loudmouth -Lancastrian -brownie mix -ex-spouse -deltoid leaf -Shasta salamander -rabbet joint -purple anise -garibaldi -gebang palm -bladderpod -Host -great bowerbird -string cheese -spinning jenny -drift net -matriarch -guar -bitter betch -panda car -mess -plains pocket mouse -scarlet wisteria tree -deerberry -reamer -homing torpedo -molehill -stockyard -reniform leaf -rag -symmetry -Texas star -lerot -pickle relish -three-seeded mercury -cotter pin -ice-cream bean -farmyard -bar magnet -hansom -prickle cell -renal cortex -pest -Ultrasuede -sailing master -brougham -wastrel -amboina pine -Canary Island hare's foot fern -ninepin ball -southwestern lip fern -usherette -lemon drop -star begonia -weeds -saltworks -Persian melon -corbina -medusa -bucksaw -Gibson girl -diameter -American twinflower -kino -clear liquid diet -angiocardiogram -wetter -oyster cracker -yellowfin mojarra -wild parsley -life tenant -broom closet -Corynebacterium diphtheriae -square shooter -bedwetter -ball-and-socket joint -nonsolid color -Salmonella typhimurium -buffel grass -hip pad -subaltern -heliothis moth -trail boss -hayloft -Francisella -primordial dwarf -cock-a-leekie -sugarplum -propulsion system -tyrolean -Carib -salai -ketembilla -ironclad -cornhusk -heckler -multistage rocket -north island edelweiss -Chaldean -twenty-two pistol -Francophobe -scofflaw -sickle feather -screw bean -sea squill -Scopolia carniolica -agglomerator -western holly fern -presenter -straight pin -Myxine glutinosa -Colbert -clover-leaf roll -war paint -bird's-eye bush -longfin mako -running suit -arrow wood -margrave -blue fleabane -dracontium -plastron -chimney swift -child prodigy -commissar -turtle soup -postulant -archaebacteria -snakefly -Pitot tube -chap -smilo -Malthusian -French roof -worm wheel -gulag -pointed-leaf maple -pull-off -Cathaya -American green toad -ball cartridge -infiltrator -snowfield -crotchet -auxiliary pump -bearnaise -galax -chaenactis -olympic salamander -sundowner -cows' milk -beach plum -moss-trooper -Arabidopsis thaliana -cat's-claw -bog rosemary -ribier -book agent -bumper jack -beefwood -monk's cloth -alpine bearberry -climbing fumitory -cucking stool -puka -Piltdown man -property man -discharge lamp -X chromosome -knobble -lobster Newburg -herbalist -sunray -golden saxifrage -leopard cat -muffle -stonewort -blancmange -intraocular lens -trepan -desert mariposa tulip -plume poppy -Dane -martynia -shaver -white milkweed -napu -tansy-leaved rocket -abortus -telemeter -tansy mustard -harpy -honeysuckle -ironworks -testacean -Tartuffe -silvervine -Sihasapa -surface gauge -western blind snake -paramyxovirus -Icelander -bird louse -stockbroker belt -test-tube baby -ague root -little golden zinnia -dietician -elephant's-foot -dirty bomb -sailing warship -brier -tinter -Connemara heath -potato fungus -bait casting -decagon -rosefish -die -high-pass filter -solitaire -widow's walk -goldthread -Tudor -trews -orange pekoe -ninon -soda jerk -sump -flying carpet -burial garment -oblanceolate leaf -press gallery -Shintoist -three-centered arch -spreading pogonia -Moro -foxtail orchid -Ghanian -dry kiln -thane -naranjilla -bitter pea -American bugbane -apron string -oyster fish -Port Jackson fig -prize winner -high-water mark -Oneida -smoking room -potato skin -charge d'affaires -gantlet -amyloid plaque -barmbrack -mate -arrow leaved aster -handbarrow -horned screamer -virago -linoleum knife -rattlesnake root -K ration -reset -foot brake -red coral -good guy -aberrant -lavalava -poleax -garden webworm -sneezer -mountain heath -American dog violet -eolith -chimneysweeper -matriarch -smalltooth sawfish -sea mouse -tubercle bacillus -superconducting supercollider -Abney level -darnel -gherkin -celery salt -Tungus -pulasan -oriflamme -death camp -redhorse -apprehender -scion -selectwoman -pentahedron -principal -old school tie -slice bar -chanar -pimento butter -wailer -zero -mescal -rosebud orchid -stone bramble -Jarvik heart -NOC -pitchman -rat cheese -strawberry tomato -dwarf golden chinkapin -landau -tocsin -ampulla -scratcher -crab Louis -ginseng -ripcord -polluter -tensiometer -eyewitness -aalii -Oregon crab apple -conservator -day jessamine -hexahedron -suture -tippet -linsey-woolsey -vernal witch hazel -stainer -egocentric -canistel -nudger -shipping agent -shortleaf pine -battle sight -cheese spread -weeder -incendiary bomb -honeyflower -stovepipe iron -stepper -hellgrammiate -votary -aflatoxin -arquebus -impulse turbine -pipewort -garrote -glow lamp -pigsticking -blood clam -surface search radar -Bolshevik -platen -chariot -Gentianopsis thermalis -water level -quandong -catalytic cracker -giant foxtail -nut butter -drainplug -holdover -coastguardsman -Secretary of Health and Human Services -Seeing Eye dog -American plaice -coquilles Saint-Jacques -christella -medium -clingfish -lally -light-o'-love -Gentianopsis detonsa -taper file -signal detection -trip wire -lignosae -receiver -sedan -mud puppy -corn sugar -Philippine mahogany -magnetic pole -jointed rush -trapper's tea -Dorking -welcome wagon -clammyweed -guard -false azalea -convalescent -babassu -dedicated file server -colossus -air search radar -marquess -straight flute -sand stargazer -sea catfish -rosilla -ripsaw -Bermuda onion -peach sauce -sagebrush mariposa tulip -yashmak -Virginia mallow -erose leaf -sand blackberry -boulevardier -forester -choragus -onion mildew -threadfin -winged pea -sugar daddy -rotary press -styracosaur -rathskeller -Japanese millet -anchorite -coral drops -false gavial -eastern pipistrel -cheese press -Chinese primrose -pamperer -real estate broker -power worker -breeder reactor -nutcracker -piano wire -cushaw -Sinanthropus -firebreak -kelp greenling -herba impia -toll call -yoke -bird fancier -evening-snow -fever tree -reed meadow grass -flanker back -toggle bolt -Santa Cruz cypress -carbonnade flamande -northern dune tansy -mikado -millettia -forty-five -court -icepick -holm oak -Japanese angelica tree -Pacific cod -cant hook -urologist -spelt -lekvar -enologist -Mediterranean flour moth -prickly-edged leaf -Spanish grunt -dune cycling -frostweed -whisperer -tucker -Roman wormwood -counterterrorist -woolly alder aphid -Nuttall oak -snail butter -threshing floor -motley -forge -water mold -mummichog -sulfur paintbrush -head -walking delegate -jujube -peachleaf willow -Christmas bells -valley pocket gopher -bear's-paw fern -Lanthanotus borneensis -pearl hominy -placeman -swage block -offerer -stargazer -jeweler's glass -male chauvinist -crossbar -Oktoberfest -tamarau -micronutrient -large-leaved aster -tasset -tepary bean -sausage curl -ivy -snob -roller towel -wood meadowgrass -archil -padrone -prairie rocket -tongueflower -kidney fern -Carolina buckthorn -sea island cotton -landscape architect -realist -oyabun -mother hen -ostracoderm -esker -heliophila -nympholept -shining clubmoss -press agent -clam dip -Djiboutian -white currant -codfish ball -hand cheese -kraal -trident -conventicle -bacteroid -Indian plantain -quandong -kola nut -signor -theater light -musk clover -canistel -silent partner -steel-wool pad -diggings -affluent -sightreader -John Doe -arrowworm -goatsfoot -guardroom -wild cinnamon -kaffir boom -ink eraser -yardie -industrialist -sea lily -polarimeter -Polistes annularis -western big-eared bat -omnivore -Ted -horsecloth -crab cocktail -vacuum chamber -flower-of-an-hour -bilge -poleax -neolith -Montezuma -plum-yew -welfare case -trave -pipe bomb -shading -Centigrade thermometer -bangalore torpedo -celery top pine -nuclear rocket -fowling piece -anti-Semite -landscape -derris -bush honeysuckle -Mediterranean water shrew -ticket collector -masked shrew -white dipladenia -Savoyard -bondman -tempter -pygmy cypress -pentathlete -thruster -usurper -Arminian -yerba buena -ice field -ichthyosaurus -sackcloth -bean tostada -Oxbridge -Pteropus hypomelanus -thinker -bank robber -ape-man -thurifer -knawel -mule fat -hot spot -hairy-legged vampire bat -night raven -hook and eye -crocodile bird -skunkweed -beaver rat -cypress sedge -florida selaginella -April fool -Jonah crab -glass wool -corkwood -dwarf elder -hinging post -gentile -Brazilian trumpeter -witch doctor -thermograph -pink shower -Mao jacket -capelin -parang -bradawl -stooper -jewel orchid -citrange -oarswoman -Macedonian -particolored buckeye -pachycephalosaur -satinwood -Chinese brown sauce -peep sight -straight man -quandong -chamois cress -nonfat dry milk -rosin bag -Leiden jar -Grimes' golden -spirillum -grass vetch -carillonneur -downy wood mint -melon ball -sweet calabash -chlamydospore -bombshell -sidewall -sprig -Indian button fern -globe pepper -rough-stemmed goldenrod -bocconia -bubble chamber -sand dab -plum-fruited yew -aecium -marrowfat pea -hobbyist -whipper-in -salad burnet -neckband -Tangier pea -sauce Louis -salad burnet -artist's loft -koumiss -Nazarene -cutter -scrim -drape -crab-eating dog -deckhand -bedroll -gaff -stifler -pink lady -great plains paintbrush -patternmaker -yoke -caryophyllaceous plant -angrecum -quadriplegic -grid -genlisea -aspic -water table -junket -signore -Mutillidae -proprioceptor -pivoting window -Indian poke -synchroscope -trichion -tarahumara frog -proctoscope -abomination -purslane speedwell -breast drill -Japanese barberry -mandrake root -breakable -salon -American watercress -take-up -entrenchment -cocktail sauce -Scotch asphodel -borough -matchmaker -Seneca snakeroot -pointsman -psephologist -clustered poppy mallow -onion thrips -nuclear-powered ship -organizer -deciduous holly -balsam willow -enzymologist -caraway -drip loop -dog laurel -Orangeman -sapsago -polymath -backplate -leathery grape fern -modillion -two-timer -handhold -consignee -white stringybark -nettle-leaved goosefoot -bookmaker -disk drive -doliolum -palmist -packinghouse -Spandau -Whipple's penstemon -sword grass -ribbon development -pearly-shelled mussel -winter heliotrope -rogue elephant -deck tennis -Venus's flower basket -football -shim -boatswain -blinks -armored catfish -hooded seal -outdoorswoman -water starwort -upholstery needle -pleurodont -silky anteater -cornmeal -lead-in -redfin pickerel -horse balm -Rydberg's penstemon -cascade transformer -fly poison -Volvaria bombycina -broad-leaved twayblade -pastry cart -body plethysmograph -waverer -hardware store -Parry's penstemon -European sanicle -strawberry geranium -cross-examiner -head gate -devil's tongue -hemiepiphyte -pine hyacinth -machmeter -spirit lamp -field judge -Rock Cornish -mayhaw -Sassenach -bog pimpernel -parallel interface -crowberry -roach -Aegyptopithecus -cajan pea -lapboard -cryostat -magnetic storage medium -white yam -Lombard -rhymer -bed and breakfast -bunya bunya -rifle grenade -caterer -collared pika -anti-submarine rocket -bookkeeper -Western mountain ash -profit taker -fruitlet -Knowlton's cactus -infernal -beefsteak begonia -lunula -emulsion -intermediate wheatgrass -titfer -European sea bream -bigeye scad -yak butter -kola -cone pepper -plesiosaur -ragwort -penal colony -black carpet beetle -lubber's hole -Stapelias asterias -yard marker -balloon bomb -Scythian lamb -armory -selsyn -marblewood -spirula -fatalist -hash head -armiger -Dom Pedro -white-chinned petrel -ballast -orthopter -greater water parsnip -clutch -largeleaf holly -Evangelist -king whiting -tuna fish salad -Muscadet -surpriser -jumping bristletail -proportional counter tube -Hamburg parsley -obstructionist -pus-forming bacteria -creep feed -stepbrother -janissary -control freak -trusty -trepan -King William pine -orthicon -geological horizon -molecular biologist -violator -pariah dog -Austrian -conciliator -Fauntleroy -packing needle -mazer -Saturday night special -leucocytozoan -coastal rein orchid -whirligig beetle -capitalist -breeches buoy -clubroot fungus -meadow spikemoss -Kichai -Spanish lime -land office -camera obscura -strafer -purple-stemmed aster -lusterware -valve -Roman nettle -isthmus -breadstuff -sealskin -maleo -bilge keel -carissa plum -fish fly -kolkhoznik -heath pea -cowage -hog sucker -Sam Browne belt -inductor -wild licorice -Socotra begonia -supernumerary -Angle -red shrubby penstemon -toilet kit -tawse -sweet bells -kawaka -brown soft scale -lyssavirus -betting shop -double-crosser -macrotus -climbing hempweed -poi -strip mall -deadhead -petit juror -tract housing -American mistletoe -lace-flower vine -precipitator -endoparasite -hairy wood mint -red snapper -Victorian -hog peanut -line of heart -opossum shrimp -plumcot -Bavarian blue -slops -light flyweight -oregano -sand myrtle -pocket battleship -curator -narc -hydraulic cement -plains pocket gopher -closed loop -pluralist -molter -Christmas bush -snuffers -slender knapweed -footwall -plage -caper tree -red siskin -tender -boat train -tipster -low-pass filter -student lamp -morosoph -japonica -bellows -herald -oyster plant -savory -mail -computational linguist -blade -winter crookneck squash -zoomastigote -blackmailer -richweed -dialectician -genip -plumed scorpionfish -jet bridge -thermopile -billy buttons -Brule -millwright -Arenaviridae -Jones' penstemon -monastic habit -genipap fruit -burnous -dairyman -top -crab-eating raccoon -quadrangular prism -pilot burner -weeder -trireme -boy wonder -man of letters -Catawba -high-muck-a-muck -light circuit -bloodworm -lappet caterpillar -half-and-half -office boy -saddle stitch -mistletoe cactus -false chamomile -Catalina cherry -workhouse -Jamaica quassia -britches -tooth shell -reduction gear -carrot pudding -balsam woolly aphid -handspike -aioli -silver hake -flour bin -wireman -gas-cooled reactor -aficionado -plus fours -gitano -gene chip -oilfish -ingenue -tulip orchid -late purple aster -pork and beans -envoy -lemon extract -milk bar -black huckleberry -ground roller -Connecticuter -siderocyte -Jacquard loom -chub -meat safe -stock cube -Australian sumac -purple sanicle -tailless tenrec -dog wrench -rainbow cactus -castor bean -scintillation counter -eohippus -pawnbroker -gauge boson -front man -early warning radar -bearing wall -Bourbon -sandwichman -sild -gravelweed -perishable -cembra nut -riflebird -quicksand -slate -sweeper -ship-towed long-range acoustic detection system -defamer -president -vitamin K3 -challis -tanekaha -bloodwort -grenadier -quietist -Zairese -fucker -foremother -gesneria -print buffer -salsilla -fissiped mammal -fender -consulate -acidophilus milk -Southern dewberry -snail darter -Panama redwood tree -dehydrated food -bush willow -coffee fungus -Sinologist -Mesoamerican -hood -large civet -deck-house -cyborg -smuggler -pepper sauce -cyberpunk -Grand Inquisitor -persona non grata -haggis -weeping tree broom -stop bath -modifier -coyol -conodont -yellow giant hyssop -optical pyrometer -Carolina moonseed -marinade -aspartame -false wintergreen -cityscape -philter -turnery -hemiplegic -chuck-will's-widow -vower -track star -myrtaceous tree -small civet -intelligence analyst -dogcart -yardman -cross bit -holometabola -platen -sweet cassava -Comstock mealybug -acute angle -Communist -alcohol thermometer -mountain hollyhock -Mead's milkweed -highjacker -Townes -congou -Astrophyton muricatum -lazybones -roughcast -pressure cabin -clinch -cinnamon -smoke bomb -quandong -tout -office-bearer -punctum -efficiency apartment -Queensland hemp -Ceylon bowstring hemp -newswoman -vermin -fetid bugbane -grantee -sanitary landfill -gluten-free diet -clabber -shillelagh -white lettuce -sweet coltsfoot -beggar's lice -samite -loser -flasher -water star grass -banana passion fruit -translator -artificial kidney -Virginia creeper -American crab apple -cactus mouse -nebbish -Ligustrum obtusifolium -vox angelica -stringer -hunter -know-it-all -scene painter -invalidator -jungle cock -basilica -coriander -California single-leaf pinyon -miles gloriosus -pina cloth -law agent -scarlet fritillary -keurboom -bailor -ramjet -seedling -rib joint pliers -ways -picket ship -Surgeon General -wasabi -marquis -clostridium perfringens -Helvella sulcata -furnace lining -kingwood -painted sandgrouse -plain wanderer -Indian madder -silver screen -bailey -dwarf spurge -Serbian -ball-buster -shaheed -Platte River penstemon -tensiometer -mute -nymphomaniac -Yokuts -arroyo willow -whipping post -class act -load -winged everlasting -periodontist -diarist -robber frog -diestock -curry powder -ratchet wheel -store detective -hog plum -prune whip -shortwave diathermy machine -Anabaptist -post chaise -Kennan -bean caper -delegate -orderly sergeant -celtuce -jumping bean -gowen cypress -puddingwife -registered nurse -West Saxon -rosita -gun room -nasotracheal tube -matchboard -flagship -Boswellia carteri -Canadian pondweed -wonder boy -sewer rat -dimetrodon -pantograph -marsh bellflower -angoumois moth -slippery dick -woolly indris -creme de cacao -dulciana -Jewess -Macadamia integrifolia -least shrew -don -diffuser -black-stem spleenwort -grouseberry -goniometer -annotator -sticktight -gossip columnist -speechwriter -capon -rock hind -Liederkranz -chandler -echocardiograph -sidelight -fisher -brocket -New Zealand daisybush -northern sea robin -roller bandage -peachick -pellet -pichi -plug fuse -spark coil -buckwheat -brood bitch -wedgie -dwarf bilberry -filigree -bull -queen -dodo -Salish -denticulate leaf -Western silvery aster -Prima -magnetic bottle -fetterbush -process-server -nainsook -mythologist -Piedmont glacier -hammerhead -niggard -Mound Builder -Kui -Nootka -highbinder -passenger pigeon -oblong -tickler coil -agnostic -succorer -esophagogastric junction -dressmaker's model -bombshell -social anthropologist -gildhall -orpine -pterodactyl -bristly sarsaparilla -Lane's Prince Albert -hognose bat -salesgirl -lubricating system -electric catfish -wrap -Jacksonian -chard -cherry laurel -foreground -beadsman -Kolam -amniote -frozen pudding -acid head -poor box -depositor -coattail -pallas's sandgrouse -mason's level -English lady crab -skeg -cruel plant -petrolatum gauze -tuna -swivel -stock-in-trade -perisperm -civies -Phyllostomus hastatus -alienor -Verdicchio -guard's van -onion butter -moviegoer -planter -citrange -box huckleberry -iconoscope -familiar -helmsman -baby boomer -constructivist -American bog asphodel -whorled caraway -simple pendulum -viviparous eelpout -Job's tears -holdout -sour salt -poison bush -dusky-footed woodrat -golden algae -granadilla tree -telethermometer -crossbar -thrift -African bowstring hemp -dog in the manger -hayrack -gold-crowned kinglet -prolonge -doge -pencil -discount house -mulligan stew -Nonconformist -virologist -gregarine -facula -rocket scientist -thin-shelled mussel -oospore -annual salt-marsh aster -Afrikaner -metallic -julienne -culverin -cleavers -Berliner -mudhif -thorny skate -brown lemming -yellow colicroot -cooling system -large-leaved magnolia -free-reed -canyonside -preemptor -stake -Brucella -anti-G suit -pleximeter -squire -salsilla -write-in candidate -lowland burrowing treefrog -flare star -dwarf hulsea -jobber -mangel-wurzel -quagga -red-skinned onion -positive pole -Pteropus capestratus -jug wine -stomacher -standee -bladder worm -hakim -house of correction -pelisse -golden mole -temporizer -rose apple -drove -umbrellawort -holy of holies -lawyer cane -smooth lip fern -anode -astatic coils -zip gun -feverroot -self-heal -expansion bit -salt reed grass -field pussytoes -nutmeg hickory -cryptic coloration -Venus's girdle -Hunkpapa -Calostoma cinnabarina -raft foundation -May apple -pygmy mouse -prokaryote -yellow-green algae -Bermuda maidenhair -withdrawer -coelacanth -Elliott's goldenrod -driftfish -epicyclic train -bowl -swamp dewberry -corbel step -sadist -party line -anti-American -mining engineer -Amur privet -conidium -Gastrocybe lateritia -lithia water -chaulmoogra -Rough Rider -Guinea pepper -glade mallow -pitcher sage -whitecup -shanghaier -low St Andrew's cross -phonologist -cocobolo -perfumery -visor -prison chaplain -belt -ingesta -literary critic -industrial watercourse -reckoner -pursuer -Kinetoscope -Kuiper belt -hyperope -raw recruit -Galiella rufa -Prince Albert yew -slit trench -usher -tenderfoot -white-rayed mule's ears -browser -piccalilli -bran -giant buttercup -water lobelia -arborescent plant -echinus -dryland blueberry -struggler -platyctenean -Geordie -domatium -twenty-two rifle -keteleeria -sports editor -chorus girl -Hakham -dry-bulb thermometer -onomancer -double-bitted ax -Girondist -bottle bank -thyrsopteris -bandwagon -star anise -armored car -dhawa -Bessemer converter -mutineer -paradise tree -tupik -centurion -mending -chowchow -margrave -International Grandmaster -African hemp -catafalque -leptodactylid frog -forcemeat -tank shell -pill -barbecue pit -worthy -lady's maid -evergreen -Jesuit -South American staghorn -rigger -suffragan -imperialist -spherical angle -grey lemming -kitchen police -tree swift -coliphage -archaist -Conservative -rib -exegete -Mendelian -tragedian -steerage -Paleo-American -obeche -garlic -grapefruit peel -accommodating lens implant -half blood -barrelfish -catgut -lanceolate spleenwort -hardliner -frieze -name dropper -carrack -huckster -onion bread -magnetic head -pease pudding -raisin moth -negative magnetic pole -electroencephalograph -bunji-bunji -synchroflash -Mornay sauce -stencil -winged pigweed -Nesselrode -MEDLINE -licorice -mainspring -melilotus -duke -experimenter -Napier's bones -four-minute man -pin-tailed sandgrouse -toolmaker -pogge -rootstock -baton -pricket -creeping snowberry -anomalops -nester -devourer -apolemia -Maricopa -pine-barren sandwort -larvacean -American dewberry -escalope de veau Orloff -gig -myrtle -pitsaw -Lutheran -fish house punch -gnathostome -intake valve -molasses taffy -clammy locust -vandyke beard -Atlantic tripletail -planktonic algae -estradiol patch -flummery -cytologist -sectarian -oil meal -tomtate -mediterranean anchovy -aspersorium -argonaut -porkholt -sheep ked -algometer -Adventist -false goatsbeard -snake polypody -streetwalker -shelver -adoptee -highflier -pitch apple -prairie rocket -fish mousse -viroid -deckle -manila tamarind -observer's meridian -pincurl clip -hardstem bulrush -gossamer -brookweed -Druze -hug-me-tight -accessory before the fact -oilman -Comanche -Marine -bedlamite -Chinese cork oak -squawbush -false miterwort -walk-on -Cynopterus sphinx -brandyball -landlubber -arrowroot -cape forget-me-not -galoot -tabor pipe -checker -Levant cotton -paddle box -murderess -smirker -fuddy-duddy -withdrawer -newel -shade -pink disease fungus -tipu -sweet sultan -aeronautical engineer -tall gallberry holly -acarid -conqueror -cucumber -film director -ordinary -salon -closet queen -allegorizer -tonka bean -flax rust -negative pole -dagame -dentist's drill -mock privet -micropyle -contributor -dark horse -climbing corydalis -cosmotron -land agent -Big Blue -Cynic -tassel flower -lyrate leaf -Minuteman -Dutch-elm beetle -Hessian fly -flower girl -West-sider -window dresser -skinny-dipper -whitebait -out-and-outer -hooker -amicus curiae -jack -camwood -stockist -black root rot fungus -Jamaica dogwood -diaphragm -Holocentrus ascensionis -roselle -black maire -Pygmy -fumigator -lame duck -mudder -hydraulic transmission -conning tower -phoronid -batfish -hearing dog -monohybrid -whaling gun -Cockcroft and Walton accelerator -allemande -seasoner -epileptic -ammonia clock -Young Turk -lanseh tree -urceole -cafe noir -poster girl -Oglala -deadeye -manna lichen -positive pole -cinch -lyricist -hermaphrodite -kidney stone -dilator -number one -frotteur -kaffir bread -fish knife -tarragon -adjuster -potato wart fungus -Florida pompano -conductor -corbie gable -rounders -Catha edulis -bender -recruit -Uruguayan -subject -bunghole -day boarder -pocketed bat -Oxonian -owner-occupier -yellow-leaf sickle pine -devisor -exhibitor -looking glass -shipowner -crooked-stemmed aster -calico -dash-pot -defilade -Confucian -egg-and-dart -irreligionist -lepton -self-rising flour -diving bell -Brahui -shop girl -maximum and minimum thermometer -Dalmatian laburnum -correspondent -subduer -nonperson -Reaumur thermometer -rough-leaved aster -jacksmelt -pinfold -magneto -ex-wife -round-leaved rein orchid -purloo -American shrew mole -sweet sand verbena -polymastigote -outfitter -curled leaf pondweed -Italian dressing -borderer -ambusher -geebung -four-stroke engine -small ship -homeopath -gynostegium -political prisoner -Radiigera fuscogleba -ensiform leaf -rhizoctinia -satyr orchid -rue -bouillon cube -flip -prophyll -tilefish -periselene -prima donna -choker -laminar flow clean room -Hooker's orchid -fish joint -mombin -remover -array -coelostat -autophyte -consigner -Damaraland mole rat -gasman -public works -lye hominy -pearlfish -piassava palm -Georgian -uxoricide -confessor -community center -epigone -tagger -abrading stone -cryoscope -nautch girl -reliever -Cartesian -Indian beech -protoplasmic astrocyte -fundamentalist -mustard sauce -crank -houselights -five-point bishop's cap -comedienne -triangle -presentist -beaugregory -dreamer -Wave -blue mockingbird -Barbados gooseberry -ten-spined stickleback -papoose -silky pocket mouse -holdup man -agent-in-place -suspensory -emigrant -ropemaker -bookbinder -jumby bead -undershrub -Killarney fern -sheep bell -city slicker -equerry -pea crab -down-and-out -blackmouth bass -shirtmaker -lister -UNIX guru -snipefish -gimbal -maisonette -haircloth -Ranvier's nodes -pigmy talinum -tribute album -msasa -hydroxide ion -madame -four-pounder -prophet -sloganeer -field-effect transistor -nude mouse -canteen -Calostoma lutescens -buteonine -sunlamp -Uruguay potato -Spanish tamarind -Prince-of-Wales'-heath -kishke -caprifig -chincapin -hegari -alarmist -bathtub gin -astatic galvanometer -Calostoma ravenelii -marang -tussah -coin box -bugleweed -hacker -frontal eminence -timekeeper -shunt -bicycle clip -mustang mint -caesium clock -hospice -glenoid fossa -archpriest -ex-gambler -incrustation -salvager -Donatist -violator -lamb succory -hygroscope -oilbird -sharptail mola -showplace -corn syrup -flashlight fish -pulse timing circuit -anchovy paste -fascista -chigoe -divan -Druid -squad room -Huntingdon elm -buffalo carpet beetle -carper -corn lily -goats' milk -assault gun -cockpit -Lochaber ax -Visigoth -occupier -Basotho -criminologist -spindle -Rosicrucian -Cornishwoman -musk kangaroo -artificial skin -pandurate leaf -Parkia javanica -roundhead -tea-like drink -basidiolichen -unguiculate -stepmother -Nauruan -gutta-percha tree -bloodberry -scarlet haw -marupa -censor -algebraist -pelvimeter -whaler -cowhide -paparazzo -biochip -internationalist -Yukon white birch -hangar queen -chlamydia -puttee -Pipturus albidus -pearly razorfish -sea moss -burglar -hoary golden bush -colter -drey -bushman's poison -maxillaria -gnetum -deadeye -shittah -swamp oak -damper block -deepwater squirrelfish -truffle -cangue -paleolith -lawyerbush -sorehead -Texas snowbell -Tremella reticulata -quarter -keelboat -dimity -whiner -Wagnerian -myrmecophyte -frontierswoman -pyrometric cone -big-tree plum -puppy -galbulus -hod -winceyette -carriage wrench -dictostylium -farmland -infanticide -Jacob's rod -threadfish -monocline -inamorato -leaf miner -purple cress -passer -black-fronted bush shrike -silverrod -bootmaker -segregate -captive -Edmontonia -spherometer -television transmitter -bladder -Saratoga spittlebug -dynamometer -lodge -smooth darling pea -Cossack -wake-up call -Olmec -sutler -molasses kiss -corner post -rattlesnake weed -yardmaster -adder -rhinoscope -referral -ulster -pantaloon -counterspy -gadgeteer -heart cherry -hospital chaplain -Clydesdale terrier -plank-bed -Russian thistle -actinometer -dyspeptic -common wolffia -firewall -seidel -potato moth -soapweed -seif dune -thill -cosmographer -absolver -halberdier -fire control system -kai apple -bastard pennyroyal -Big Brother -broadcast journalist -Albatrellus dispansus -citrophilous mealybug -split end -nickel-iron battery -Newtonian -gas maser -thumbstall -anaspid -dusky-footed wood rat -latitudinarian -flatbrod -schizocarp -niqaabi -flight surgeon -gyrocompass -Polyporus tenuiculus -Utopian -mailboat -spellbinder -undercoat -cassareep -typical jerboa -photocathode -katharometer -bight -fur-piece -penetration bomb -malik -Siberian millet -nanomia -Wykehamist -tosser -gyrostabilizer -microwave diathermy machine -crystal set -wall -legatee -alfalfa -angwantibo -charioteer -piano maker -African mahogany -Morlett's crocodile -taro -parallel circuit -cush-cush -etymologist -matriculate -neem seed -cornerback -kingfisher daisy -redoubt -blastomycete -peplos -costumier -publican -tobogganist -semolina -myrmidon -parricide -gymslip -whoremaster -cryptocoryne -header -platitudinarian -barleycorn -spiral bandage -reciter -abecedarian -dance -wrymouth -bilberry -Liopelma hamiltoni -streamliner -Fordhooks -fixed phagocyte -radiobiologist -neurologist -Selkup -dollarfish -cascade everlasting -acrodont -boarhound -midstream -theatrical producer -abhorrer -goldsmith -photometrist -Anglo-Saxon -rugel's plantain -sable -workmate -ferule -ankus -earleaved umbrella tree -Passamaquody -timucu -Mexican pocket mouse -yerba santa -Rochon prism -apomict -monocarp -sweet unicorn plant -common winterberry holly -archivist -drypis -paretic -fly-by-night -white-berry yew -Schoolman -blue cheese dressing -vintager -squatter -Euphausia pacifica -corrugated fastener -yellow henbane -Croesus -almoner -analphabet -acoustic delay line -sheep frog -workhouse -horseleech -venturer -pond-scum parasite -Pyrenees daisy -plagiarist -Truncocolumella citrina -rerebrace -group captain -caddis fly -hot-rock penstemon -kanzu -stylopodium -slopseller -rauli beech -starter -ootid -statesman -distributor cam -ascot -falcon-gentle -Duplicidentata -spotted antbird -heliometer -false buckthorn -Allegheny spurge -Cavalier -dart -photocoagulator -master-at-arms -kei apple -baldachin -crapshooter -gametangium -white hope -chipotle -spike heath -Scotch woodcock -Florentine -differential analyzer -Mitrula elegans -wet cell -basil balm -Circassian -corn cake -bouncing betty -vice-regent -lagerphone -ketembilla -whoremaster -fork -tetrasporangium -trifler -pill head -life-support system -quartermaster general -tobacco thrips -officeholder -teredo -toyon -Sundacarpus amara -Phytophthora citrophthora -naif -lobbyist -alligator wrench -bully -heavy -toxicologist -radio chassis -waterdog -drive line -kaffir cat -foster-brother -breakax -curette -traditionalist -pipe vise -striped button quail -gawker -homeotherm -schoolyard -battue -kalansuwa -deviationist -Bolshevik -transponder -pungapung -iron -Eyeish -roccella -manglietia -Tory -print seller -Texas Ranger -otter shrew -seconder -shellflower -outlier -party man -wold -hayfork -oncologist -framer -co-beneficiary -ocean pout -Chinese angelica -scrimshaw -air attache -false gromwell -standing press -fringepod -specifier -automatic choke -durum -yenta -wassailer -reeler -signora -beach pancake -common booklouse -pellicle -backroom boy -den mother -associate -Unitarian -gambist -brookweed -clubroom -cat's-tail -playboy -self-registering thermometer -doorstop -bennet -yak's milk -escapee -quail bush -sparge pipe -coast boykinia -screw key -half gainer -aggravator -cotton mill -tailor's chalk -free agent -cotton mouse -deadhead -bunny -turpentine camphor weed -amaranth -ceratodus -red lauan -beam-ends -thermograph -wally -Toda -handrest -commissary -oak-leaved goosefoot -manufacturer -voicer -Jafnea semitosta -bench hook -finder -abyssal zone -rabbitwood -Hercules'-club -epicarp -declinometer -camp follower -signaler -Australian pea -putz -qadi -banded palm civet -egg timer -regnellidium -calisaya -harvestfish -sound spectrograph -side-wheeler -glomerule -woolly rhinoceros -Black Muslim -horticulturist -ornithomimid -cryometer -battlefront -gametophyte -airmailer -cuisse -nakedwood -baseball club -slasher -anise -leatherleaf -leatherjacket -horned pondweed -gofer -Saigon cinnamon -barong -blazer -twinkler -skeleton shrimp -dial -floorwalker -case shot -flannelbush -cultivated parsnip -Jane Doe -few-flowered leek -nogging -placer miner -muzzler -serge -lion-hunter -capulin -Wandering Jew -ascidian tadpole -hispid pocket mouse -southern spatterdock -milk wagon -junior middleweight -duck sauce -promycelium -protozoologist -cascade liquefier -tout -longheaded thimbleweed -charcoal burner -footage -slop -bridge agent -miller's-thumb -Job's comforter -marocain -tanker plane -lancetfish -knocker -toque -ordinand -umbrella bird -favorite son -hare's-foot bristle fern -business traveler -plotter -Asiatic shrew mole -tallyman -stump -Paleacrita vernata -index register -mortgagee -accuser -codger -sand rat -seaside centaury -chiropractor -Florida smoothhound -dwarf sperm whale -T-man -sannup -dragonhead -numdah -alkali grass -gynobase -kymograph -ascolichen -steward -waterline -Nazarene -filer -lapidary -muncher -wincey -scyphus -question master -besieger -worldling -docent -facing -atmometer -quern -puerpera -three-decker -calliope -wild red oat -bailee -flame pea -cattle cake -theist -yellowtail flounder -cosmopolitan -rocket engineer -vouchee -Turkoman -hard sauce -Thousand Island dressing -assayer -messmate -mutilator -oyster bar -flame tokay -countess -prairie mimosa -microsporangium -cotter -townsman -paring -fundraiser -simperer -Comrade -orlop deck -power takeoff -cattleship -prime meridian -Javanthropus -scriptorium -curandera -long-clawed prawn -maestro -paster -potato tuberworm -chachka -junkyard -cape yellowwood -reentrant polygon -Liberian coffee -restaurateur -Alsophila pometaria -Jekyll and Hyde -electrophorus -Scomberomorus maculatus -manipulator -gromwell -chicken provencale -ashram -mangel-wurzel -shamrock pea -dossal -adducer -erection -Mysore thorn -smoothie -chufa -brace wrench -victualer -litterer -linstock -Protium guianense -palfrey -banyan -klieg light -dangleberry -trooper -yaupon holly -quitter -tradescant's aster -nullipara -melter -devil's urn -ghostwriter -mouth -analogist -Creek -sonic depth finder -fucker -locus of infection -mortician -esophageal smear -locum tenens -conic projection -aroeira blanca -bellarmine -night porter -automobile mechanic -codpiece -Munro -cottonweed -scoinson arch -tinderbox -frozen food -waterproofing -Egyptian henbane -lash -transactor -American smooth dogfish -existentialist -grabber -Sonoran lyre snake -Rufous rubber cup -colors -weekend warrior -power user -perennial salt marsh aster -Puritan -Apalachicola rosemary -anecdotist -tosser -moth bean -agnostic -stretcher-bearer -browntail -optimist -brewer's mole -astronomy satellite -flat file -rust mite -tuberous plant -day laborer -buster -trapezoid -bevatron -nonresident -Streptomyces griseus -mangosteen -customer agent -hero worshiper -suicide bomber -procellariiform seabird -archiannelid -reaction turbine -distortionist -bulldog wrench -grainy club -scalp -Aztec -scow -globigerina -pedant -heartleaf manzanita -kanchil -low gallberry holly -containment -scandalmonger -rose-colored starling -Powhatan -addle-head -Chilean rimu -Atlantic sea bream -arthrospore -ramrod -root climber -Kalapooia -roach clip -Schreiber's aster -horseradish -albino -Kshatriya -trombidiid -blasting cap -body pad -brachium -shallu -Wynnea americana -slender centaury -munj -upset -wind tunnel -cottonwick -airing cupboard -pepper shrub -ambrosia -languisher -chosen -rose globe lily -purple apricot -costia -sloop of war -sultana -frontlet -booster -sargassum fish -broad-leaved montia -rifleman bird -stillroom -amoralist -enginery -meter maid -fitment -southern bog lemming -Athenian -clincher -cusk-eel -mackintosh -diaphone -corozo -Australian reed grass -czar -spongioblast -Eurafrican -airhead -Shahaptian -Roman -pollinium -tourist class -halogeton -stamper -emperor -malingerer -tramp steamer -Peziza domicilina -pilot cloth -stenopterygius -cost accountant -Queen's Counsel -wine-maker's yeast -poppet -cage -rowlock arch -landgrave -bearded wheatgrass -stink bell -quaker -undesirable -algarroba -resistance pyrometer -exorcist -carib wood -guvnor -border patrolman -bathhouse -licenser -headman -rentier -pine spittlebug -nut-leaved screw tree -paraduodenal smear -apron -necker -smilax -Alpine besseya -creeper -castle -ground bait -Queensland grass-cloth plant -sclerotium -great yellowcress -fat farm -Stoker -hoop snake -elixir of life -Trotskyite -home buyer -wheat berry -Tutelo -semi-climber -utahraptor -wet-bulb thermometer -packrat -hygrophyte -darter -sketcher -refiner -camlet -midgrass -compound -tarwood -Colorado River hemp -toiler -abstractor -override -dwarf pipefish -plodder -briefcase computer -trunk hose -brown butter -valve-in-head engine -cymbalist -explosive detection system -horsewoman -boutonniere -chinchilla -venerator -scourer -exarch -cohune nut -ayapana -continental divide -cosigner -stalker -pyxie -Genet -Macowanites americanus -open-hearth furnace -water chestnut -American frogbit -tarwood -cutter -scout -burr -upsetter -grist -tagasaste -mouthpiece -palette -rattan -letterman -Exmoor -Methodist -eelblenny -marasca -slide valve -ventilation -saddle hackle -Yakut -flux applicator -air traveler -murder suspect -Cynocephalus variegatus -idolizer -Surgeon General -nutlet -little-head snakeweed -germ tube -fellow traveler -raceabout -commodore -czar -anamorphosis -treelet -girlfriend -groundnut -sideline -giant star grass -goffer -spark lever -oubliette -processor -tare -plodder -extremist -Kipp's apparatus -gripsack -S wrench -viscountess -bridgehead -cascarilla -Asiatic flying squirrel -protoceratops -equerry -difflugia -princeling -moonlighter -aspergill -common flat pea -Utahan -imperial mammoth -plantain-leaved pussytoes -Boott's goldenrod -bootlegger -reed pipe -runcinate leaf -onion salt -nitrite bacterium -introvert -duck -New World opah -goliath frog -heterostracan -disrupting explosive -haggler -candlenut -false bugbane -returning officer -eudiometer -ship-breaker -metazoan -mandarin -patka -gill net -cavity wall -armilla -rainmaker -dealfish -orderly -gleaner -muffin man -house sitter -alto -sand devil's claw -vulcanizer -appendicularia -boron chamber -chess -bitok -anchovy butter -dropout -flour mill -bishop -escapist -scapegrace -stanhope -smooth winterberry holly -upstager -stalking-horse -pony -prairie gourd -parabolic mirror -Polaroid -slasher -lap -garlic butter -sendee -German millet -hairy honeysuckle -Swiss canton -Scleroderma flavidium -red goatfish -telegraph plant -Jungian -garment cutter -mallee hen -stranger -driveway -schooner -Paiute -cisco -trestlework -sipper -shanny -romanticist -Molly Miller -mountain rimu -odd-leg caliper -bitumastic -Western Australia coral pea -labor coach -latchkey -harpulla -solitary pussytoes -chop-suey greens -coil -guimpe -diapir -Osage -gutta-percha tree -giant eland -reticulation -garden huckleberry -quick study -Hudson bay collared lemming -coreligionist -Lancastrian -stumblebum -omnirange -seersucker -Potemkin village -Rhea Silvia -symphonist -bolti -jaw -jaconet -page -visiting fireman -haulm -p-n junction -landlubber -yellow jack -triclinium -souari -invader -fire walker -Luddite -Plott hound -hemming-stitch -winker -star-duckweed -craniometer -Arabidopsis lyrata -loser -cypripedia -trimmer arch -cookhouse -pink fivecorner -transfer -ringleader -northern pocket gopher -moke -blockade-runner -cyclostome -web-spinning mite -Whig -transcriber -malahini -sawyer -patent log -paca -tragedian -thermojunction -soffit -black buffalo -foreigner -applecart -brit -pole horse -white mullet -argentinosaur -Homo soloensis -bounty hunter -decumary -hand -paperboy -Smitane -windowpane -Java man -Wynnea sparassoides -prune -middy -lilliputian -sorb -pyrostat -guest worker -hold -leaseholder -vegan -humanist -salinometer -piton -zygospore -means -night rider -tetraspore -archipelago -radiomicrometer -nitpicker -spot weld -slicer -girlfriend -round-tailed muskrat -cock's eggs -Shavian -bay -nuclear chemist -planetarium -hiccup nut -Marylander -milling -microsporidian -brown cup -Strophanthus kombe -little skate -emancipator -paperhanger -archaeopteryx -maigre -Mastotermes electrodominicus -procurer -seizure-alert dog -homeboy -cotton strain -mute -siren -spearnose bat -phenacomys -gayal -arsenal -pitchfork -Port Jackson heath -cud -magnetic core memory -interferometer -water jacket -account executive -hodoscope -window oyster -sudatorium -syncopator -loment -hypertensive -smoothbark -Geogia holly -nailhead -African holly -musette -chafeweed -microflora -derrick -strawworm -shogun -queen post -jerboa kangaroo -columbo -royal -sourball -solenogaster -cardsharp -Homo habilis -intaglio -calf's-foot jelly -flotsam -skirret -baronduki -chyme -shovel hat -Welsh -monoplane flying fish -groundfish -tablet-armed chair -swan dive -Indian club -colonial -cassiri -pyramidal tent -praya -silk vine -time clock -button snakeroot -clews -Korean lespedeza -diffuser -ripping bar -puttyroot -nipple shield -headpin -juneberry holly -hub-and-spoke -laver -weldment -plain flour -hoosegow -dudeen -grey skate -line of life -mung -arariba -Newtown Wonder -rock candy -side chapel -castor sugar -narrow-leaved white-topped aster -babassu nut -puka -rings -catchall -heat shield -caroche -oxbow -Australian coral snake -tapper -sporangiophore -fenugreek -spruce gall aphid -gouache -cutoff -private line -pod -cargo hatch -nailhead -penile implant -geophyte -small-leaved linden -deepwater pipefish -paperhanger -hairy spurge -Persian lamb -subtropics -feed grain -clarence -nonparticipant -scorpioid cyme -hand brake -tiller -Geglossaceae -albacore -monochrome -goa bean -bur -tongue worm -psittacosaur -frog's lettuce -pectoral -terreplein -light filter -fishpaste -dry point -grison -feterita -dolichocephalic -oenomel -stretcher -swag -cheval-de-frise -mountain beaver -scammony -discus -leatherleaf saxifrage -wharf rat -Dominique -pelycosaur -depth gauge -bishop -archespore -true anomaly -silver jenny -mercy seat -kelp -oviraptorid -acrylic -Chinese pea tree -meat house -bilge well -Temperate Zone -whale louse -balbriggan -briefcase bomb -pump-type pliers -oil -sour gourd -Jewbush -lunette -Chinese paddlefish -pyxidium -beechnut -calabar bean -grugru nut -gib -blunt file -cataphyll -megasporangium -blockbuster -sliding seat -hogchoker -calceus -Connarus guianensis -honest woman -survivor -second balcony -tempera -Calvary clover -murine -outwork -bogy -elephant's-foot -conning tower -set square -blackfly -stirk -Streptomyces erythreus -blade -goldfield -snowball -mortal enemy -waltzer -shoal -galley -hitchhiker -lithophyte -brisling -scauper -esophagoscope -grab -subtracter -philosopher -duplex apartment -southeastern pocket gopher -bonduc nut -reverberatory furnace -grader -lamp house -northern bog lemming -brotula -ornithopod -ptyalith -obturator -perpetual motion machine -range pole -Africander -curvet -daisy print wheel -floor -collector -mutant -tuck -fore-and-after -senega -buckler mustard -louvar -Tarsius glis -culdoscope -Spanish fly -steering gear -hatchet man -museum -saw set -cambric tea -comber -thermohydrometer -stationer -chalcis fly -bryanthus -whipstitch -harvest mite -rock gunnel -time bomb -rariora -pigfish -apetalous flower -head shop -horned whiff -sandpit -tachistoscope -sundries -taffrail -caller -monofocal lens implant -Dover's powder -souari nut -crowbait -render -Shakespearian -hagberry -megatherian -magus -hatchel -mangabey -garroter -piedmont -cope -barrio -psychodid -rigout -distributor -croupier's rake -sarcenet -narrow-leaved water plantain -treenail -biped -lanternfish -overdrive -barndoor skate -picket boat -amber lily -sawpit -sand lance -bucket shop -common beech -laundry truck -surtout -grogram -tampion -escape hatch -interstice -shop bell -snake mackerel -nakedwood -tumbrel -mericarp -mountain paca -cab -big board -cringle -eusporangium -shipping room -coal chute -dumbwaiter -Smiledon californicus -man-at-arms -cartridge -deinonychus -pigeon pea -screw bean -spectacle -floorboard -cutting room -low-warp-loom -proconsul -sabicu -genipap -clapper -aquifer -archaeornis -belly flop -Protium heptaphyllum -interrupter -high-warp loom -knight -wiper -impression -poker -Pithecanthropus -sable -guardroom -tenter -wellhead -raja -strickle -sodomite -mountebank -sand leek -Barbados gooseberry -shuffler -sensory fiber -crab-eating opossum -etching -rare bird -scup -fagot -negro vine -hutment -droshky -nephoscope -lady chapel -cutty stool -release -vestiture -buff -standard -Tabernacle -vascular ray -snakewood -chlorobenzylidenemalononitrile -limnologist -pouched mole -microwave linear accelerator -Mastotermes darwiniensis -wind tee -orange bat -open sight -carpospore -rampant arch -sabbatia -cursor -post exchange -bellpull -center -cyclostyle -canonist -pygmy sperm whale -moa -king -pass-through -angioscope -marrow -hookup -revetment -acanthocephalan -good Samaritan -apatosaur -web spinner -dixie -ommastrephes -crossbench -candlewick -jack -light arm -caisson -kaki -quandong nut -Meuniere butter -coquilla nut -mast -black -twitterer -bluethroat pikeblenny -shielding -water-shield -urolith -elephant bird -clearway -dark lantern -schizopetalon -press -Nazi -sugarberry -Maltese -stevedore -hair shirt -party wall -gainer -blackheart -nothosaur -cavetto -evergreen bittersweet -chemical bomb -calpac -shingle -turnpike -animator -heaver -isoclinic line -death knell -liner -anathema -aerie -razorback -Ichyostega -pound net -French dressing -mottle -yard -string tie -bell seat -brattice -battering ram -sierra -pompon -vertex -stomach pump -electrolytic cell -escolar -telpher -roadhouse -cerecloth -tartare sauce -letter case -whale sucker -hob -teg -canvas -strickle -hectograph -Cartagena bark -mail car -acinus -freedom rider -bread sauce -picture window -Rhizopogon idahoensis -pinprick -mass spectrograph -ringer -devil's cigar -salad cream -marlberry -airbrake -Clark cell -yellow-throated marten -wire gauge -dinoceras -aba -harpoon log -plate rail -mustard plaster -coelophysis -journal box -puce -ballcock -quartering -izar -clinid -whirler -turnspit -deathbed -pottle -shot -doubler -Coryphaena equisetis -English sole -chicken feed -borrow pit -mylodontid -Chilean nut -Kundt's tube -ling -asthenosphere -reseau -death seat -immovable bandage -peppermint patty -lecturer -electron multiplier -bear claw -hyacinth -beaked salmon -toehold -scull -snowball -gangsaw -fiber -oxeye -lashing -Beckman thermometer -fence -cantilever -dinner theater -Reynard -jag -umbrella plant -camera lucida -beaver -slug -yellowfin croaker -Sibley tent -rat-tail file -anchovy pear -soldier -cackler -chaise -Pitot-static tube -minniebush -Episcopalian -oleaster -ejaculator -wavy-leaved aster -knight -rack -real storage -magnetic mine -cocoa plum -vesiculovirus -birch leaf miner -water chevrotain -rudapithecus -torpedo tube -itch mite -warren -loft -washerman -terrace -nonstarter -shit -platform -caudex -ground control -Ostariophysi -slopshop -Peruvian cotton -crystal oscillator -plastic bomb -bar bit -watering cart -Asiatic sweetleaf -artificial joint -chariot -casern -charge-exchange accelerator -display adapter -hornpipe -honey bell -planula -Nephthytis afzelii -hame -ranter -trachodon -synchrocyclotron -splasher -heterotroph -Nicol prism -Himalayan rhubarb -headfast -put-put -bitter almond -parr -scantling -power breakfast -madder -Catalpa bignioides -rose of Jericho -spark chamber -rhizome -beard worm -supper club -negro peach -keratoscope -wain -apple aphid -planking -time-delay measuring instrument -sternpost -sicklepod -lake bed -gatherer -monotype -dead-man's float -poison gas -dicynodont -organism -cell -person -animal -plant -food -artifact -dressage -contact sport -outdoor sport -gymnastics -track and field -jumping -high jump -skiing -water sport -swimming -dive -floating -skin diving -rowing -boxing -sledding -tobogganing -wrestling -skating -ice skating -roller skating -racing -boat racing -riding -equestrian sport -cycling -blood sport -hunt -fishing -angling -casting -athletic game -outdoor game -golf -field game -field hockey -football -American football -ball game -baseball -court game -badminton -basketball -tennis -sport -Seder -scavenger -bottom-feeder -work animal -beast of burden -pack animal -domestic animal -marine animal -female -male -young -young mammal -pup -cub -lion cub -tiger cub -microorganism -arbovirus -herpes -herpes zoster -reovirus -moneran -cyanobacteria -enteric bacteria -actinomycete -streptomyces -diplococcus -parasite -ectoparasite -protoctist -protozoan -sarcodinian -ameba -ciliate -alga -brown algae -green algae -sporozoan -cypriniform fish -cyprinid -carp -domestic carp -shiner -catostomid -buffalo fish -cyprinodont -killifish -topminnow -squirrelfish -stickleback -pipefish -embryo -fetus -blastula -chordate -cephalochordate -tunicate -ascidian -vertebrate -aquatic vertebrate -jawless vertebrate -lamprey -hagfish -cartilaginous fish -holocephalan -chimaera -elasmobranch -shark -mackerel shark -mako -requiem shark -dogfish -smooth dogfish -spiny dogfish -smooth hammerhead -smalleye hammerhead -shovelhead -ray -sawfish -roughtail stingray -butterfly ray -eagle ray -manta -skate -bird -gamecock -night bird -ratite -passerine -oscine -accentor -lark -pipit -finch -canary -dark-eyed junco -New World sparrow -bunting -honeycreeper -sparrow -grosbeak -towhee -weaver -grassfinch -tyrannid -New World flycatcher -kingbird -pewee -cotinga -antbird -Old World flycatcher -thrush -nightingale -Old World chat -warbler -kinglet -Old World warbler -New World warbler -flycatching warbler -New World chat -yellowthroat -New World oriole -northern oriole -meadowlark -New World blackbird -grackle -Old World oriole -starling -myna -corvine bird -crow -Old World jay -common European jay -New World jay -blue jay -Canada jay -Rocky Mountain jay -nutcracker -European magpie -American magpie -Australian magpie -wren -marsh wren -thrasher -New Zealand wren -creeper -titmouse -black-capped chickadee -Carolina chickadee -swallow -martin -tanager -shrike -butcherbird -bush shrike -bowerbird -European water ouzel -American water ouzel -vireo -waxwing -bird of prey -hawk -black kite -swallow-tailed kite -white-tailed kite -harrier -falcon -peregrine -caracara -eagle -young bird -sea eagle -Aegypiidae -Old World vulture -griffon vulture -bearded vulture -Egyptian vulture -black vulture -New World vulture -buzzard -condor -Andean condor -California condor -black vulture -king vulture -owl -horned owl -scops owl -amphibian -salamander -newt -Pacific newt -ambystomid -climbing salamander -web-toed salamander -frog -true frog -true toad -spadefoot -tree toad -cricket frog -tongueless frog -reptile -anapsid -diapsid -chelonian -turtle -sea turtle -ridley -snapping turtle -musk turtle -diamondback terrapin -Western box turtle -tortoise -soft-shelled turtle -saurian -lizard -gecko -iguanid -spiny lizard -fence lizard -horned lizard -skink -teiid lizard -racerunner -plateau striped whiptail -Chihuahuan spotted whiptail -western whiptail -checkered whiptail -agamid -moloch -anguid lizard -venomous lizard -lacertid lizard -chameleon -monitor -crocodilian reptile -crocodile -alligator -caiman -armored dinosaur -ankylosaur -bone-headed dinosaur -ceratopsian -hadrosaur -saurischian -sauropod -theropod -ceratosaur -maniraptor -synapsid -pterosaur -ichthyosaur -snake -colubrid snake -smooth green snake -rough green snake -racer -blacksnake -whip-snake -rat snake -bull snake -common kingsnake -milk snake -common garter snake -ribbon snake -Western ribbon snake -common water snake -water moccasin -grass snake -viperine grass snake -sand snake -lyre snake -blind snake -indigo snake -constrictor -boa -python -elapid -coral snake -coral snake -cobra -mamba -black mamba -krait -viper -pit viper -rattlesnake -timber rattlesnake -arthropod -arachnid -false scorpion -whip-scorpion -spider -European wolf spider -acarine -hard tick -Ixodes dammini -Ixodes neotomae -Ixodes pacificus -Ixodes scapularis -sheep-tick -Ixodes persulcatus -Ixodes dentatus -Ixodes spinipalpis -wood tick -soft tick -mite -trombiculid -spider mite -house centipede -gallinaceous bird -domestic fowl -jungle fowl -chicken -cock -hen -turkey -grouse -European black grouse -Asian black grouse -blackcock -greyhen -red grouse -moorhen -greater prairie chicken -lesser prairie chicken -heath hen -guan -chachalaca -megapode -mallee fowl -phasianid -pheasant -bobwhite -northern bobwhite -Old World quail -migratory quail -peafowl -California quail -Hungarian partridge -red-legged partridge -Greek partridge -mountain quail -guinea fowl -columbiform bird -pigeon -dove -turtledove -domestic pigeon -homing pigeon -sandgrouse -parrot -cockatoo -lory -varied Lorikeet -rainbow lorikeet -parakeet -cuculiform bird -cuckoo -crow pheasant -coraciiform bird -roller -kingfisher -hoopoe -apodiform bird -swift -Archilochus colubris -thornbill -goatsucker -piciform bird -woodpecker -flicker -sapsucker -toucanet -trogon -quetzal -aquatic bird -waterfowl -anseriform bird -duck -teal -widgeon -sheldrake -goldeneye -scaup -wood duck -sea duck -scoter -merganser -gosling -gander -Chinese goose -greylag -blue goose -snow goose -brant -common brant goose -honker -barnacle goose -swan -tundra swan -screamer -crested screamer -mammal -prototherian -monotreme -marsupial -opossum -bandicoot -kangaroo -common wallaby -hare wallaby -nail-tailed wallaby -rock wallaby -pademelon -tree wallaby -rat kangaroo -phalanger -dasyurid marsupial -dasyure -placental -calf -buck -insectivore -mole -shrew mole -shrew -water shrew -tenrec -invertebrate -sponge -glass sponge -coelenterate -Chrysaora quinquecirrha -hydrozoan -siphonophore -anthozoan -actinia -coral -gorgonian -stony coral -ctenophore -worm -planarian -fluke -liver fluke -Fasciolopsis buski -schistosome -tapeworm -echinococcus -taenia -common roundworm -chicken roundworm -pinworm -eelworm -vinegar eel -trichina -hookworm -filaria -Guinea worm -annelid -oligochaete -polychaete -leech -mollusk -scaphopod -gastropod -abalone -scorpion shell -giant conch -edible snail -garden snail -brown snail -Helix hortensis -seasnail -neritid -limpet -Hermissenda crassicornis -cowrie -bivalve -clam -quahog -cockle -oyster -mussel -marine mussel -freshwater mussel -scallop -shipworm -cephalopod -octopod -decapod -squid -crustacean -malacostracan crustacean -decapod crustacean -crab -swimming crab -spider crab -lobster -true lobster -Old World crayfish -American crayfish -shrimp -prawn -krill -stomatopod -mantis shrimp -woodlouse -pill bug -sow bug -sea louse -amphipod -copepod -barnacle -wading bird -stork -ibis -common spoonbill -roseate spoonbill -heron -egret -night heron -American bittern -European bittern -least bittern -whooping crane -rail -crake -gallinule -purple gallinule -coot -great bustard -plain turkey -button quail -trumpeter -seabird -shorebird -plover -turnstone -sandpiper -yellowlegs -ruff -tattler -woodcock -snipe -greyback -red-breasted snipe -curlew -godwit -stilt -stilt -phalarope -courser -coastal diving bird -larid -gull -tern -jaeger -skua -auk -guillemot -murre -puffin -gaviiform seabird -podicipitiform seabird -grebe -pelecaniform seabird -white pelican -Old world white pelican -gannet -snakebird -sphenisciform seabird -penguin -pelagic bird -wandering albatross -black-footed albatross -petrel -shearwater -storm petrel -aquatic mammal -cetacean -whale -baleen whale -rorqual -toothed whale -beaked whale -dolphin -bottlenose dolphin -porpoise -sea cow -carnivore -pinniped mammal -seal -eared seal -fur seal -fur seal -South American sea lion -California sea lion -Australian sea lion -Steller sea lion -earless seal -walrus -canine -bitch -dog -cur -toy dog -toy spaniel -English toy spaniel -hunting dog -hound -coonhound -dachshund -foxhound -wolfhound -greyhound -terrier -bullterrier -rat terrier -Manchester terrier -fox terrier -wirehair -Welsh terrier -schnauzer -Skye terrier -sporting dog -retriever -pointer -setter -spaniel -springer spaniel -water spaniel -working dog -watchdog -shepherd dog -Belgian sheepdog -pinscher -Sennenhunde -mastiff -bulldog -guide dog -sled dog -liver-spotted dalmatian -spitz -griffon -corgi -poodle -wolf -coydog -wild dog -striped hyena -brown hyena -spotted hyena -aardwolf -fox -black fox -silver fox -blue fox -feline -cat -domestic cat -tom -blue point Siamese -wildcat -common lynx -Canada lynx -bobcat -spotted lynx -caracal -big cat -leopardess -panther -lioness -lionet -Bengal tiger -tigress -saber-toothed tiger -bear -Syrian bear -grizzly -Alaskan brown bear -cinnamon bear -viverrine -civet -Indian mongoose -ichneumon -slender-tailed meerkat -suricate -bat -fruit bat -carnivorous bat -leafnose bat -false vampire -vespertilian bat -long-eared bat -freetail -vampire bat -predator -game -game bird -fossorial mammal -tetrapod -insect -beetle -two-spotted ladybug -Mexican bean beetle -Hippodamia convergens -vedalia -bombardier beetle -calosoma -searcher -firefly -sawyer -pine sawyer -flea beetle -Colorado potato beetle -carpet beetle -clerid beetle -lamellicorn beetle -scarabaeid beetle -scarab -tumblebug -dorbeetle -June beetle -melolonthid beetle -elaterid beetle -snout beetle -boll weevil -blister beetle -bark beetle -darkling beetle -flour beetle -seed beetle -pea weevil -bean weevil -rice weevil -louse -flea -dipterous insect -gall midge -housefly -tsetse fly -blowfly -bluebottle -greenbottle -flesh fly -tachina fly -gadfly -botfly -human botfly -sheep botfly -warble fly -horsefly -bee fly -fruit fly -louse fly -horn fly -mosquito -gnat -fungus gnat -hymenopterous insect -drone -worker -honeybee -Africanized bee -black bee -Carniolan bee -Italian bee -carpenter bee -bumblebee -cuckoo-bumblebee -andrena -Nomia melanderi -leaf-cutting bee -mason bee -potter bee -wasp -vespid -paper wasp -hornet -sphecoid wasp -digger wasp -chalcid fly -sawfly -pharaoh ant -little black ant -army ant -carpenter ant -fire ant -wood ant -slave ant -Formica fusca -slave-making ant -sanguinary ant -bulldog ant -Amazon ant -termite -dry-wood termite -orthopterous insect -short-horned grasshopper -locust -migratory locust -migratory grasshopper -long-horned grasshopper -katydid -mormon cricket -sand cricket -mole cricket -European house cricket -field cricket -tree cricket -snowy tree cricket -phasmid -diapheromera -oriental cockroach -American cockroach -Australian cockroach -German cockroach -giant cockroach -praying mantis -hemipterous insect -leaf bug -mirid bug -lygus bug -lygaeid -coreid bug -heteropterous insect -water bug -water strider -assassin bug -homopterous insect -whitefly -sweet-potato whitefly -coccid insect -scale insect -soft scale -armored scale -mealybug -plant louse -aphid -greenfly -woolly aphid -adelgid -dog-day cicada -seventeen-year locust -spittle insect -plant hopper -psocopterous insect -psocid -booklouse -ephemerid -neuropteron -green lacewing -brown lacewing -odonate -trichopterous insect -caseworm -thysanuran insect -bristletail -thysanopter -thrips -earwig -lepidopterous insect -butterfly -nymphalid -fritillary -emperor butterfly -danaid -pierid -small white -large white -southern cabbage butterfly -blue -copper -American copper -hairstreak -Strymon melinus -moth -tortricid -lymantriid -geometrid -cankerworm -pyralid -tineoid -tineid -clothes moth -gelechiid -grain moth -noctuid moth -cutworm -underwing -hawkmoth -bombycid -saturniid -giant silkworm moth -silkworm -arctiid -lasiocampid -tent caterpillar -webworm -webworm moth -caterpillar -bollworm -woolly bear -larva -grub -pupa -queen -echinoderm -basket star -edible sea urchin -sand dollar -heart urchin -crinoid -trepang -lagomorph -leporid -rabbit -eastern cottontail -swamp rabbit -marsh hare -leveret -European hare -jackrabbit -white-tailed jackrabbit -blacktail jackrabbit -polar hare -snowshoe hare -pika -rodent -mouse -rat -pocket rat -field mouse -brown rat -jerboa rat -water rat -New World mouse -wood mouse -wood rat -vole -packrat -Eurasian hamster -golden hamster -gerbil -lemming -pied lemming -Old World porcupine -brush-tailed porcupine -long-tailed porcupine -New World porcupine -Canada porcupine -pocket mouse -kangaroo rat -jumping mouse -jerboa -dormouse -gopher -squirrel -tree squirrel -ground squirrel -prairie dog -American flying squirrel -groundhog -hoary marmot -yellowbelly marmot -Old World beaver -New World beaver -cavy -naked mole rat -ungulate -hyrax -odd-toed ungulate -equine -horse -foal -colt -male horse -stallion -mare -saddle horse -warhorse -pony -mustang -bronco -wild horse -pony -racehorse -racer -harness horse -workhorse -draft horse -trotting horse -ass -domestic ass -wild ass -onager -common zebra -mountain zebra -grevy's zebra -rhinoceros -tapir -even-toed ungulate -swine -piglet -porker -peccary -ruminant -bovid -bovine -ox -cattle -bull -cow -beef -Brahman -dairy cattle -Old World buffalo -Indian buffalo -carabao -Asian wild ox -American bison -wisent -sheep -lamb -domestic sheep -wild sheep -mountain sheep -goat -domestic goat -wild goat -goat antelope -antelope -Thomson's gazelle -Gazella subgutturosa -springbok -kudu -harnessed antelope -eland -waterbuck -oryx -deer -stag -red deer -mule deer -roe deer -caribou -chevrotain -camel -domestic llama -guanaco -alpaca -giraffe -musteline mammal -ermine -stoat -New World least weasel -Old World least weasel -longtail weasel -American mink -ferret -muishond -snake muishond -striped muishond -river otter -Eurasian otter -striped skunk -hooded skunk -hog-nosed skunk -spotted skunk -American badger -Eurasian badger -ferret badger -hog badger -marten -pachyderm -edentate -peba -apar -tatouay -peludo -giant armadillo -pichiciago -sloth -anteater -primate -ape -anthropoid ape -hominoid -hominid -homo -Homo erectus -Homo sapiens -australopithecine -great ape -western lowland gorilla -eastern lowland gorilla -mountain gorilla -silverback -western chimpanzee -eastern chimpanzee -central chimpanzee -pygmy chimpanzee -lesser ape -monkey -Old World monkey -talapoin -grivet -vervet -green monkey -chacma -mandrill -drill -rhesus -bonnet macaque -Barbary ape -crab-eating macaque -entellus -guereza -New World monkey -true marmoset -pygmy marmoset -tamarin -silky tamarin -pinche -lemur -tarsier -flying lemur -proboscidean -elephant -mammoth -procyonid -raccoon -fish -food fish -young fish -crossopterygian -lungfish -catfish -silurid -bullhead -channel catfish -gadoid -cod -hake -elver -common eel -tuna -moray -conger -teleost fish -clupeid fish -shad -herring -sardine -pilchard -anchovy -salmonid -salmon -Atlantic salmon -trout -brown trout -char -whitefish -smelt -tarpon -ribbonfish -toadfish -needlefish -flying fish -spiny-finned fish -percoid fish -perch -pike-perch -walleye -robalo -pike -pickerel -sunfish -crappie -freshwater bream -black bass -bass -serranid fish -grouper -hind -surfperch -cardinalfish -remora -carangid fish -jack -moonfish -pompano -scad -dolphinfish -characin -cichlid -snapper -grunt -sparid -sea bream -porgy -sciaenid fish -croaker -whiting -sea trout -mullet -goatfish -mullet -silversides -barracuda -sea chub -butterfly fish -damselfish -clown anemone fish -wrasse -blenny -pikeblenny -gunnel -goby -gempylid -scombroid -mackerel -Spanish mackerel -tuna -bonito -sailfish -billfish -marlin -tripletail -mojarra -ganoid -Pacific sturgeon -beluga -scorpaenoid -scorpaenid -scorpionfish -rockfish -lumpfish -greenling -gurnard -sea robin -plectognath -triggerfish -filefish -boxfish -spiny puffer -ocean sunfish -flatfish -righteye flounder -lefteye flounder -whiff -sole -abbey -abbey -abrader -accelerator -accessory -accommodation -acoustic device -acoustic modem -acrylic -action -actuator -adhesive bandage -adjustable wrench -aeolian harp -aerosol -after-shave -airbus -aircraft -airfield -airfoil -air gun -airplane -air pump -air-to-air missile -air-to-ground missile -alarm -alb -alcazar -Allen screw -alms dish -altimeter -Amati -ammeter -ammunition -amplifier -analog computer -analytical balance -anchor -anchor chain -aneroid barometer -angledozer -anklet -antenna -anteroom -antiaircraft -antiballistic missile -apartment -apartment building -aperture -apparatus -apparel -appliance -appliance -applicator -aquarium -arbor -arcade -arch -arc lamp -area -argyle -arm -armament -armature -armchair -armoire -armor -armored vehicle -armor plate -armrest -array -arrow -artificial heart -artillery -assembly -assembly plant -astrodome -astronomical telescope -athletic sock -atom bomb -atomic clock -atomizer -attachment -attack submarine -attire -audiocassette -audio system -audiotape -auditorium -autoclave -autoinjector -autoloader -automat -automat -automatic firearm -automatic rifle -automaton -auxiliary research submarine -awl -ax -axis -axle -axletree -baby bed -baby buggy -baby grand -back -background -backseat -badminton equipment -badminton racket -bag -bag -bag -baggage -bagpipe -bait -balance -balcony -balcony -bale -ball -ball gown -ballistic missile -ballistic pendulum -ball-peen hammer -ballroom -band -bandage -bandanna -banderilla -bar -bar -barbed wire -barge -barge pole -barn door -barograph -barrack -barrage balloon -barrel knot -barrel vault -barrier -barroom -base -base -baseball equipment -basilica -basin -basket -basketball equipment -bass -bass drum -bass horn -bastion -bat -bathhouse -battery -battle-ax -battle dress -battleship -bay rum -bay window -beading plane -beam -beam balance -bearing -beater -beating-reed instrument -bed -bed -bedclothes -bedroom -bedroom furniture -bedspread -bedspring -beehive -beer barrel -bell -bell push -bell tower -belt -belt buckle -bench -berlin -berth -besom -bevel gear -bicycle -bicycle chain -bier -billiard ball -bin -binding -bin liner -binocular microscope -bioscope -birchbark canoe -bird shot -bistro -bit -bit -black tie -blade -blade -blanket -blimp -blind -block -block plane -blouse -blower -blowtorch -bludgeon -boarding -boarding house -boardroom -boat -bobbin -body -body armor -body lotion -boiler -bolt -bolt -bomb -bomber -bongo -boom -boom -boomerang -boot -booth -booth -bore bit -Boston rocker -bota -bottle -bottle opener -bow -bow -bowed stringed instrument -bowl -bowl -bowline -bowling equipment -bowling pin -bowsprit -box -box -boxcar -boxing equipment -brace -brace -bracelet -bracket -brake -brake system -brass -brasserie -brazier -breechcloth -breeches -brewpub -brick -bricklayer's hammer -brickwork -bridal gown -bridge -briefcase -brigandine -brilliant pebble -brim -broad arrow -broadax -broad hatchet -broadsword -brush -bubble jet printer -buffer -buffet -building -building complex -bulldozer -bullet -bullhorn -bullnose -bundle -bunker -burial chamber -burner -bus -business suit -butt joint -button -buttress -butt shaft -buzz bomb -cabaret -caber -cabin -cabin -cabinet -cabinet -cabin liner -cable -cable -cafe -cafeteria -cafeteria tray -caff -cage -calculator -caliper -calorimeter -camera -camera lens -camera tripod -camp -camp -camp chair -camper -can -canal -candelabrum -candlestick -cane -cannikin -cannon -cannon -cannonball -canopy -canteen -canteen -canvas -canvas tent -cap -cap -cap -capacitor -caparison -cape -cap screw -capsule -car -car -carbine -carbon arc lamp -card index -cardioid microphone -car door -cargo liner -cargo ship -carillon -carpenter's hammer -carpenter's level -carpenter's mallet -carpenter's rule -carpet tack -carriage -carriage -carriage bolt -carrick bend -carrier -car seat -cart -cartridge -cartridge belt -cartridge holder -case -case -cashbox -casque -casserole -cassock -catch -catcher's mask -cathedra -cathedral -cathedral -catheter -cathode -cathode-ray tube -cat's-paw -cattle car -cautery -cavalry sword -cedar chest -cell -cell -cellblock -center -centrifuge -ceramic -ceramic ware -chain tongs -chair -chair of state -chalk -chamfer plane -chandlery -chapel -character printer -chassis -chasuble -chatelaine -checker -cheeseboard -chemical reactor -chessman -chest of drawers -child's room -china -chip -chip -chisel -choke -chokey -chordophone -chronoscope -chuck -church key -cigar lighter -circle -circuit -circuit board -circular plane -circular saw -cistern -civilian clothing -clamp -clamshell -clarinet -classroom -clavier -cleaning implement -cleaning pad -clean room -clinic -clip -cloak -clock -closed circuit -closed-circuit television -closet -cloth covering -clothes closet -clothes dryer -clothes hamper -clothes tree -clothing -clothing store -clout nail -clove hitch -clutch -coach -coal car -coal shovel -coat -coat closet -coating -coating -coat of paint -coaxial cable -cocked hat -coffee cup -coffee maker -coffer -coffin -coil -colander -collider -cologne -colonnade -color television -Colt -column -column -comb -comb -combination plane -combine -commissary -commodity -communication system -commutator -compact disk -compartment -compass -compass card -compound lens -compound lever -compressor -computer -computer circuit -computer network -computer screen -computer system -concentration camp -concert grand -concertina -condenser -condenser -condenser microphone -conductor -connecting rod -connection -conservatory -conservatory -contact -container -contrabassoon -control -control panel -control system -convent -converging lens -converter -convertible -conveyance -cooker -cooking utensil -cooler -cooling system -cord -cord -cordage -corner -correctional institution -corset -cosmetic -costume -costume -cotter -cotton -counter -counter -counter -counter tube -country house -coupling -court -court -coverall -covering -cowbarn -craft -cravat -crazy quilt -cream -cream pitcher -crematory -crepe -crib -cricket equipment -croquet equipment -crossbar -crossbow -crosspiece -crown jewels -cruiser -cruiser -cruise ship -crystal microphone -cudgel -cuff -cultivator -cup -cupboard -cupola -curb roof -curtain -cutout -cutter -cutting implement -cybercafe -cyclotron -cylinder -cymbal -dado plane -dagger -damper -dart -data converter -data input device -davenport -davenport -davit -dead axle -deck -deck -deck chair -deep-freeze -defensive structure -delay line -delicatessen -dental appliance -denture -depilatory -depressor -depth finder -derrick -destroyer -detector -detector -detonating fuse -detonator -developer -device -dial -dialyzer -diathermy machine -diesel locomotive -digital camera -digital computer -digital display -diner -dinghy -dining car -dining-hall -dining room -dining-room furniture -dining-room table -dinner dress -dinner pail -dinner table -diode -dip -diplomatic building -dipper -DIP switch -directional antenna -directional microphone -direction finder -disguise -dish -dish -disk -dispenser -display -display panel -distillery -ditch -ditch spade -dive bomber -doll -dolmen -domino -door -doorbell -doorlock -doornail -dormer window -dormitory -dot matrix printer -double-breasted suit -double-reed instrument -douche -dovecote -dovetail plane -downstage -drafting instrument -Dragunov -drawstring bag -dray -dredging bucket -dress -dress blues -dressing -dress uniform -drill -electric drill -drill rig -drinking fountain -drinking vessel -drip mat -drip pot -drive -drive -drogue -drogue parachute -drop-leaf table -dry battery -dry dock -dryer -dry masonry -dry wall -dugout canoe -dumdum -dumpcart -dune buggy -dungeon -duplicator -dustmop -dwelling -earphone -earthenware -easel -easy chair -edge tool -eiderdown -elastic bandage -electrical converter -electrical device -electric bell -electric frying pan -electric furnace -electric heater -electric lamp -electric motor -electric refrigerator -electro-acoustic transducer -electrode -electromagnet -electronic balance -electronic device -electronic equipment -electronic instrument -electronic voltmeter -electron microscope -electrostatic generator -electrostatic printer -elevator -embankment -embellishment -enamel -enamelware -enclosure -endoscope -engine -engine -ensemble -entrenching tool -epidiascope -equipment -eraser -escutcheon -espadrille -espresso shop -establishment -estaminet -exercise device -exhaust fan -exhibition hall -Exocet -expansion bolt -explosive device -external-combustion engine -extractor -fabric -face mask -face veil -facing -factory -fairlead -false face -fan -farm building -farm machine -fastener -fatigues -faucet -feedback circuit -fence -fencing sword -fender -ferry -fetoscope -field-sequential color television -fife -fifth wheel -fighter -figure eight -file -file server -filling -film -film -filter -filter -finery -finisher -fipple flute -fire -firearm -fire iron -fireplace -firkin -fisherman's bend -fisherman's knot -fisherman's lure -fishing boat -fishing rod -fishnet -flag -flageolet -flambeau -flannelette -flap -flashlight -flask -flatcar -flat tip screwdriver -fleet ballistic missile submarine -flight simulator -flip-flop -floating dock -floor -floor -floor cover -fly -flywheel -fob -foghorn -folder -food hamper -footbath -footbridge -foothold -foot rule -footwear -footwear -forceps -fore-and-aft sail -foremast -fore plane -fore-topmast -fork -formalwear -fortification -fortress -foundation garment -foundry -fragmentation bomb -framework -free-reed instrument -freight train -French door -friary -friction clutch -frigate -frill -frock coat -front projector -fruit machine -full-dress uniform -full metal jacket -funny wagon -fur hat -furnace -furnishing -furniture -fuse -gable -gable roof -gaff -galleon -gallery -galley -galley -gallows -galvanometer -gambling house -game -game equipment -gamp -garage -Garand rifle -garden -garden spade -garden tool -garment -gas burner -gas-discharge tube -gasket -gasoline engine -gate -gatehouse -gatepost -gathered skirt -gauge -gauze -gauze -gavel -gear -gear -gear -gearing -general-purpose bomb -generator -generator -Geneva gown -geodesic dome -girder -glass -glider -glove -glyptic art -goal -golf club -golf equipment -Gordian knot -Gothic arch -government building -government office -gown -gramophone -granary -granny knot -grapnel -grapnel -grate -graver -greasy spoon -greatcoat -great hall -greengrocery -grenade -grillroom -groined vault -Guarnerius -guidance system -guided missile -guildhall -guitar -guitar pick -gun -gun carriage -gunlock -gunsight -gun trigger -gurney -gymnastic apparatus -gym shoe -gypsy cab -habergeon -habit -hairdressing -hairpiece -hairpin -half hatchet -half hitch -hall -hall -hammer -hand -handbell -handbow -handcart -hand glass -handloom -hand lotion -hand mower -handsaw -hand shovel -hand tool -handwear -handwheel -hanger -hank -harpsichord -harrow -hash house -hat -hatch -hauberk -hawser bend -hazard -head -head -head covering -headdress -header -headgear -headlight -headsail -headscarf -health spa -heat engine -heater -heat lamp -heat-seeking missile -heavier-than-air craft -heckelphone -hedge -helicopter -helm -helmet -helmet -heraldry -high altar -high-angle gun -high gear -high table -hinge -hip boot -hitch -hoe -hogshead -hoist -holder -holding device -home appliance -homespun -hood -hood -hood -hook -Hoover -hope chest -horn -horn button -horse -horsecar -horse-drawn vehicle -horsehair wig -hosiery -hospital -hospital room -hostel -hot-air balloon -hotel -hotel room -hot tub -house -house -housing -hovel -huarache -humeral veil -hut -hutch -hydraulic brake -hydraulic system -hydroelectric turbine -hydrofoil -hydrometer -hygrometer -hypermarket -hypodermic syringe -ice machine -ice rink -ice skate -icetray -ignition switch -impact printer -implant -implement -imprint -improvised explosive device -inclined plane -indicator -induction coil -ink-jet printer -inkstand -institution -instrument -instrument of punishment -instrument of torture -interceptor -interchange -intercommunication system -intercontinental ballistic missile -interface -interior door -internal-combustion engine -ionization chamber -video iPod -iron -jack -jack -jacket -jacket -jack plane -jail -jamb -jar -jeroboam -jet -jet engine -jewelled headdress -jib -jibboom -jiggermast -joint -jointer -joist -jolly boat -jug -jumper -jumper cable -junction -junction -jury mast -kayak -keel -keg -kerchief -kettle -key -key -keyboard -keyboard instrument -khakis -kiln -kinescope -kingbolt -kirk -kit -kit -kitbag -kitchen -kitchen appliance -kitchen utensil -kite balloon -knee-high -knife -knife -knit -knob -lace -lacquer -ladder truck -lag screw -lamasery -laminate -lamination -lamp -lamp -landing gear -land mine -lantern -lapel -lathe -lattice -launcher -lead-acid battery -leather strip -Leclanche cell -leg -legging -lens -lens implant -level -lever -Levi's -lid -life buoy -life jacket -life preserver -lifting device -ligament -light -light-emitting diode -lighter-than-air craft -lighting -light microscope -linear accelerator -line printer -lingerie -lining -liquid crystal display -lister -living quarters -living room -local area network -lock -locomotive -lodge -lodging house -loft -loft -longbow -lookout -loom -loop knot -lota -lounge -loungewear -love knot -lunchroom -luxury liner -lyre -machine -machine -machine bolt -machine gun -machinery -machine screw -machine tool -magic lantern -magnet -magnetic disk -magnetic recorder -magnetic tape -magnifier -magnum -magnus hitch -mailer -mainframe -mainmast -main-topmast -main yard -makeup -mallet -mallet -mallet -mandolin -manger -man-of-war -manometer -MANPAD -mansard -mansion -marina -marker -marketplace -maser -mask -masonry -mass spectrometer -mast -mast -mat -mat -match -match -match plane -material -materiel -Matthew Walker -maul -measure -measuring instrument -measuring stick -mechanical device -mechanical system -mechanism -medical building -medical instrument -memorial -memory -memory chip -memory device -menhir -man's clothing -mercantile establishment -mercury barometer -mercury thermometer -mercury-vapor lamp -mess -metal screw -meteorological balloon -meter -meterstick -microbalance -microfilm -microscope -military hospital -military quarters -military vehicle -mill -milldam -millinery -mine -minibike -mink -minster -Minuteman -mirror -mixer -mizzenmast -module -mold -moldboard plow -monitor -monitor -morgue -mortise joint -motion-picture camera -motion-picture film -motor -motorboat -motorcycle -motor hotel -motor vehicle -mound -mount -mouse button -movie projector -moving-coil galvanometer -mug -multiplex -multiplexer -musette pipe -mushroom anchor -musical instrument -musket -musket ball -muslin -muzzle loader -narrowbody aircraft -nautilus -navigational system -naval equipment -naval gun -naval radar -naval weaponry -navigational instrument -nebuchadnezzar -neckline -neckpiece -necktie -neckwear -needle -needlework -negligee -net -net -net -net -network -network -night bell -nightwear -noisemaker -nonsmoker -non-volatile storage -nose flute -nuclear reactor -nuclear weapon -nursery -oar -oblique bandage -oboe da caccia -oboe d'amore -obstacle -office -office furniture -oil lamp -oil paint -oil tanker -olive drab -omnidirectional antenna -onion dome -open-air market -open-end wrench -opener -openside plane -ophthalmoscope -optical device -optical disk -optical instrument -optical telescope -organ pipe -outbuilding -outerwear -outfit -outrigger canoe -outside mirror -oven -overgarment -overhand knot -overhang -overhead projector -overnighter -overshoe -oxford -package -packaging -packing box -paddle -paddle steamer -page printer -paint -pallium -pan -pan -panic button -panopticon -panopticon -pantechnicon -pantry -pants suit -panzer -paper chain -paper fastener -parabolic reflector -parapet -parasail -parka -parsonage -particle detector -partition -passenger ship -passenger train -passenger van -passive matrix display -passkey -patch -patchouli -patchwork -patina -patisserie -pavis -peavey -pedal -pedestal table -pedestrian crossing -pedicab -peg -pen -penal institution -pencil -pendulum -pendulum clock -percolator -percussion instrument -perfumery -peripheral -periwig -personal computer -petticoat -Phillips screw -Phillips screwdriver -phonograph record -photographic equipment -photographic paper -photometer -physical pendulum -piano -piccolo -pick -pick -pickle barrel -piece of cloth -pile -pillow lace -pilothouse -pin -pincer -pinstripe -pipe -pipet -pipe wrench -pistol -pivot -place of business -place of worship -planetarium -planner -plant -planter -plasterboard -plastic laminate -plastic wrap -plastron -plate -platform -platform -platform rocker -plating -pleat -plethysmograph -plexor -pliers -plug -plug -pneumatic drill -pocket -pocket-handkerchief -pocketknife -pointed arch -polyester -polygraph -pomade -pontifical -pool ball -poorhouse -porcelain -porch -portable computer -portico -post -posthole digger -pot -potential divider -potpourri -pottery -pouch -poultice -powder -powder keg -power brake -power mower -power saw -power shovel -power tool -press -press -pressure dome -pressure gauge -pressure suit -printed circuit -printer -prison camp -prod -prolonge knot -prompter -prong -propeller -propeller plane -prosthesis -protective covering -protective garment -pruning saw -pruning shears -public house -public toilet -public transport -pull -pull chain -pulley -Pullman -pullover -pulse counter -pump -pump -pump house -punch -punch press -purifier -push broom -push button -pusher -puzzle -pyrometer -pyx -QWERTY keyboard -racing boat -rack -rack -radar -radiogram -radio interferometer -radio link -radiometer -radio receiver -radiotelegraph -radiotelephone -radio transmitter -raft -rail -rail fence -railing -raincoat -rake -ramp -rampart -random-access memory -rayon -razor -reaction-propulsion engine -reactor -reading lamp -reading room -read-only memory -rearview mirror -receiver -receptacle -reception room -recess -reconnaissance plane -recorder -recording -record player -recreation room -recycling bin -reed stop -reef knot -refectory table -refinery -reflecting telescope -reflector -reformatory -refracting telescope -refrigerator car -refuge -regalia -regimentals -regulator -rein -religious residence -removable disk -repair shop -repeating firearm -reproducer -rescue equipment -reservoir -reset button -residence -resistor -resonator -respirator -restraint -retort -rheostat -rib -ribbed vault -riddle -ride -riding boot -riding mower -rifle ball -rig -rink -river boat -road -roadway -robe -rocket -rocket -rod -roller -roller -in-line skate -roller blind -roller coaster -rolling hitch -Rolodex -Roman building -roof -roof -room -roost -rope -rose water -rotary engine -rotating mechanism -rotating shaft -rotisserie -rotor -round arch -router plane -row house -royal mast -rubber bullet -rug -rushlight -sable -sable coat -sack -sackbut -sacking -saddle -safe -safety belt -safety curtain -safety fuse -safety match -sail -sailboat -sailing vessel -salver -sandglass -sash -satellite -satellite television -saucepan -savings bank -saw -sawhorse -scale -scarf -school -scientific instrument -scissors -scoop -scratcher -screen -screen -screen -screw eye -scrub plane -scuffer -sculpture -sea boat -sea chest -seam -seaplane -seat -seat -second hand -secretary -security system -seeker -selector -self-propelled vehicle -semiautomatic firearm -semiautomatic pistol -semiconductor device -serger -serpent -serving cart -serving dish -set -setscrew -setscrew -sewing needle -sextant -shackle -shade -shaft -shag rug -shaker -shaper -shaping tool -sharpener -shaving cream -shaving foam -shawl -shawm -shears -sheath -shed -sheepshank -sheet bend -shelf -shell -shell -shell -shellac -shelter -shelter -shelter -shield -ship -shipboard system -shirt -shirtfront -shock absorber -shoe -shooting brake -shop -short pants -shotgun -shoulder holster -shrine -shutter -shuttle -sidewinder -sieve -sifter -sights -signaling device -signboard -silk -simulator -single bed -single-breasted suit -single-reed instrument -sitz bath -six-pack -skate -skein -skeleton -skewer -skidder -skid lid -skiff -ski pole -skirt -ski tow -skullcap -slack suit -slat -sled -sleeper -sleeping car -sleeve -sleeve -slide projector -slipknot -slipper -sloop -slop pail -slot machine -small boat -smart bomb -smoker -smooth plane -snack bar -snap-brim hat -snare drum -sniper rifle -Sno-cat -soapbox -socle -sofa -sonograph -sorter -sound recording -soup ladle -source of illumination -soutane -spacecraft -spade -spar -spatula -spear -spear -spectacles -spectrograph -spectroscope -speedometer -spider -spike -spike -spinet -spinning machine -spiral ratchet screwdriver -spiral spring -spit -spokeshave -sponge mop -spoon -sports equipment -sports implement -sportswear -spot -spring -spring balance -springboard -sprit -square -square knot -squash racket -squawk box -squeezer -squinch -stabilizer -stabilizer -stable gear -stadium -stall -stamp mill -stand -standard cell -staple -starter -state prison -station -statue -stay -steakhouse -stealth aircraft -stealth bomber -stealth fighter -steam bath -steamboat -steamer -steam iron -steam whistle -steel mill -steelyard -steeple -steering system -step -step-up transformer -stereo -stick -stick -still -stilt -Stinger -stock -stockcar -stock car -stocking -stonework -stool -stopper knot -storage battery -storage space -storeroom -stove -stove bolt -Stradavarius -straight chair -strap -strap -stringed instrument -strip -strongbox -stronghold -strongroom -structural member -structure -stylus -submachine gun -submersible -submersible -subwoofer -suction pump -suede cloth -sunbonnet -sunhat -supermarket -superstructure -supply chamber -support -support -support column -supporting structure -supporting tower -surface lift -surface-to-air missile -surgeon's knot -surgical instrument -surgical knife -surplice -surveillance system -surveying instrument -surveyor's level -swamp buggy -sweater -swimsuit -sword -synchrotron -system -tabi -table -table -table knife -tableware -tabor -tachometer -tack -tack hammer -talaria -tambour -tambourine -tampon -tank -tank car -tannoy -tape -tape deck -tape recorder -target -tavern -tea chest -teaching aid -tea gown -teashop -teaspoon -tea-strainer -tea tray -telecommunication system -telephone -telephone line -telephone receiver -telephone system -telephone wire -telescope -television antenna -television camera -television equipment -television monitor -temple -temple -tender -tennis racket -tenor drum -tenoroon -tenpenny nail -tent -tenterhook -terminal -terminal -test rocket -tetraskelion -textile machine -textile mill -theater -theodolite -thermometer -thermostat -three-piece suit -three-way switch -thumbscrew -thumbtack -tights -tile -timber -timber hitch -timbrel -time-fuse -timepiece -timer -time-switch -tire chain -tithe barn -toecap -toga -toggle switch -toilet -toilet powder -toiletry -toilet water -token -tomograph -toner -tongs -tool -toolbox -tooth -toothbrush -top -top -topgallant -topmast -topsail -torpedo -torpedo boat -touch screen -towel -toweling -tower -toy box -track -tracked vehicle -trailer -trailer -train -trammel -transdermal patch -transformer -transistor -transmission -transmitter -transporter -trap -trapeze -travel iron -treasure chest -trellis -trench -trial balloon -triclinium -troop carrier -trough -trouser -trowel -truck -trunk -try square -tube -tuck shop -tun -tunic -turbine -Turkish towel -Turk's head -turner -turntable -turtleneck -tweed -tweeter -twenty-two -two-piece -typesetting machine -typewriter -ultraviolet lamp -undercarriage -undergarment -underpants -underwear -uneven parallel bars -uniform -university -uplift -urn -urn -utensil -vacuum flask -valve -van -van -varnish -vehicle -veranda -vertical file -vessel -vessel -vest -vibrator -vibrator -videocassette -video recording -vigil light -viol -vise -vivarium -voltaic cell -voltmeter -wagon -waist pack -walking stick -wall -wall -wall unit -ward -warehouse -warship -wash -washer -washtub -watch -watchtower -water-base paint -water butt -water cart -watercolor -water-cooled reactor -water gauge -water ski -waterwheel -weapon -weaponry -weatherglass -weathervane -web -wedge -wedge -weighbridge -weight -weir -weld -well -whaler -wheel -wheelchair -wheeled vehicle -wheelwork -whetstone -whip -whisk -whispering gallery -white goods -whorehouse -wicker basket -widebody aircraft -winch -Winchester -wind instrument -window -window -window blind -window envelope -Windsor knot -wine bucket -wine cask -wineglass -wire -wire -wire matrix printer -wiring -woman's clothing -wood -woodenware -woodscrew -woodwind -woofer -workbasket -workbench -work-clothing -worktable -workwear -wrapping -wrench -writing desk -writing implement -X-ray film -X-ray machine -yacht chair -yard -yard -yardstick -yoke -zither -zoot suit -grain -light -colorlessness -chromatic color -black -gray -dark red -orange -yellow -green -blue -purple -reddish purple -pink -light brown -reddish brown -complexion -skin -epidermal cell -columnar cell -macule -specimen -milk -embryonic cell -leukocyte -neutrophil -astrocyte -exoskeleton -medium -film -press -print media -storage medium -journalism -photojournalism -newspaper -telecommunication -telephone -call -long distance -wireless -broadcasting -television -reception -chat room -portal site -wordbook -album -concept album -magazine -movie -sign -comestible -course -dainty -dish -fare -diet -dietary supplement -liquid diet -reducing diet -vegetarianism -ration -field ration -foodstuff -starches -concentrate -meal -roughage -flour -wheat flour -nutriment -commissariat -canned food -canned meat -meal -breakfast -lunch -dinner -supper -buffet -picnic -cookout -bite -entree -side dish -casserole -chicken casserole -appetizer -cocktail -hors d'oeuvre -relish -dip -soup -madrilene -broth -broth -chowder -clam chowder -stew -goulash -fish stew -fricassee -ragout -ready-mix -powdered sugar -granulated sugar -brown sugar -sweet -confiture -candy -hard candy -patty -brittle -chewing gum -candied fruit -candied citrus peel -fudge -gumdrop -mint -kiss -lozenge -taffy -dessert -dumpling -frozen dessert -mousse -mousse -whip -pudding -pudding -tipsy cake -ice -chocolate ice cream -Neapolitan ice cream -peach ice cream -strawberry ice cream -tutti-frutti -vanilla ice cream -split -pudding -custard -pastry -turnover -puff paste -phyllo -fish cake -conserve -jam -jelly -apple jelly -marmalade -gelatin -gelatin dessert -patty -stuffing -bread -breadstick -bun -cracker -dark bread -flatbread -loaf of bread -quick bread -rye bread -toast -white bread -French bread -cornbread -johnnycake -muffin -scone -onion roll -sweet roll -onion bagel -biscuit -baking-powder biscuit -soft pretzel -sandwich -hamburger -gruel -edible fruit -vegetable -crudites -legume -greens -solanaceous vegetable -root vegetable -potato -baked potato -sweet potato -snack food -corn chip -tortilla chip -cruciferous vegetable -cabbage -kale -red cabbage -savoy cabbage -squash -summer squash -yellow squash -winter squash -turban squash -gherkin -sprout -beet -pepper -sweet pepper -hot pepper -chili -jalapeno -onion -Spanish onion -salad green -lettuce -butterhead lettuce -bean -pea -green pea -common bean -fresh bean -green bean -shell bean -lima bean -soy -celery -chicory -coffee substitute -chicory escarole -corn -hominy -cress -tomato -cherry tomato -salsify -turnip -edible nut -apple -eating apple -Delicious -McIntosh -Pippin -cooking apple -berry -currant -citrus -temple orange -mandarin -bitter orange -sweet orange -Jaffa orange -navel orange -Valencia orange -lime -almond -plum -dried fruit -raisin -passion fruit -cocoa -melon -muskmelon -winter melon -cherry -sweet cherry -heart cherry -sour cherry -grape -fox grape -muscadine -slipskin grape -vinifera grape -Tokay -cherimoya -soursop -sweetsop -ilama -pond apple -olive -pear -edible seed -walnut -feed -fodder -oil cake -timothy -grain -barley -wheat -rice -mash -bird feed -petfood -salad -tossed salad -combination salad -pasta salad -fruit salad -ingredient -flavorer -condiment -herb -spice -cinnamon -pepper -garlic -mustard -sage -savory -curry -paprika -pickle -sweet pickle -vinegar -sauce -hot sauce -dressing -mayonnaise -cheese sauce -hot-fudge sauce -white sauce -spaghetti sauce -boiled egg -hard-boiled egg -Easter egg -omelet -firm omelet -souffle -dairy product -milk -milk -powdered milk -cream -butter -clarified butter -yogurt -curd -cheese -cream cheese -bleu -cheddar -Swiss cheese -spread -pate -sweetening -sugar -syrup -batter -bread dough -chicken and rice -pasta -Tetrazzini -chili dog -fondue -fondue -hash -kabob -seafood Newburg -meatball -pilaf -sausage pizza -pepperoni pizza -cheese pizza -anchovy pizza -Sicilian pizza -porridge -fish loaf -salmon loaf -scallopine -taco -beef burrito -quesadilla -tostada -beverage -concoction -mix -filling -potion -elixir -alcohol -brew -beer -lager -Weissbier -malt -ale -stout -mead -wine -white wine -sparkling wine -Burgundy -Beaujolais -Medoc -Pinot noir -Bordeaux -claret -Chianti -Cabernet -Merlot -dessert wine -Rhine wine -Rioja -Saint Emilion -zinfandel -table wine -vermouth -fortified wine -Madeira -liquor -brandy -gin -rum -whiskey -corn whiskey -Irish -Scotch -liqueur -coffee liqueur -orange liqueur -mixed drink -cocktail -highball -Bloody Mary -daiquiri -manhattan -martini -sling -sour -caffe latte -cider -sweet cider -juice -fruit juice -grape juice -orange juice -fruit drink -mulled wine -soft drink -cola -coffee -punch -champagne cup -claret cup -rickey -tea -tea -herb tea -tisane -black tea -green tea -water -drinking water -mineral water -vitamin pill -collection -suburb -residence -littoral -grassland -pasture -resort -field -air bubble -arroyo -ascent -atoll -bank -bank -bar -barrier reef -basin -beach -burrow -canyon -cave -continental glacier -crag -crater -dale -descent -draw -dune -geological formation -glacier -glen -gorge -gulch -gully -highland -hill -hillside -hole -hollow -iceberg -ice mass -ion -knoll -landfall -landfill -lather -ledge -lowland -meteorite -mountain -mull -natural depression -natural elevation -nullah -ocean floor -outcrop -plain -point -precipice -ravine -reef -ridge -ridge -rift valley -rock -sandbank -seaside -shiner -shore -slope -soapsuds -spume -tableland -tideland -volcanic crater -wadi -spiritual leader -adventurer -anomaly -benefactor -commoner -contestant -discussant -entertainer -female -finisher -inhabitant -native -juvenile -lover -male -mediator -national -peer -recipient -sensualist -traveler -unwelcome person -unskilled person -worker -wrongdoer -Black -White -Semite -white man -Mongol -Nahuatl -Caddo -Penutian -Teton -Taracahitian -Slav -Catholic -Altaic -Bornean -Canadian -Central American -Britisher -English person -Englishwoman -Ethiopian -Parisian -Greek -Italian -Japanese -Mexican -Nigerian -North American -Pakistani -South American Indian -Filipino -Polynesian -Scandinavian -South African -South American -Turki -American -New Yorker -abbess -abstainer -academic administrator -accomplice -acquaintance -acquirer -aerialist -actor -actor -addict -adjutant -admirer -adulterer -advertiser -advocate -analyst -ancestor -announcer -announcer -appointee -appreciator -appropriator -archbishop -architect -army engineer -army officer -arrival -articulator -asserter -assistant -associate -astronaut -athlete -attendant -aunt -authoritarian -authority -aviator -back -bad person -ballet dancer -bullfighter -baron -bartender -baseball coach -base runner -basketball player -believer -betrothed -bigot -big shot -biochemist -bisexual -boatman -bond servant -botanist -Boy Scout -buddy -campaigner -captain -card player -careerist -caretaker -cavalryman -celebrity -charmer -child -child -cipher -citizen -civil rights leader -cleaner -clergyman -cleric -clerk -climber -closer -clown -coach -cobbler -collaborator -college student -collegian -commanding officer -commissioned officer -commissioned military officer -commissioner -committee member -communist -compulsive -computer scientist -computer user -contractor -convict -copycat -counselor -craftsman -creditor -critic -curate -dancer -dancer -darling -date -daughter -dawdler -deacon -deaf person -debtor -deliveryman -descender -designated hitter -detective -detractor -director -disbeliever -dispatcher -distributor -doctor -domestic partner -draftsman -drinker -drinker -drug addict -drug user -drummer -drunkard -eager beaver -earner -eavesdropper -economist -editor -egotist -elder -elected official -emissary -employee -employer -endomorph -enemy -entrant -examiner -exhibitionist -fan -fancier -farmer -farmhand -fascist -father -female aristocrat -female offspring -female child -fielder -fireman -first baseman -first sergeant -flag officer -flatterer -foe -folk dancer -follower -football player -forefather -forger -founder -free agent -friar -monk -gambler -generator -geneticist -genitor -geologist -girl -godchild -godparent -golfer -grandma -grandmaster -grandparent -granter -great grandchild -great grandparent -grouch -guard -guest -guide -gymnast -Gypsy -hack -hairdresser -hater -headmaster -hearer -hedonist -heir -herder -homeless -horseman -host -host -hypocrite -important person -incumbent -infielder -informer -in-law -insurgent -investigator -investor -journalist -judge -juror -Counsel to the Crown -kinswoman -laborer -lama -landowner -lawgiver -lawman -lawyer -liberator -lieutenant -lineman -literate -litigant -Lord -failure -lowerclassman -lumberman -maid -maker -malcontent -martinet -master of ceremonies -masturbator -medical officer -medical practitioner -medical scientist -mender -meteorologist -middle-aged man -miler -military attache -military officer -military policeman -minister -minor leaguer -misfit -mixed-blood -model -moneymaker -mother -mourner -mover -musician -Muslimah -mystic -nanny -neonate -nephew -neutral -newcomer -newcomer -newspaper editor -niece -noncommissioned officer -nurse -observer -occultist -oldster -old woman -opportunist -orator -originator -outfielder -right fielder -right-handed pitcher -painter -panelist -pardoner -parodist -party -passenger -patient -patron -payer -peddler -percussionist -personal representative -personification -pervert -petitioner -Pharaoh -phonetician -physical therapist -physicist -pimp -pisser -pitcher -planner -player -poet -politician -practitioner -prayer -preserver -president -priest -princess -principal -proctor -programmer -promiser -propagandist -prosecutor -psychic -pusher -queen -queen -ranch hand -reader -recruit -recruiter -religious leader -repairman -reporter -representative -reprobate -rescuer -reservist -restrainer -retailer -retiree -revolutionist -rich person -civil authority -runner -running back -rustic -saboteur -sailor -salesman -salesperson -scalper -schemer -scholar -schoolchild -scientist -second baseman -secretary -seeker -selfish person -seller -serf -serviceman -settler -shrew -sibling -sick person -singer -sister -skeptic -skier -sleeper -slob -smith -snoop -social climber -socialist -social scientist -sociologist -soldier -son -songster -sorcerer -sovereign -speaker -specialist -spectator -stand-in -star -stepparent -stock trader -stranger -strategist -student -subordinate -suitor -superior -surgeon -sweetheart -sympathizer -tax assessor -taxonomist -teacher -television reporter -tenant -tenant -tennis player -testator -testee -theologian -therapist -thinker -thrower -toastmaster -trader -traffic cop -trainer -traitor -traveling salesman -tyrant -upstart -upstart -utility man -vacationer -vegetarian -vice president -victim -volunteer -votary -waiter -waitress -wanderer -wanton -washer -white supremacist -wife -winner -winner -woman -workman -worshiper -wright -writer -wilding -bryophyte -liverwort -pteridophyte -fern -fern ally -spore -spermatophyte -perennial -gymnosperm -ephedra -cycad -sago palm -zamia -pine -pinon -nut pine -white pine -yellow pine -larch -fir -silver fir -cedar -spruce -hemlock -douglas fir -cedar -cypress -arborvitae -araucaria -kauri pine -celery pine -yellowwood -gymnospermous yellowwood -yew -angiosperm -dicot -flower -wildflower -inflorescence -pistil -pericarp -oilseed -custard apple -barberry -allspice -laurel -anise tree -magnolia -moonseed -buttercup -aconite -baneberry -anemone -thimbleweed -columbine -clematis -delphinium -nigella -wax myrtle -zebrawood -legume -legume -darling pea -clover -acacia -wattle -albizzia -nitta tree -dogbane -allamanda -carissa -frangipani -rauwolfia -arum -alocasia -anthurium -caladium -monstera -nephthytis -arrow arum -calla lily -duckweed -watermeal -birthwort -sandwort -mouse-ear chickweed -pink -china pink -lychnis -silene -chickweed -fig marigold -amaranth -orach -saltbush -beet -sand verbena -four o'clock -echinocactus -prickly pear -pokeweed -portulaca -flame flower -caper -spiderflower -crucifer -cress -watercress -rock cress -cabbage -head cabbage -turnip plant -mustard -wallflower -woad -stock -radish plant -pennycress -poppy -prickly poppy -composite -compass plant -everlasting -achillea -ageratum -ragweed -ammobium -burdock -artemisia -mugwort -aster -wood aster -common daisy -bur marigold -calendula -thistle -carline thistle -catananche -centaury -knapweed -chrysanthemum -golden aster -goldenbush -plume thistle -woolly thistle -coreopsis -fleabane -woolly sunflower -cotton rose -gazania -African daisy -cudweed -gumweed -goldenbush -sneezeweed -sunflower -hawkweed -marsh elder -krigia -hawkbit -blazing star -rattlesnake root -daisybush -coneflower -coneflower -cutleaved coneflower -golden thistle -white-topped aster -goldenrod -sow thistle -marigold -dandelion -crownbeard -zinnia -achene -campanula -orchid -orchis -arethusa -helleborine -coral root -lady's slipper -large yellow lady's slipper -helleborine -fringed orchis -rein orchid -spider orchid -moth orchid -butterfly orchid -ladies' tresses -vanda -vanilla -yam -primrose -pimpernel -featherfoil -loosestrife -water pimpernel -gramineous plant -grass -wheatgrass -foxtail -broom grass -oat -brome -grama -reed grass -burgrass -crabgrass -lyme grass -wild rye -plume grass -rye grass -ricegrass -meadowgrass -millet -reed -sorghum -grain sorghum -cordgrass -cereal -wheat -corn -mealie -zoysia -bamboo -cotton grass -spike rush -pandanus -cattail -grain -kernel -gourd -gourd -squash -summer squash -marrow -winter squash -turban squash -bryony -sweet melon -luffa -lobelia -mallow -hollyhock -althea -poppy mallow -seashore mallow -globe mallow -tulipwood tree -sterculia -bottle-tree -screw tree -cacao -linden -herb -protea -banksia -grevillea -macadamia -casuarina -beefwood -heath -bearberry -huckleberry -kalmia -rhododendron -cranberry -blueberry -shortia -Australian heath -epacris -wintergreen -pipsissewa -beech -chestnut -tanbark oak -southern beech -New Zealand beech -oak -live oak -white oak -red oak -scrub oak -chestnut oak -birch -alder -hornbeam -hop hornbeam -hazelnut -centaury -gentian -fringed gentian -olive tree -fringe tree -ash -red ash -jasmine -privet -lilac -liquidambar -walnut -hickory -wing nut -loosestrife -myrtle -gum tree -eucalyptus -flooded gum -mallee -stringybark -tupelo -enchanter's nightshade -willowherb -fuchsia -evening primrose -daphne -canna -banana -ginger -begonia -tuberous begonia -poon -St John's wort -rockrose -dipterocarp -candlewood -reseda -viola -violet -nettle -cannabis -mulberry -fig tree -fig -elm -hackberry -iridaceous plant -bearded iris -beardless iris -crocus -amaryllis -blood lily -narcissus -daffodil -liliaceous plant -colicroot -alliaceous plant -kniphofia -poker plant -asphodel -mariposa -globe lily -camas -dogtooth violet -fritillary -tulip -star-of-Bethlehem -grape hyacinth -scilla -false asphodel -bog asphodel -hellebore -death camas -sarsaparilla -Solomon's-seal -bellwort -agave -sansevieria -cassia -locust tree -senna -angelim -milk vetch -wild indigo -pea tree -glory pea -rosewood -blackwood -tick trefoil -coral tree -vetchling -wild pea -lupine -medic -mucuna -locoweed -pole bean -pea -edible-pod pea -quira -hoary pea -bush pea -vetch -palm -sago palm -feather palm -fan palm -palmetto -areca -calamus -oil palm -raffia palm -lady palm -eriogonum -rhubarb -water plantain -waterweed -pondweed -rose -agrimonia -flowering quince -cotoneaster -avens -apple tree -wild apple -crab apple -Iowa crab -cinquefoil -plum -wild plum -bullace -apricot -cherry -wild cherry -sweet cherry -sour cherry -almond tree -almond -bird cherry -flowering cherry -chokecherry -fruit tree -bramble bush -raspberry -mountain ash -service tree -spirea -madderwort -coffee -cinchona -bedstraw -genipa -hamelia -honeysuckle -American fly honeysuckle -teasel -scabious -geranium -cranesbill -storksbill -incense tree -mahogany -silver ash -milkwort -citrus -orange -mandarin -lemon -kumquat -prickly ash -bitterwood tree -ailanthus -nasturtium -willow -osier -sallow -poplar -black poplar -cottonwood -aspen -soapberry -soapberry vine -harpullia -pachysandra -spindle tree -maple -box elder -holly -sumac -horse chestnut -persimmon -buckthorn -styrax -carnivorous plant -pitcher plant -sedum -philadelphus -saxifrage -astilbe -alumroot -miterwort -parnassia -currant -plane tree -phlox -acanthus -catalpa -anchusa -comfrey -convolvulus -bindweed -gloxinia -streptocarpus -waterleaf -nemophila -scorpionweed -giant hyssop -bugle -wood mint -calamint -coleus -dead nettle -origanum -horehound -monarda -savory -germander -thyme -blue curls -snapdragon -kitten-tails -Indian paintbrush -foxglove -toadflax -veronica -nightshade -thorn apple -matrimony vine -cupflower -petunia -salpiglossis -spurge -croton -cassava -slipper spurge -camellia -umbellifer -angelica -astrantia -caraway -fennel -parsnip -parsley -sanicle -dogwood -valerian -bristle fern -flowering fern -climbing fern -clover fern -adder's tongue -grape fern -ergot -sclerotinia -earthball -Podaxaceae -false truffle -rhizopus -slime mold -cellular slime mold -downy mildew -pythium -Sarcosomataceae -club fungus -lichen -lecanora -fungus -basidiomycete -mushroom -mushroom -mushroom -toadstool -horse mushroom -meadow mushroom -royal agaric -false deathcap -fly agaric -death cap -blushing mushroom -destroying angel -chanterelle -floccose chanterelle -pig's ears -cinnabar chanterelle -jack-o-lantern fungus -inky cap -shaggymane -milkcap -fairy-ring mushroom -oyster mushroom -olive-tree agaric -Pholiota astragalina -Pholiota aurea -Pholiota destruens -Pholiota flammans -Pholiota flavida -nameko -Pholiota squarrosa-adiposa -Pholiota squarrosa -Pholiota squarrosoides -Stropharia ambigua -Stropharia hornemannii -Stropharia rugoso-annulata -Entoloma lividum -Entoloma aprile -Chlorophyllum molybdites -lepiota -parasol mushroom -poisonous parasol -Lepiota naucina -Lepiota rhacodes -American parasol -Lepiota rubrotincta -Lepiota clypeolaria -onion stem -blewits -sandy mushroom -Tricholoma pessundatum -Tricholoma sejunctum -man-on-a-horse -Tricholoma venenata -Tricholoma pardinum -Tricholoma vaccinum -Tricholoma aurantium -Pluteus aurantiorugosus -Pluteus magnus -deer mushroom -straw mushroom -Volvariella bombycina -Clitocybe clavipes -Clitocybe dealbata -Clitocybe inornata -Clitocybe robusta -Clitocybe irina -Clitocybe subconnexa -winter mushroom -mycelium -ascomycete -Clavicipitaceae -yeast -discomycete -morel -Verpa -false morel -lorchel -helvella -Gyromitra californica -Gyromitra sphaerospora -Gyromitra esculenta -Gyromitra infula -Gyromitra gigas -gasteromycete -common stinkhorn -Phallus ravenelii -dog stinkhorn -stinky squid -puffball -Geastrum coronatum -Astreus pteridis -Astreus hygrometricus -polypore -Boletus chrysenteron -Boletus edulis -Frost's bolete -Boletus luridus -Boletus mirabilis -Boletus pallidus -Boletus pulcherrimus -Boletus pulverulentus -Boletus roxanae -Boletus subvelutipes -Boletus variipes -Boletus zelleri -Fuscoboletinus paluster -Fuscoboletinus serotinus -Leccinum fibrillosum -Suillus albivelatus -old-man-of-the-woods -Boletellus russellii -jelly fungus -rust -smut -cornsmut -flag smut fungus -waxycap -Hygrocybe acutoconica -Hygrophorus borealis -Hygrophorus caeruleus -Hygrophorus inocybiformis -Hygrophorus kauffmanii -Hygrophorus marzuolus -Hygrophorus purpurascens -Hygrophorus russula -Hygrophorus sordidus -Hygrophorus tennesseensis -Hygrophorus turundus -Neohygrophorus angelesianus -Cortinarius armillatus -Cortinarius atkinsonianus -Cortinarius corrugatus -Cortinarius gentilis -Cortinarius mutabilis -Cortinarius semisanguineus -Cortinarius subfoetidus -Cortinarius violaceus -Gymnopilus spectabilis -Gymnopilus validipes -Gymnopilus ventricosus -mold -mildew -candida -houseplant -succulent -weed -sporophyll -sporangium -poisonous plant -vine -tree -bean tree -gymnospermous tree -conifer -angiospermous tree -nut tree -spice tree -bonsai -subshrub -bramble -liana -desert plant -marsh plant -strangler -root -receptacle -scape -peduncle -flower cluster -raceme -cyme -bulbous plant -fruit -seed -bean -nut -berry -aggregate fruit -drupe -drupelet -pome -pod -husk -buckthorn -vinifera -true pepper -peperomia -bract -palmate leaf -pinnate leaf -dentate leaf -branchlet -polypody -strap fern -staghorn fern -spleenwort -chain fern -davallia -hare's-foot fern -shield fern -wood fern -lady fern -bladder fern -holly fern -woodsia -maidenhair -brittle maidenhair -lip fern -cliff brake -horsetail -club moss -spikemoss -beech fern -shoestring fungus -Armillaria caligata -Armillaria ponderosa -Armillaria zelleri -honey mushroom -milkweed -stapelia -stephanotis -orangery -figure -plane figure -solid figure -line -convex shape -concave shape -cylinder -round shape -polygon -concave polygon -amorphous shape -closed curve -simple closed curve -cone -circle -ring -loop -ellipse -triangle -spherical polygon -angular distance -groove -bulge -bow -balance -toroid -boundary -incisure -notch -wrinkle -tree -regular polyhedron -carbon -rock -soil -high explosive -culture medium -agar -paper -paving -plaster -stucco -tear gas -vitamin -fat-soluble vitamin -water-soluble vitamin -vitamin A -B-complex vitamin -vitamin E -vitamin K diff --git a/build/darknet/x64/data/inet9k.map b/build/darknet/x64/data/inet9k.map deleted file mode 100644 index c91b3c15acc..00000000000 --- a/build/darknet/x64/data/inet9k.map +++ /dev/null @@ -1,200 +0,0 @@ -2687 -4107 -8407 -7254 -42 -6797 -127 -2268 -2442 -3704 -260 -1970 -58 -4443 -2661 -2043 -2039 -4858 -4007 -6858 -8408 -166 -2523 -3768 -4347 -6527 -2446 -5005 -3274 -3678 -4918 -709 -4072 -8428 -7223 -2251 -3802 -3848 -7271 -2677 -8267 -2849 -2518 -2738 -3746 -5105 -3430 -3503 -2249 -1841 -2032 -2358 -122 -3984 -4865 -3246 -5095 -6912 -6878 -8467 -2741 -1973 -3057 -7217 -1872 -44 -2452 -3637 -2704 -6917 -2715 -6734 -2325 -6864 -6677 -2035 -1949 -338 -2664 -5122 -1844 -784 -2223 -7188 -2719 -2670 -4830 -158 -4818 -7228 -1965 -7342 -786 -2095 -8281 -8258 -7406 -3915 -8382 -2437 -2837 -82 -6871 -1876 -7447 -8285 -5007 -2740 -3463 -5103 -3755 -4910 -6809 -3800 -118 -3396 -3092 -2709 -81 -7105 -4036 -2366 -1846 -5177 -2684 -64 -2041 -3919 -700 -3724 -1742 -39 -807 -7184 -2256 -235 -2778 -2996 -2030 -3714 -7167 -2369 -6705 -6861 -5096 -2597 -2166 -2036 -3228 -3747 -2711 -8300 -2226 -7153 -7255 -2631 -7109 -8242 -7445 -3776 -3803 -3690 -2025 -2521 -2316 -7190 -8249 -3352 -2639 -2887 -100 -4219 -3344 -5008 -7224 -3351 -2434 -2074 -2034 -8304 -5004 -6868 -5102 -2645 -4071 -2716 -2717 -7420 -3499 -3763 -5084 -2676 -2046 -5107 -5097 -3944 -4097 -7132 -3956 -7343 diff --git a/build/darknet/x64/data/labels/100_0.png b/build/darknet/x64/data/labels/100_0.png deleted file mode 100644 index 77878ecc6f6b416896bbf2b8986aa55ccd2f6342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^96-zsA{f#?O#TU^SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_Q-UR@G-fAyZEm#}JO|$v^m6&UOF)pMKzw#>3K$42EXi_x7IUPcmtD zS~@NJZFVdQ&MBb@0C~My`v3p{ diff --git a/build/darknet/x64/data/labels/100_1.png b/build/darknet/x64/data/labels/100_1.png deleted file mode 100644 index 86181c0b479e96a019a8ed316955e0d915b58a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmeAS@N?(olHy`uVBq!ia0vp@KrF@qBpB=_dj0@XEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4}5r*_XAID#R(foNHMqa%6MchbYM#*Z=;H zV=;ZYTZ_5bz`R-L%D3egoz~p?91z>~%D$_DVT0MV^41sT*MK&wmbgZgq$HN4S|t~y z0x1R~14A=iLqlBy(+~r5D`O)oV+&m%!@%I$Jx68~4Y~O#nQ4`{H7sxb3Gpt_hMdHt X)EtJC>o@a2fz06P>gTe~DWM4f=m&g{ diff --git a/build/darknet/x64/data/labels/100_2.png b/build/darknet/x64/data/labels/100_2.png deleted file mode 100644 index 5d430467d64659407898d3373b718f548e6e0fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^!a%IR0VEi%UX=lHSkfJR9T^xl_H+M9WCckkdj$D1 zFjT2AFf_Ckr_Wm>bfjssS zPhVH|2i&ZD3i|6pT|NMXc6hothG?8m{?X5{y{WnRK656U%Ere$JUr*w7vESvcdqdF zzs`cus=QAOR>(LDWv4VST+=MrcvWFvaphKSWqqGF>$RAfKc`JtnJtl+w7jt=sbg=W z!N!*k$5cCRRLzjMz*e^6_qu~eUP($ES&(F&m}J}#R@2y#+t4|e#b}ztk(!5j6WO!& zF$%p(XxLpTHsNUW#=?ol%ua9S+h57&*~sz#-{P{a$CR+(-9vfTRyFgBb9ftc$ z&rPhC5ZZl4!oi_ZZ`G0eHf$0df17m#&o(gRdI$+0RH{jwTKdq2=gpadPX9j&A1{@gHqROC-tdHC=5d4hTeSyNgSYV_DA|6si| zyM4lirq>Cqn>Gmw1!{8Z z^gcyZuAUI1Bo&64N1h(_vDtbV=y}x=*NBpo#FA92t_x%s7(DxFk&B`sH$NpatrE9}=}Q_efbP0 Hl+XkKL0`32 diff --git a/build/darknet/x64/data/labels/100_4.png b/build/darknet/x64/data/labels/100_4.png deleted file mode 100644 index d22f891c21e795e4a96870f4b50e560fa2fd8b83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmeAS@N?(olHy`uVBq!ia0vp^azJd#0VEiT4OqH?6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeM~ zFY)wsWq-iU%BRTQ^!u(i0|TR(r;B5V#p&c9{hZfInGZS{OlIufV$Lk^qTh=@@8xdO zvKpO7>n7VJOseUIA)~(5`Ol&zv#rJdWCmZog7m&Ph1i|Ad|er zq56E6%3cAT*jAYp(>yNKCcHd);?hZvOQi`fZBJZU>TyXl;pOQQmsmY6%}scjeB#nZ zk4xSMFKJI$S~_t_fAiAf2`Tdp6+QnyVJmdmuefA&0Mk|RGpk!q&r5foc#r3qp>ETu zxT#LPlj?5?)P2iV`2IU3;!?x$?}=_1MjJXm2sNp5xg=@1`|75BTXE_Cr3tB}_ZKX` zQg8h5Wbeuk*3)u6lug@iWIlUN>FL@lJk7eoyM+js%nXAL`h0w zNvc(HQ7VvPFfuSS(={~IH82e^Ft;)`wlXl&1u_f_p05dOM$wR)pOTqYiCe?8kMHck e(FU|3Cow5Chau(q%{)+IVeoYIb6Mw<&;$TaeB59F diff --git a/build/darknet/x64/data/labels/100_5.png b/build/darknet/x64/data/labels/100_5.png deleted file mode 100644 index 7f65183fda65ae392f0a4dc4b4f38e7d82f074c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^%0TSE0VEiNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5`mMvaIb1_s6)PZ!4!kK@Td`ekF{dDz}Ni2 zKPS3P5z=m-^Zv^99am~}9wjy~t(&ADarMpgbO)xc@Qo`X4;^Y?YROApG4uG52DUHN z7p}x4q#t0owIZu7a$$GcRQ z&|1hgd%S2cWNw@Fzx$!nrGqmKwN9LrnyCNBaFWep+g-E1TfNBIW%&6)cD9IU zj`7B)PwiuyI8?uh7fz9m7jw(}WVEp>a{7G7?zlNm&x1mfA#9aalK1UND}YggTe~DWM4fhM4dX diff --git a/build/darknet/x64/data/labels/100_6.png b/build/darknet/x64/data/labels/100_6.png deleted file mode 100644 index 18eb1730652e1eea0541646d21a56d93d1c58354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 697 zcmeAS@N?(olHy`uVBq!ia0vp^T0rc@0VEh+#LT=4q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5|khkrLtVqjog=jq}Y;&D9rN5625B@g5Gg*9wF!JC8W_*ddU59ZkEwO@7o1>V&dKcmpkcf6U;|G@`s0vWhtD*yX%%X$O*z04 zyirT{@S;hLxu#-Ey(Km|vf$v8?;95Umg)6< zY0Wnyg1IOrH8IdiR86EyXsvyT!PH%jt~=rvsWqBPc-0p>xprL$IvrnGvUGaltn&+& zuW>3_x}ibrkVi}O#i@P`TsIOmYMa(=5z`WAU-(5|dDbPN6_sgn~R$NNsnHqobu9d9&hJXL-rDI=~t!R*MyX5-9YyH7PU*&gQN-0^ozhZ%s`-PBw z&yRWN)dfssFj?9=Lo-_{q@_^3>y+@C8D8y3#YVP|9T;Wt^PpdzJG6~y9BM+|IvOQ)4%W2Y_vJc*z_cquS)*EkZD9Y@RMf;rV8o(Yn?Kydt#A_{2FK3tro|=CtXWMtd*OmWm_dl%{h$R_?j_GQR#7t4IEI zMZ=o+OXWCrPf&U`v0PWdr`TieEemOtJscf>8(D?&SeEJXGB0E|6lypqlPxFu)cJu` zxLJ_B^v?fBPEHnG?xf`~{mSjKCB--OQyREemL1!mbCFAe$2&J>r$@S_zzL80H4EbQ z8gjTCx#axzRk9p|m}`MY{&s$bx=T}2GB&U`xLx{s@$-+XF3mwqX^aiBCIZ*1*qPpn zcx2fcAG<43A$(Al<(I~XJhcacOme>@k8IxA=wQryiqoRaL6bL%^9IYa#Rm?4ot!7Y z5X~?{J=SuAlrDpX`2Xv%S^q?$@)x#D;my2Svx>9kaodqHA6B=o_cAZHCDq9sWGMIe z+wx^~TulcnU#k2Lr$hepIi@M9P3U`My{&QORmprtC#eTF+aw-V3Oo=v&XB$4w<5!N z|4sP|6#V;(Pe+yC@!VRq?-56KT-Qp6sWo@@eQDfy&sKKcyER)1(z*}Z*0HS7!C8<`)MX5lF!N|bSOxMs**T6Kyz}(8%*vi;U z7sxO$$W#slrY9r~x%nxXX_dG&NYuT&15Rc@8*&npQgawmuHVc9C2j^!S3j3^P6ildaLnr9a(~x#43epn-o3MW z-OzJ1>V3S34YSd|W!zj-{~cZ@%f%q)>=_}I=Y0Zbf@+CtL`h0wNvc(HQ7VvPFfuSS z(={~IH82e^Ft;)`vNE#J1u_f_q)Hs;qG-s?PsvQH#H}G)^QR)%*+3g|5|dJM7*ZG9 Si<<)!V(@hJb6Mw<&;$V2eOf~R diff --git a/build/darknet/x64/data/labels/101_1.png b/build/darknet/x64/data/labels/101_1.png deleted file mode 100644 index 5a39331d337f3744517717df327e139be37875d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmeAS@N?(olHy`uVBq!ia0vp@KrF@qBpB=_dj0@XEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4Uo}jfzrd zUMD_?`u+TSky+bbg?UEK?`jn|(oQgax@UBtfqBCBj>d)6wi0icKh=FSC~5AwZT6hs zBVLO6{;~b_;zfo&Ods#9G&J~7WMts-hxPV9HTSm8^EGmzwJj_R8@@f>&}HM)2XusL ziEBhjN@7W>RdP`(kYX@0Ff`LOG}JXP4KXmcGB&a@w$KGK3=FQ_b7V%*kei>9nO2Eg j!}8{z5T65W$Vp5}&0$Dga4&8S&kr_Wm>bfjssS zPhVH|2i&ZD3i|6pT|NMX_ItWGhG?8m{?X4V(bjUK+4b$+?D>k_v7Zwd7}eGn7i_%x zh9}^_CKj!-DKi@z^%t+V?wsA&_?Iu@&3r!Q=4ajlpC`&NJ4;5q5ePVM*kO5DQbOcl zk}r?O16dCpsn9oC9y$$;j=!y#YS=rM8X6S*ZLt!2mDRS>ftOqHO{~sJ{R2twD9XUGXT+j=jB32D|`ACK=Z*s)YbI^o~n+vnH?i}tjLgx%lfmyr=& zkzQ~_T8n{UOXyvt!d znCk)=1_oNe7N1cxoLMfGlY@EB~ zZze3aX>SSTxzXvSD{Xe=baRBy>;;WKJcW-6_gsE(@ZT*S&pG*`K`wvi>97l*t7sB? zE-qeTzU8dNpX7q2M;IqEFhonqt1v8l`xzJnswJ)wB`Jv|saDBFsX&Us$iUD{*U(Vc zz%<0b+{)O<%G6vJ$S^Q?_R}I4MMG|WN@iLmZVl6yG+YFSJJ5!l#H7?5hSUZ3;^qK_ O7(8A5T-G@yGywpvHnj8r diff --git a/build/darknet/x64/data/labels/101_4.png b/build/darknet/x64/data/labels/101_4.png deleted file mode 100644 index 7d7960bf326477a118aef185d4d3a2ec91526456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmeAS@N?(olHy`uVBq!ia0vp^azJd#0VEiT4OqH?6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeM~ zFY)wsWq-iU%BRTQ^!u(i0|TR#r;B5V#p&c9{o)2aUi_gi!%rLSIh)J;dfUGPO0~+3 zy^LHe+Vd8A{?BapZeloor2fPu`@fPG9KP7Me2Ld*;|XY+kk{NXL%;IFc)?SyN}~Qe{75a;uEk zB!!7G9VNyQxAf#VJsMnc6fOnw+-S6Lxy96OBJ2{y-EML?ye02m{r`>3Z1Ec|&EB!Z z`{1SG2}kSRJ9^}^drK>LPdBod+w55{%5Xa0@q}Ii%P#AGoF->hAH1~adE%zno`goe z6<@Lw4W@5?Bi2!WOZbuQYx@m9;`l$W?CI_{nWFihY2u7khD|R2%!-0?Tqkd>?wU1$ zUsBQ2%kOXZymSBMG>oPurY8uSdf)#d9IbayaK++FSEjQuwAmio{k<=v5E!tkC9V-A zDTyViR>?)FK#IZ0z|c(B&`{UFG{nH%%GlV-z+4x|Ffeeu9czxFAvZrIGp!Q027|Vz gphUn9vLPoiDK&>7b-}&3IY1!>Pgg&ebxsLQ07SahNB{r; diff --git a/build/darknet/x64/data/labels/101_5.png b/build/darknet/x64/data/labels/101_5.png deleted file mode 100644 index 08d80033269264ec6cdbc2ed49f9690347004f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^%0TSE0VEiNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5|+GW`rG1_s7vPZ!4!kK@Td{3Q%}R!N3B+nef(tH1Ex_)&AmwEW+# zv1fZz%GfLf)>XBwd=@Ut&CHds`d{m^XEOzv*$nEM7CoED#VoequbAgq_ZA_|SYJVl zMH}X}aF{t=4RPMVyW-(`ez7g>t2Q!zmXKexN|U8~Q#13Vhw4Eh2~D#TOs{{? zOuWGqwpnoftjYw_;*YClwyaUhu?#Day}7QW=H&+s6V(U7pJxfKY5S=<>&QKEk4zq+ zMLe}Dyw(+bEc?^2TC;7%#Gj38o@_P?@F?Wz>2oyHEK|avg-ZosY)P zn6x{JXT`^V|CzKyT(TK0Sodc3IbYAe~&-K#RDkkh` znp19fJ0WmUjkGEMKaZmULZ4sSuaZjG5T&S{P-4|3BVKUrsT#klo*SE4;M@~+S6Zw) zPVWjdWnRO^V3D)(=dOhCXkZMfmbgZgq$HN4S|t~y0x1R~14A=iLqlBy(+~r5D`R6T zLvvjq!@!`oFm@%1hTQy=%(P0}8vf`!6$PgOpba^RNvSyusSEDK%>fEAc)I$ztaD0e F0syG$@)7_5 diff --git a/build/darknet/x64/data/labels/101_6.png b/build/darknet/x64/data/labels/101_6.png deleted file mode 100644 index 9d554db3384849b8b926c211fb53a814f92738f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 726 zcmeAS@N?(olHy`uVBq!ia0vp^nn3Ku0VEihvz6`vDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWFERwW+UBU`5+19@P~_JgY7>Eb!7^;U(ClRk~1XC&#Lg zmQ_z$KiwBPdK>hF%WMMYdXx%&huaxIg*%{)} z7e&`GaB+S4=d#2oh_l_B_)LTydKj;yt{$PT{`$OFixbOYxU-GG0>zu`N zyASe_Pyg?>;F4x*O#UAj`fvZ@#?XcTzW#rq^}pWdSjh3XUytpVo%;X(JjLv zX-}Kz^?rJ>u+LG8hD6mxuYxx}Hg}6snsUP}v~QJ+kQSrPMpm9HOB6l>V_LPuHKHUX zu_VKd4a7?@ib8(SHf=>i!B21`2w|DkBe%}>cptHiD0%9WQ+ f;Iss^Atx~@HHRT}!M(USKp_TCS3j3^P6Hn8iK)W z+@4`NZBGpn6&HE99C1ofUVmcBR28M5e|asJZqG<-Jn6Ex)uY4YpUr#Oqqg<$c0RW& z7xUVA|LOahUG?XFe%&p8;Xf-+e#K$wf2DtJM);P+Oi1}TBhGNg)5?R@Y1}FaNo#+< zJ*%(MthF;c>faw}j^Hw_FMSplJbIiTJZE+=J}9lV{|R@T(7)-QtsUPKl|$?<7XHWnCw6;HK6Q56WbU7sQpA~*f*2?jv-d}$?|Mb4l@USn4qLPCf7&AO z_pTTaN$Zq*zxVt#=&k5a`)gWx zLo2BINypU(H~myTz1S2bl=0fY{PT?Wck4=52+iK~CZ@dT{{7oWryV-K(2ilB;K%rE z_qiT(&Hw#Rs5rb|`#*=0+m6SDZ+s^L(~WA0YeY#(Vo9o1a#1RfVlXl=G}ARS)HN^- zF)+6>HnuW0(*-gN3^J7ifk_ZaLvDUbW?Cg~4H9)P?|@S#(1x7Eq|_XS)CKqA<^Y8l NJYD@<);T3K0RVeeU+n+@ diff --git a/build/darknet/x64/data/labels/102_0.png b/build/darknet/x64/data/labels/102_0.png deleted file mode 100644 index 7b8b0fb1eb10f7d8d1de1adb7812c2545e3a1d76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ-0VEhIEf;$MDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWWMyQb z3uG7=NR>FwMbVI(pOTqYiCaUq=1)biGl4ebBqpWiFr-;t=LhFdwo0;^{pWL&{=WL5eHx8%9$49)ldORnoEHr~+P{r}*)J|i)a3Fnv?+$K$z-8$*v zcA%lEC9V-ADTyViR>?)FK#IZ0z|c(B&`{UFG{nH%%Gk)t*g_Y`Ffh1w&yg8LLvDUb nW?Cg~4a=KbP0l+XkKL*#78 diff --git a/build/darknet/x64/data/labels/102_2.png b/build/darknet/x64/data/labels/102_2.png deleted file mode 100644 index 2068f0be835ffe74770247fd8622fe2647369def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^JV30#0VEih3yzfmDVB6cUq=Rpjs4tz5?Mi#$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4R(Z#}J9j$v^m6`X{MGx+wqupU$vJzRQ@Q(W*uGV8eqy zj}j6L>i>K;nNcjNu}5@?=n+e%CpL|R-r5+P2b|NS=e7?i7izZJM z7!dnCk)= z1_oNe7N1cx z#@79Pj8o+qlhXJ8tNm!wvYzXS)_>;NEYFIWf8PB6@XvmQr@{h%?koH&(fat@SfTNL z%TMXAU%xu~NGh!T-~Q{JBvVa_!Hu5`e>G0-nyljc8)&C$iEBhjN@7W>RdP`(kYX@0 zFf`LOG}JXP4KXmcGB&a@HP;0)3=E$Aw8%x#kei>9nO2Eg!}KK$7r`C{+K`i&l$yhk UW_g_-7*Y%jp00i_>zopr0I*JakN^Mx diff --git a/build/darknet/x64/data/labels/102_4.png b/build/darknet/x64/data/labels/102_4.png deleted file mode 100644 index 37637d36a4fafce5d333c7ac7be771680531575f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^!a!`w0VEjO&h=XZDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWGxf4pir}?i(`nz>Es{$%-^Sf+2VJ%=Joym|9Ju?I#1&f_#mfe zHg_gtY>vG!bK49-=C&J=2L0LpuG@eAwcqKeTEo#>33?3Ostrfw7I*w?YEk*OxZ`H? zku!lu*El9!`yyJrb=$UQ%$*-2n-AzrkT7TFTCpr7XTcvcEjGc~(flmMfk!VKC=g?2 zSQ~RzMCvA!J?)FK#IZ0z|c(B&`{UFG{nH%%GlV-z+4x|Ffeeu w9czxFAvZrIGp!Q027|Vz-QX|)+K`i&l$yhkW_g_-7>EoEp00i_>zopr02@?+S^xk5 diff --git a/build/darknet/x64/data/labels/102_5.png b/build/darknet/x64/data/labels/102_5.png deleted file mode 100644 index a86b69bf24f8fd1a5ec83496dde41d43c093876f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^;y~=c0VEi%oZ4&*q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC0W_mv&aOZkpafHrx4R3&|Mvbf`++?6 z5>H=O_6OXoe2Ri)`WaF{p$VQYjv*GOlYjIx?B_fG_RWlqf6v7$%x2X4r8B#ok;!S| z(ee+52OJD0{fJ9r%X##EslND!N96gFKHhxiuz*FdynwwqUg2XB8_$Qia*vvI zYut{qZ?sU85MADH!LaVC;Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5|khkrLt0t(Icba4!^IGy~XpQSGUl-ZP|$CI{szN-H?pV2d^SBhCC z$9>Yz=o1GTV%7Q?+s}lt#TZ5HNZ~VjFzI9y=gqhOzkWY^uBW*`Qg}tnRs9(s17^m* zDG0uhBIl&qQos0gOxvj)f8D2BGELPyFySWi)Xc*ZZt_mel>cO;f5`Cwqt;?^KE~4x zM%yJfG=6eaH2(0=Ov_lyc_xpTftGPdD#M!4zcV~#rvm-OpjzS@QIe8al4_M)lnSI6 zj0_CTbPWx44NOA}%&m-#t&GfcfeZtKrJaHQP&DM`r(~v8;?{8G%1bA3*Z^(FNlZ%3 WVMw#Q&JPS+1_n=8KbLh*2~7YpYK@Qp diff --git a/build/darknet/x64/data/labels/102_7.png b/build/darknet/x64/data/labels/102_7.png deleted file mode 100644 index a9a73815d31c0db4e7273c332db8561938399029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^azGry0VEhU%(zhkq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5`)g*j_1fkNv&T^vI^jwk=^oeKj1|1&xYJS^ zm@`XWO6u_N>{xnQQsRTh`J@Btf9LS8FEM1cdwE}}pfIg})-I-UJ&~8S1(8#;6B_kT zPh9%?VU@meJB!aPd9}Cy0HTzhWE}fRRZoOS9}3Nlfp|o4uI&ZOBf%jeQ4FtnXwn> zbk!2qh?11Vl2ohYqEsNoU}RuurfX=ZYhW5;U~Xk>Y-Mbw3uG7=WGV+HplHa=PsvQH n#H~T1?&Tez26m7QIf+TBISgr**ZF|~&cNX5>gTe~DWM4fx!0I% diff --git a/build/darknet/x64/data/labels/103_0.png b/build/darknet/x64/data/labels/103_0.png deleted file mode 100644 index 17cc959e05c2b88dbe2f3e5732a53ca5e013358f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)T0VEiv{XS6wq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3w8!B*90Kp`hj7sn8e>&ZX(8F?g1)-Rao|Fyo&`_1yWm5eW+y8ZvZ zobe_1p6&BA7+(Ir`loH1>3_+6ru%;++i;)IpCH2jgYP;&Lrk=#@QD(CMxbe`C9V-A zDTyViR>?)FK#IZ0z|c(B&`{UFG{nH%%Gk)t$U+y$FffoRah!{yAvZrIGp!Q0hHTBB gieN7QZOBPXO3h(N_q$-f0Vu@a>FVdQ&MBb@0EpOPhyVZp diff --git a/build/darknet/x64/data/labels/103_1.png b/build/darknet/x64/data/labels/103_1.png deleted file mode 100644 index 175794c43d115cd51a9b892c5dae68365b796832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmeAS@N?(olHy`uVBq!ia0vp@KrF@qBpB=_dj0@XEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4hvpsO#~7H_3ET^0 zYkN>_Z~n=-Vkgff`vxmDhl+VTg$jSg6>ZAfbOheBw1l5Z_`-i;b?b*dV*`=e-Ic^SyR+>4p#$%$=S}#}5Rh}WY*&GnFwlLfC9V-ADTyViR>?)FK#IZ0z|c(B&`{UF zG{nH%%Gk)t*g_Y`Ffh1w&yg8LLvDUbW?Cg~4a=K(Krkr_Wm>bfjssS zPhVH|2i&ZD3i|6pT|NMX{&~7MhG?8m{?X4V(bjU~>&v&N?=9@G{gT4KbgpgxEgqhy z0vo%NcmyUei~nB2@#Iw66;)1yqQggaH8?feH=LOs#baQY%*OWdd&1`OgGcH%8W^ZJ zzxl1sD_YGtWe#U)i*m>t&43))kTasorgt_b8in|9rM1g3Hw(LDFyFbSrm&h{r6h<& z?^~F}iITa7>eE^o^}f{$b6?39^D5Z*KRVS>spq16!@so+tykCI6^?pt_v3&3yvBv1 zx<2)V1_o!?yK{@n%Jwmd-DWp=$P@8~LnlT~%D~{nf5z^=%xpZ(DJ7G5Py9-~u%SMM zvy_|pvxUO_QmvAUQh^kMk%6I^ zuA!l>foX_=xs|bzm5I47kYQk;6>RYtMMG|WN@iLmZVl0V4gTQZ2ilO6n3S5sknVTE Regja5!PC{xWt~$(699l+v6TP- diff --git a/build/darknet/x64/data/labels/103_3.png b/build/darknet/x64/data/labels/103_3.png deleted file mode 100644 index 1101880ff08ec20766ba4cebb6bce1dab71622ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 586 zcmeAS@N?(olHy`uVBq!ia0vp^l0dA@0VEh!7}S6`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4d}NTrA%goQM%gX<(kHr84t;R)XQ%HM^9A+1T_{X6gyd&X&A!EjQtJ zf>DveH?0-TVag}(uo>n)%rkX3p~G&demFHsz-Y3=ndX9-z8o{t1cV>{uH~2+7cz5e z#y6SP(;>aD?>zoUO_QmvAUQh^kMk%6I^uA!l>foX_=xs|bzm8rQdkYQl(?59O8iiX_$l+3hB m+#04YX}AcEKcEdciAkwB4C#Is>^A^~7(8A5T-G@yGywpnSk;LD diff --git a/build/darknet/x64/data/labels/103_4.png b/build/darknet/x64/data/labels/103_4.png deleted file mode 100644 index b8bf32e00fe4f4e5254849baa1f29a6b872144f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^azJd#0VEiT4OqH?6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeM~ zFY)wsWq-iU%BRTQ^!u(i0|Vm{PZ!4!i_^(J`o#@;y!d@z*53}^dcz_l$?QM#ruoeW z)Ky+Cw&Dp`Q2pqCy1`-z#k)t2FtD%DzPR+W#019Qjv+5Ic~&^cyZ%yRce#>$`1Jn$ z=fgfYi5^@Me9&f@WWf5E>5dcYj&nY{dU$Wu48h1M<{67W2n&krJ8>yB!B05IW3BVF zZ%oB~ik|gJE|az~c<*=T%dk|*6h|yZbF~E)3?PUo4%A6$QZ0^J^7E*rFW8(K|i>xjgKCI7!KRAmnfdAYw%W0Q{e#Y?yR<5eQprAlaiy&tn%pPZ*`dBdCE2`}AZX1-8~s1no5^f+{naq7Hq9;WSrmnJk+vQ9n6@LB4? zrt3EyYR>)-c=W1@A@5I z{#(jqY-)=Buk87M|Lg;ODkoo5|F`clF_@L!y1FT;EB4mHe^Nmb0bxdr4CT$%?{-iA zeGV9fswJ)wB`Jv|saDBFsX&Us$iUD{*U(Vcz%<0b+{)P4%D`L~$S^Q)yd7(fq9Hdw pB{QuOw+4f@r=aA<4zeL9F)1~NA>HqS{RW^AgQu&X%Q~loCIC)44h;YR diff --git a/build/darknet/x64/data/labels/103_5.png b/build/darknet/x64/data/labels/103_5.png deleted file mode 100644 index 6c81a57ed60ca197a47a7ac840ac31fe3580f752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmeAS@N?(olHy`uVBq!ia0vp^%0TSE0VEiNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5|+GW`rGpgfbOi(`n#@#G)=5(Yi1BtxCeP5G^ARA*FPQJP+VcE|1`zU)g_;hE~d{_#atTCzrB z!WE~`;>p}v2WRbi{B!<){%H}4R}NiKar~KeJ#pULvu(?siCVX4e-{!|GQM!dr>%%z znSHkHs#ygb=cQFM$``Df*!&@E@rs|yU2C2hha8W-V!`Dc_F3T2M3?U4VkxHL3Nqd% zrp6Pl$}|-SUA%I}HLRFz_pH1W)9;FN7)(rCPh{0OUz(;iOUii4hrospaSJsn4>c`P z<2&@)AuzZ{>fGrCD}R_ynzVS$iY&WNPCNSUKlIY`Sg>4v#!j*R1zuvG6PIjUzQN{T zXvw3)_oIu?PQ0XJW9y%Mfb&7tzn#e^GJh{x`Sbrl0pHG7$vuC*{tp)D68e69#!nFr zvssF7BDtP82Y)C}G5!Dl{)}m&Pb4Q?DwjJ`%%Yw6w|^CzsKcj~Hg=}>Ee~epBxK#& z%hr7VMAkOPIg?p}lNlcBJBCf>6P(Q+EX?%K`j4}QC4298YXj5Z1$BOP{GlI<^-MHp z{BK`bd7d-$$ZV_kH%|HrFFu-}xRrU`vwHhJj(Kp_TCS3j3^P6(cF0X)y|^i5tD{xV z)65;k@5|p?mT#W^BK3LZ^Ecl&=0BhF{uAeq+XAkUQ(S-6Ke_VvoA17${DkXUcvNw$z;sYuoZTF=_mx_zgO{u;rA zPk(K`K7GXZ{IkA?t>vq$>k6Khg<8*;V(ZdSAFtSjba;HpR@FB;9Yt6 zkeSgpg~{TnPrDTRKmYa7JLGlKHrGye+j8f!kcwTGINX~LsXd;$YKM~1oR*rjn zTUIYh$O!sdYy3*rNN~dezt@~%@&0q4Px-s1x$~J2^Dp@)mZF#m0r0i*VCu!YRrvXYSWhFWhQ^_sJ8Gi0X=5b@FdL~ zubmc(;ivX~ti80b`TT|##i`qK9?ud#Rco*N@K1~O{;4acUH`_@+q=J7ig)VjONIri zb2K&-ncA1mTzQuJ@8SjCGww`hU)S5H$;g%~ttAz7KqZB(>Dj%`NxKvm@4sd8*j&o| zS6aZ%`ojyO<4+X)KU#f4{#D|C6}?W;$-va6TH+c}l9E`GYL#4+3Zxi}3=GY54Gnb- zOhXLJt&EMWjLdX_3VnqM| diff --git a/build/darknet/x64/data/labels/103_7.png b/build/darknet/x64/data/labels/103_7.png deleted file mode 100644 index 1919f01f87731704aafc2adc208444a662cb8989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 971 zcmeAS@N?(olHy`uVBq!ia0vp^20$Fb0VEh6^1K!YQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIej<{=xYAttpqL{7Et#;zYtaOy zMg6lCG_@A-e_FOc|4sAK3&&fXxOQ@=e_<4KVR4jnX$lOVdT_?XGzn2Y)tuC6L8}u_ z@4UA>)%v;ZbKCQguNSTRcIR#VJo)tM`_F67bNor2XyVZfME^ON?yW7}toC$gS&WPy z>lQubHD{vd`KByiB`iAe!0D$h8o{9!^TaOq&+mOOsaIlki36{RxnovZ0PB{!ENfMh zxe9tTPBk~rUR5{g@qq&!&Dok(_x`2v9J4;JC!)#E_p&gpcuMSZYd=h6|5`k1sgh*2JolW5Vah%yw^M&b4x7j#T9bQm1D8C~4zzAWG`2 z^RoZPMI_HGzi7sCAV~5?W=MNutkH%`FO1k$sV>+!|LI|exhzRMd;D_Q6O_NnFk7bv zI4yRUSTW&XmekgS1Ded+UJ5R;Z@BYvvWb?vgEEuc1r23|ukPsz3a5^xu4kEbkv&89 zteU;ym-5KKg63A%N7lQ|=PytQJ8|h!-MahhtFk}bzf$Mwty5#0rKV*Nbwqc{+?SjO zZ{KF$#2Lu6BVVarhw*@2X!OYvnI64Ezl-Bn@=Z|`zn1?#Og?h{wG)3+YfqlDc-s`5 zv;FEnD+@^uNk)escar{QiC*XPYsvYw$f)DGM|AMnf41*_O|zTjv-me7*AlMFylKlh z<^^p~axIwGhF%pzwy{`H#+g+78TS>9axckz2hCWe~TAO86^H#Gm~-l%o{M(*8z zH!Ad7A9nwgHrr9>->hj|zw~!lgxvA^|M!2Z`@LE&$~9@d7%+LOmbgZgq$HN4S|t~y z0x1R~14A=iLqlBy(+~r5D`R6TV>4YK!@wX@IS`mrkTm4xr(~v8;?^Kh_wo)n0|9Nw aNlZ%3VMzD8V7~z<#Ng@b=d#Wzp$Pzs$&N_? diff --git a/build/darknet/x64/data/labels/104_0.png b/build/darknet/x64/data/labels/104_0.png deleted file mode 100644 index 4ce801bc1b8576d29c1aee7d2efecbff9bbb0e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)T0VEiv{XS6wq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3w8!B*90Kp_K97sn8e>&Y+t{_`{ONR%v4k3JBup!@fk)!|r$x1ayp z-MKF~r2)e_f;l9a@fRIB8oR3OD*WMF8fYiOuz zU>agzZe?s_Wn`fXWEdDol{n5t(U6;;l9^VCTSK!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4lbDp6!;o<=Ur7;Y27{-opUXO@geCy+4{OE% diff --git a/build/darknet/x64/data/labels/104_2.png b/build/darknet/x64/data/labels/104_2.png deleted file mode 100644 index aa88c847292c72c88c37c1a55165ea2bb325ede2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^LO`s*0VEi##LIPo6id3JuOkD)#(wTUiL4;WWRD45bDP46hP^x@Isih!@P+6=(yLU`q0KcVYP7-hXC4kjGx) z>Fdh=fSZ+1L4RGS%LkxPv8Rh;h{pNk8}c$SKjm2s&ZH+8$RBZ_c+dLRpNcHL0IgRoag8WRNi0dV zN-jzTQVd20hGx2khPno(AqM7F#zs~q=DI+Jfq_=A#b*=^x%nxXX_dG&MDsQHgZ&J& bAtx~@HHRVNUcQndP>8|P)z4*}Q$iB}4kvD^ diff --git a/build/darknet/x64/data/labels/104_3.png b/build/darknet/x64/data/labels/104_3.png deleted file mode 100644 index d574267590c40926cbc763b373b0ee3654c63c1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^;y|p;0VEi<{q$J{q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC0W_mv&aOZkpafHrx4R3&|Mvbf`++?6 z5>H=O_6OXodnu zz$1^_H~gr7ldznC}Q!>*kach{qq~RhsM1VHrBqpWiFl5}zS5gEDF?hQA KxvXNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5}crr&qHfkJCMT^vI!PABiU&C9a)|3;>^vpfz5Y_u#RRR6#Ax&Aoi zfsx*x4$YmelNs6m$SwA&JD=phlw>|pb^mRn1q{I{CldrtDk>l3nQYrQfraU3q<+Jl z{lDKT+{sJvJi9$W{GSo)XXS~i=7(&zbDg>FJ}Kod+w>Ynu?en|Oq{vIRVOg$PfF37 zv_#pXfz@*pucr}*+=76UksgyyzL@lSg39HKs@wa$CaM3F=a-neWUdNB!e(<}*2={T zfbLc;ag8WRNi0dVN-jzTQVd20hGx2khPno(AqM7F#>Q3#=DI+Jfq~=gSaTE&x%nxX oX_dG&7_>d@25Mjj*^rZ%l$yhkaW7v<5h%pq>FVdQ&MBb@0FB^|P5=M^ diff --git a/build/darknet/x64/data/labels/104_5.png b/build/darknet/x64/data/labels/104_5.png deleted file mode 100644 index 3159b0e9d837d74e5253b876c21f9885dd7fe291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^NkD0I=&#WBR=c=C;%5-fgykMl~bk#ta~4mr6(XqJX$P@ej+ z0}Agh6-e)%wBOrA^1*@sLSm}dbtNV+{*K{Mon0Xr!1y@LMD=x~#D&H$`68;{ViYDt zI(bf$U6^LvB{bn_rFvbXOWyTj2Uo3&Q#j_fS3k745>#%Y%01CZiCIadZB@&2^+}Ut z19IyFru-hy#oMVvV02i&Xf# zh19O71ogUd>L;rHS?txeZPI_1gDWNlsunOXT)u3v?DX?9|A3xTEpd$~Nl7e8wMs5Z z1yT$~28L$3hK9NZrXdFAR>sCwhUU6JhJitEVeCp24Y~O#nQ4`{HT=zopr0M>Gwa{vGU diff --git a/build/darknet/x64/data/labels/104_6.png b/build/darknet/x64/data/labels/104_6.png deleted file mode 100644 index 018e0e1bf16e5db0c67c7b73ede31e6557e00a27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmeAS@N?(olHy`uVBq!ia0vp^>Okzp0VEh?7YXG8DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tW-nOU%#5>-`X6kXKRxQ;(ICSshUXnv4!-)~_pndvy0yET=q^UifdzQ z*Ls)GwR^)j77e=48PtV8!I*O)g||< zy{i^4+V%fPBgk8AO;!v^uDYf{e-gZa{#Pw=jVMV;EJ?LWE=mPb3`PcqX1a!kx(22p z2If}A##Tn=xAXWu&35HBsVlm_`LeWQOd$wokLD}VQ=gfA?c81%Ms zbbq?};?(>@OLuM5*xx@fMl~^L>x@&a1|k2yH=LZBq*Z<>WFF&W?E@k6+E(t7RGZ!p zB!hpZ*qnNvq&2_U{b!cX)9#NN_uXcF`U~=7zt(b}pY@XtK>W<^Vaf3PJ@>{FvwpY$ zLrk^AHKHUXu_VKd4a7?@ib8(SHh=>i!B2ARr%z`#e+kei>9 onO2EggGAlSJK#70+K`i&l$yhkaW7v<5h%pq>FVdQ&MBb@0Ojh?SO5S3 diff --git a/build/darknet/x64/data/labels/105_0.png b/build/darknet/x64/data/labels/105_0.png deleted file mode 100644 index 388be1ae33f3bc907215d853b4b3d8b7d071c645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y|0VEja3uN#CDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tW?)FK#IZ0z|c(B&`{UFG{nH%%Gk)t$U+y$FffoRah!{y sAvZrIGp!Q0hHTBBieT3PZOBPXO3h)&T$v%X9Vo=$>FVdQ&MBb@05r@_5C8xG diff --git a/build/darknet/x64/data/labels/105_1.png b/build/darknet/x64/data/labels/105_1.png deleted file mode 100644 index 284a1305b4c46bead31b21700a535f532597b351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol=0VEiX6>j1OQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI&ZX(*?4sCY<8St+05T@OT1pp#qsHaDfZ5` zq8cH_9|IWP$7i_5znZ%js71BJHKHUXu_VKd4a7?@ib8(A4! z=mHrA2G{O6GNWk7%}>cptHiBgdGk+*JApRjBqpWiFl4UG5ZVqjgTd3)&t;ucLK6TK C@l=2S diff --git a/build/darknet/x64/data/labels/105_2.png b/build/darknet/x64/data/labels/105_2.png deleted file mode 100644 index d378969f08e8df857014b10176e119a2ecd5df83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^>_Du*0VEiHPq1wSQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_Q5iSWl2)#-1*YAsp9}fABN%6zuA{{z`PhzS9Q|1TZhjXMCA8p+ax@ z#o&}uix>ADzW#pcAzZ}ID8Glaov7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R3&|Mvbf`++?6 z5>H=O_6OXodBxz%wm2HnwHm329stPF~UO_QmvAUQh^kMk%6I^uA!l>foX_=xs|bzm8rQdkYQl(?59O8iiX_$l+3hB+#04Y hX}AdX1<;0^#H7?5hRl^2Lfe5t44$rjF6*2UngHi-V7mYS diff --git a/build/darknet/x64/data/labels/105_4.png b/build/darknet/x64/data/labels/105_4.png deleted file mode 100644 index afb260bdeee31b909bb9f647223093447d597efd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^+(2x~0VEhUZTC|LQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIG^xNf|k&wMbN?)FK#IZ0z|c(B&`{UFG{nH%%GlV-z+4x| zFfeeu9czxFAvZrIGp!Q027|Vz-C$nFVdQ&MBb@08)W$ Ang9R* diff --git a/build/darknet/x64/data/labels/105_5.png b/build/darknet/x64/data/labels/105_5.png deleted file mode 100644 index 53274dd7cee7ef2eb424c174b5439ee3e85f8ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmeAS@N?(olHy`uVBq!ia0vp@K!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4bHKpBwcxLiX z_GiB74Gr1}_jEMgv&|@HJS6y&*-%yB%xpf>&&jIM~dxIJ0Rx*6?@mEau&JzJzq*~${QIe8al4_M)lnSI6j0_CTbPWx44NOA}%&m-# ztqjd|feZtK-on_GC>nC}Q!>*kaclUa^Hdb6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeM~ zFY)wsWq-iU%BLtj?N=iUP^iGu#WBRy6d!%trxfd}kQqn&=vu~(?6)R_N}wI!eb>8F2ZpUn!jd_{H)t*w0d){j=$0_|2Uag8WRNi0dV zN-jzTQVd20hGx2khPno(AqM7F#>Q4g=DI+JfdTWsC@&NZx%nxXX_dG&6fJ)A4eVi{ c4LONPsW}XpD>H<)1BDnoUHx3vIVCg!03)`1%>V!Z diff --git a/build/darknet/x64/data/labels/105_7.png b/build/darknet/x64/data/labels/105_7.png deleted file mode 100644 index 02b1b7d7a182c551a6a9d5d83508003bf2ecc633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^fzm0Xkxq!^4049#>64RsAnLk!HVjE${~&2@nc1B3G+QCCnjnqFMwYrjhJnEzW-mj1OQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI&ZX(*?9gt|NPFla=s3asKUKPPmU{aX|XTu zkxaWh!)Y7P9r^JkkB`MW0rjYsxJHzuB$lLFB^RXvDF!10Lo;1NLtO*Y5Cd~7VNSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!Ib3f?!xfDz5mR9AdkJo z)7O>#0XHk3f`M|ZC&(}pPZ!4!iOb19_*r=hj;Z_4yHT&;#?8!pSWaNE;E5Z&NqaUX z^Z)K%B*FjKB;fk%g{K;RGBL=mTgSJ)a7QvwziNqVL`h0wNvc(HQ7VvPFfuSS(={~I zH82e^Ft;)`vNEyI1u_f_?nrw`p=ij>PsvQH#I0ei+lOUfM+0rhNlZ%3VaPH_bmj#L OF?hQAxvXNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3yGsK$>AfkG~xE{-7*my>_+GxKdAqwX{BQ3+vmeM~ zFY)wsWq-iU%BRTQ^!u(iP$!C8<`)MX5lF!N|bSOxMs**T6Kyz}(8%*vi0M7sxO$aJ(IB uj-nwqKP5A*61N6}wx``-9|3L1NlZ%3VaPH_bmj#LF?hQAxvX!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4<3Nmd82Jg+Lh%-L>JGuRXn&X$X=`4j)_BrR?NIG{=ykNe>_JG#%WIKtPh7Ze} zW6El$n4ela#XU!gg<)0q*Vl=PF(6;5mbgZgq$HN4S|t~y0x1R~14A=iLqlBy(+~r5 zD`R6TLvvjq!@!`oFm@%1hTQy=%(P0}8vf`!6$N_`XhTk7QfdxEmO-L3$WjJRS3j3^ HP66id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeM~ zFY)wsWq-iU%BLtj?N=iUP$=8e#WBRbP0l+XkKH6eL7 diff --git a/build/darknet/x64/data/labels/106_7.png b/build/darknet/x64/data/labels/106_7.png deleted file mode 100644 index 727f3f6b677086464dfdce20517744ebdf039ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^LO>kC0VEh!EwT6oq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N8WN*Z1;Fq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PK1J2=*>lzdg{nPW978NlC;#YYl+X~o_2A6;br*l|dameU0q2PLu-v$rP zO|R#dxv`4NF8A}`VOse7Z9oBoUWt^L#nZ)35O|~2fI&==A%}bJE#DhEUILw=TH+c} zl9E`GYL#4+3Zxi}3=GY54Gnb-OhXLJt&EMWjLmg{3zopr0Gb$c)&Kwi diff --git a/build/darknet/x64/data/labels/107_0.png b/build/darknet/x64/data/labels/107_0.png deleted file mode 100644 index 9c8d8361f67f4460815d754572fe982b3d3454ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)T0VEiv{XS6wq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3yUv?kF4ppd?&i(?4K_2e7t{>rmR7`)sc*tox8OPJCGrb~Wo%?+WT^{e7#Qqf_R>Vrkei>9nO2Eg!`Zk`Q^D>9+K`i&l$yhk?VeUV8z{u! M>FVdQ&MBb@09jO84FCWD diff --git a/build/darknet/x64/data/labels/107_1.png b/build/darknet/x64/data/labels/107_1.png deleted file mode 100644 index 7dc3d2bc0c6069337c1abb8129bf1c0b93023296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eQ0VEhM1}hx{QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI@TP`Gd2`aj=6C7 zfPwG{$B+C=Wf;0PpIYp;O7$_&8r2flh?11Vl2ohYqEsNoU}RuurfX=ZYhW5;U~Xk> zWMyoj3uG7=T)XGUjG`eoKP5A*61Rrs%|9W21KN<2n3S5sknNsUJR4{RgQu&X%Q~lo FCIEy8aRUGV diff --git a/build/darknet/x64/data/labels/107_2.png b/build/darknet/x64/data/labels/107_2.png deleted file mode 100644 index d27cf783ba22a79e6cb7d43a916eee01bf7fa41e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^f+QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_Q5iSWl2){hlt4AsXkCPjK_a{g;rvW>}b!J`KhD*2C!&z{+sSJ(My{Y?k%Ub}@q_6lk| z`N6F5NnVy`4F^M4T~>MwFx^mZVxG7o`Fz1|tJQGhIVNT?5k)19K~5 zBP$aNT_D52;EuG16pDu2{FKbJO57UOx_wv%4iBIWIf+TBISkqEX~naFLJXd+elF{r G5}E)=E`hiJ diff --git a/build/darknet/x64/data/labels/107_3.png b/build/darknet/x64/data/labels/107_3.png deleted file mode 100644 index 04b6c22b68d72ae077f269c2899519f1a581ba4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3T0VEhAt<|RhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWla7voF(d^dC#@@q>-4y%6}|p z8z-J|aQd&hYxltf=C<-0hn54WJn_>SJzl!MIP_o1Vahe@F9tso`4_F-zmWZEwXVS7 z|NK=Pb`w}OUNU6*CZiD{DP?e|+WN$5p3Me}68SpL?h#bJ^vXfz++v4^|052b5MX0) zI=%bkOy&)VKNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5}crr&qHfkO8^T^vI!PABiUz{@26Kbeu|vZTXik>Hc==HJ#vgmRd^+Qg3F%!-2zte~&7ir#H{x(Glg}x;qiWmzd3;{hA5kj*uOdF9 z>|d*H-!gL$v3(lx*oyA%T+b7X{bI$P%OQ)w7O>o%T zsjD0Nko~hre1doS?#P2NkM(a{x@psqY+Ik~J%2()iU-rlzsGsqp03blX9(sM{=A@F zn+@ny)e_f;l9a@fRIB8oR3OD*WMF8fYiOuzU>agzZe?t2WniugWEdDY-i|d#(U6;; pl9^VCTZ2K{({6D10&U1iOiImR$aYUFo(&XY@O1TaS?83{1OOLXtup`s diff --git a/build/darknet/x64/data/labels/107_5.png b/build/darknet/x64/data/labels/107_5.png deleted file mode 100644 index bc9730c7cff4114b2963b4551d5d493db690c441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@0VEjWo@x~VDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWg1__q1f5%xR{zy7B)Q22g!8A+rg-~0= z5BnRUB?b--7xdq#ZE<|6T%Wvs5v$hxAL6^EXD#?7`G14;CPuCJhQs1t1AcnR+*{Ln z%KQ;Wd)A5?@xF#tEgr^xhXf}*4fq*p(X>lM>HHo6_m~3*=KN<7+41Ml!Ulb&RZ3#v zCI2@Z6!Os6SFxBY)KE6OX{R#N*Ar?nny)0-U0APk#(3t5D!a6v$c@R|B>al!X}E>R zAOH4M27kMp56b(m;F=F~;h+CG451U-oDcq2Hwq9v3skZH1b660hW4ia))5L^5#^5p zKGcg{;kfr1D7C&})r1;`pbzsIBti`qi7+t8ow#&$yJn{cFoaY~Tq8hVYcP@ zKacMe-}}Dv*}rqXky~a6K2E!)wR(+|$K12uH%C2xb>xe2*rRmOhB;jS9~oXaV!Z#l z;)N&L`~TWqxFTJjET{47occu8St~zQrZyzauUVD3V5i#rzj6VOy7M!{Gd3RmzJqzo zpVQm-@=nS6?DwPbnw3}ao+n%CTH6ljZ4sO2{Ik1jlJ15F&5L$vCp^}VIq5H>6ZF{2 z?oh(V{B=(>S+-qy=#|HuAl)@dTmHtxMNb$`m9Nx@WS8C-7*frcv*pNClSK)BQ?*xG zC0s6D_r&nUUsc_8Pj0Oa+;n?)FK#IZ0z|c(B&`{UFG{nH%%GlV-$Xpl5Ffd^L7v+VbAvZrIGp!Q0 khN8ufzJa3-XhTk7QfdxEwtHIfY@iT>r>mdKI;Vst0MDV}^#A|> diff --git a/build/darknet/x64/data/labels/107_7.png b/build/darknet/x64/data/labels/107_7.png deleted file mode 100644 index 95f81a590bb8202c4b617de8d26a4e663dff374c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmeAS@N?(olHy`uVBq!ia0vp^+CUt_0VEjgoF;;3mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{(zg6Pf;~|_MG($42)r(E{-7{$KPJ{*EpOg!TzD#{@2!wnPnS}CZ2M9^61f{ zBWDY@-z~fCduWo1kWiFUpP%&hskaJUm&n{mWtZ6!uw=#5PwSrr&U*j&$#3oJ->d(9 z`L^f$=RJF$t&KUoc*6|kVDC#&*=x66TYR?XZ_1yh8>Y=V6N)c;U0%`_>TzFeWx3>) zn`-6JOl$8e)<&?D7B5Nvyx^bB%l9%F&W&f1#7qi2o|!RA*(e&%W8)P)Y3I|pZOVyv zK26)=CfUwr=#85=*Qc@U&WZbG9JflAeT$`XBMy$G7AE z)QFo`W+jIvrG|Vo*nD-yBhjR%OZl&D_g-VOg?abyBd02j3xYc%EDIWM=XFl)xwn3~ z)0_3vbJ*^6PHlPgLw%!sb64;Yucgr+*)|r*wv`qgIki%6#s3)*H;Wsb-|U}Is%u&0 zzotjyUG2YZk8H0+WxxIZMtt*6yDtWjOlN?Bu3F+6QIe8al4_M)lnSI6j0_CTbPWx4 z4NOA}%&m-#t&GiefeZtK^C3}JP&DM`r(~v8;?}T_^HBykT7fp?BqpWiFl4)@70(6= OF?hQAxvX1C?w?R;uyklJvk!p|9nRIfB)tC7;i6?Q1EBC>JOAvEpd$~ zNl7e8wMs5Z1yT$~28L$3hK9NZrXdFAR>nqFMwYrjhJnEzW-mj1OQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI&ZX(*?9i(eEqU;!8gHW49?z3d-xZ>v;-

nqF#umCjhJnGgdydQ~8glbfGSez? kYgpd=6XGhM4LONPsW}WeH<_MU0L@_VboFyt=akR{0QW3Tg#Z8m diff --git a/build/darknet/x64/data/labels/108_2.png b/build/darknet/x64/data/labels/108_2.png deleted file mode 100644 index 7a95038efe867765d91161814436102c2886b22f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^>_Du*0VEiHPq1wSQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_Q5iSWl2)vYsxEAsp9}e@M&7)I9xP-*%sehv#>@!e4o&6H6KUno=I&2$Y7bq!2I49u;JjjT*8bb$;5gFDh5QYad7 r^HVa@DsgLA>-J$8*mXb~auSnLa~N`NGCi{Z3Nd)P`njxgN@xNA6lqVt diff --git a/build/darknet/x64/data/labels/108_3.png b/build/darknet/x64/data/labels/108_3.png deleted file mode 100644 index 81637b38cc6fe44d415a784af6c79e6195db704e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^oItG20VEju=l%T%q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3x*!yOBxfkN`0E{-7*my<0f^Rv|d|NsB|h8c_;b^V(>lK-|dR&8K- zCG`ENG@s`>pip$lXf7zk|i v06GjwLvDUbW?Cg~4T*0)Sb*IJv>_)kDK&>7=O)uLkPw5XtDnm{r-UW|5zbS6 diff --git a/build/darknet/x64/data/labels/108_4.png b/build/darknet/x64/data/labels/108_4.png deleted file mode 100644 index 0ea83f24b0dd470c0021086eb6d7c2c0de69234e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^+(2x~0VEhUZTC|LQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIxi-BT7;dOH!?pi&B9UgOP!unXaLsu7PQYfw`5jv6X?jE|6hh;CMUM u97RKJeoAIqC2kD{ZBM(w?gQG8lbDp6!;o{6>6rykh{4m<&t;ucLK6TzBu_yA diff --git a/build/darknet/x64/data/labels/108_5.png b/build/darknet/x64/data/labels/108_5.png deleted file mode 100644 index 98d79d89675860ddef3832afdb705c63cc67c0fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp@K!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4Q5L=DI+JfkAI! v>`D|3x%nxXX_dG&{Ly(T3U(pThMdHt)EtJKn@rCvfIkC0VEh!EwT6oq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N8WN*Z1;Fq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PK1J2=*>lzdh15J<978NlCs!28bNxHa&}_{t@<&co3IdNf{WmsCw#^$;}hJnHP xkf5SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_XsdCeZ?*keR28V+hCf3_EmbinXA{go@wTz{of5@{^=Gl zo+$bCf5yZ2^-m8wEHj?)Q+}@Ji5LdSjHvL-jM_j07*tDKBT7;dOH!?pi&B9UgOP!u znXaLsu7PQYfw`5jk(H69E|6hhu!q@86GcOAeoAIqC2kF8<33FVYG4Q1kdv5{n!}L0 Sj`i9)kgcAselF{r5}E)#nOvLz diff --git a/build/darknet/x64/data/labels/109_1.png b/build/darknet/x64/data/labels/109_1.png deleted file mode 100644 index 16bc989df9e86a0e54ac0c316e13f803073c7f05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv>0VEjMzx`MYq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3x_>z#i>fI=CbE{-7*my>_=b4t8WOgq1!X0_sKkC*fHU4wi+ZC;SH z(8o!Khv%o;njjvYo^pkxHM{@Uo24ZbRDP|uS3X?RF@t}?tkVYyWISFPl{g;BYPgcf z*5>bUYVJZ=rE9!P`iu?!ESr0Sp;ew?8Bd_F#2s-lpq;8Et`Q|Ei6yC4$wjF^iowXh z&`j6RP}jgT#K7Fj*vQJ*LKny|Ft~Qlkr_opZhlH;S|x4`%bR~fJPNcSCow5Chaq$P=2GZ;Kw{an^LB{Ts5R2_56 diff --git a/build/darknet/x64/data/labels/109_2.png b/build/darknet/x64/data/labels/109_2.png deleted file mode 100644 index cf8cf63d65b863cce47d7b918048f0484fd7efe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^(m<@h0VEiXF~vLwQY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_Q5iSWl2)^F3W0Lp07O|LB)C=;7HJKfC(&^m?|9`|{u9&iOB+R6f74 z@!|itOofvQ8~*ALq|Au1y77udAzN@p>hS{)_$NoRiOu9lxy!iulBC3* z#G>N|l}Wo%?+VxbFU7#Q4<_K-r+kei>9nO2Eg!&=!FkI(=B diff --git a/build/darknet/x64/data/labels/109_3.png b/build/darknet/x64/data/labels/109_3.png deleted file mode 100644 index 5f6757b902ecc9aeae160c4fe47effb3114aeb15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^%0R5m0VEi%Kg@dpq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990ficX>Pih57+xhXFj&oCU=S~uvn$XBD8ZEE?e4^zc?9gDoo@>w2 zo~RtdE6$vKYm=FOG0;?GrK0ND{#6TCN-<1#T_Mwx)YJ;}n`((`L`h0wNvc(HQ7VvP zFfuSS(={~IH82e^Ft;)`vNE;M1u_f_1U7mALlQ|tZhlH;S|x4`iElnwfCCh0Lr!8+ XY7Rs0I@W9JfINn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5}crr&qH85kH@JzX3_JdP*-@V7~j2(?}{O)e|mmc8k{!?nX%#*S)X zp6id+D;WLXc4Sqd;f7O3^O{#rO=oC&`v1RwQhEc^;ol0Km)Q*LnlD?6Y^_h05ODbS z^Z$S2$cZd(0WwG9zhE?s7M*2g2T@ZnPxrl;bHD^n9D-1;Pb zqIy23xz<<46ZO%m2W4tgw&qMWbmD}=(-*L&rt8NDlrK-BD{GvaDLB+yOY2{sx z$-h_%i@0o<6xQwP4mkaXSudSqS~S=5^Gu)DD__x4P%@IxDd#(Pzhm7s&V^?DI^Si^ z-S1gv#m6FTDnak!p!+L`h0w zNvc(HQ7VvPFfuSS(={~IH82e^Ft;)`wlXl+1u_f_9B;>(qiD#@PsvQH#I3=g?P)hS e7JxS7BqpWiFyyXdy|xZ0#Ng@b=d#Wzp$PyVX1?+O diff --git a/build/darknet/x64/data/labels/109_5.png b/build/darknet/x64/data/labels/109_5.png deleted file mode 100644 index be6b733ebdb6aa5afb2e1d2a8b1a1cad2a38112c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmeAS@N?(olHy`uVBq!ia0vp^#z5@A0VEhE)d80|TRjr;B5V$MNJJ{#FSRSB+Pthnzp~a%Who^08wlRtxU_ zDj)O4XXaK7ZRX`cS3boT*t)kId~p8%|NO@ik_iXCh`Ib)BplP>n91#PzOLiI`~TBL zB_=c+u$+*?uf0j)bC8Mc^Hzy~h9|TC*G~>;mH2Ug!Hb>hooeR=KHKxfb}Zy}?dKHO zJmZI(Md!gMl8YTwx?NpbSh;=9h`I7JGY3D-o^W9P(?1^jURCo8{l0LJ=V9?5r>n-Y zVpFOG>UOaTXSa97xL!=|>`-H$G0(JM;rvAc6W?l7i79{aX^3p@xcT2uU}5Tsst9|f zC-M$oU6fQO#&ukXNwIx)BC~^E$xPTYL*FICY}34u6x&|{8=F0x!Z*Cgbh-AJU2u1& zN{MXuJk1kTO^QkKoG)g!yPhv+s(RM{O7g1loG*XWWqUxZRqRX*r@nvO|7)xJX<+cG zmbgZgq$HN4S|t~y0x1R~14A=iLqlBy(+~r5D`R6TLvvjq!@!`oFm@%1hTQy=%(P0} l8vf`!6$M8i(1x7Eq|_XS+;yzi)&YeWJYD@<);T3K0RXzz+0+04 diff --git a/build/darknet/x64/data/labels/109_6.png b/build/darknet/x64/data/labels/109_6.png deleted file mode 100644 index a02a117596acca0803549d9b5e752fb76a4549ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^HbCsf0VEg>y~!v7QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIH=O_6OXoe2UW3el@Z%Ffe9%x;TbJ98Uh>&zK-_)n-*?$mbQ$9xnbFvvsnFIP>fk zp%*<<9v&BF3jHA=SrO7CzQ^_2ou@o(y$a_-)7e-Gb}|MR8#i$(p1J*nccG=6k{C~l ze|owD+n(D8wf>bZ;xfKbb7axZ8H~IIa*SF(p0w+odCxH|qu945F0sX#X*FGIRtYW(f1tmqfIq~9*>|&{my|uv^&TYyw z_8X@4>Rz8e2cBI#%iXj;=j?w?1~4m2?kW!(!-D1QTo*rFHU-9mYKdz^NlIc#s#S7P zDv)9@GB7mLH8j*UFby#RgQu&X%Q~loCIIAiNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5}5@Y!?LGcYi&_H=O!i8!46!=LwnLDs1inv0k9%rXKoLd>3q^tLO> z3oFlGl>gf{Waj$Sm(HqMNJ_An)TrCJnm)}p6q&>RdApRMLgNE#j;ZHA?U;}<x|pKIaK=C0F0xe*hcpUJjqDkvB{wsrZDskm!z%-({BE;`Fp7A|@9*Q4#n;uC+G-Ip1Q z1^X>t<@)JA;}xDzHevH)Ca#jY(Q1cMTmCILmD6@ydzt3WjAc4U9x5jIHF~Z{n6-(= z_pRj)AMIIZ?8{7^E6*(A^?e(@<4l#w%>O|3V^X!mHKHUXu_VKd4a7?@ib8(SHh>jD`D2IoVfuApeh%}>cptHiBgALpYCa9RP{ bkdv5{n!}L0j`i9)pb&$ntDnm{r-UW|{3H)W diff --git a/build/darknet/x64/data/labels/110_0.png b/build/darknet/x64/data/labels/110_0.png deleted file mode 100644 index 49a258238ad79c3cbdfede642ee5cec684b435eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)T0VEiv{XS6wq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3yUv?kF4ppdSoi(?4K_2eJ?j65&C6wMAOd%fOa*6WAa^A0=Qdhow~ zudc(bU;pbLpXHEhuVc8r%>F`F(Bc@NM%5D6h?11Vl2ohYqEsNoU}RuurfX=ZYhW5; zU~Xk>WMyQj3uG7=>|yrOMA49&pOTqYiCe?jxKC5Tt_9kVlbDp6!;ojr(=GxOV(@hJ Kb6Mw<&;$TcYFl&w diff --git a/build/darknet/x64/data/labels/110_1.png b/build/darknet/x64/data/labels/110_1.png deleted file mode 100644 index 10630ccea620f79d056be9aea5d943006ca39c27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmeAS@N?(olHy`uVBq!ia0vp@KrF@qBpB=_dj0@XEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4>!h+|KMR%bA0ck4|8Ic(k!%Bafy)9B0S$a}#(TPMv&oapQl6eXCz4nB}zm0Xkxq!^4049#>64RsAnLk!HVjE$^}Ep>qm1A~H45bDP46hP^x@Isih!@P+6=(yLU`q0KcVYP7-hXC4kjGx) z>Fdh=fSZ+1!9Y3I6J%Jvr;B5V#`)wQ{frW9J1;DD)qQJS@7PjjY+!JwPWUX(5{V^Y zhg-`|8aOa~_M9<+!#(77i;$;+HoMx98kr>zIn9}yd3{cZCAEq(H*5K<;8F@Xd_aLy zcowVRtOExW_=KbQ1!wiCY?-;vsadma0s}*5%z2L54la;uR7+eVN>UO_QmvAUQh^kM zk%6I^uA!l>foX_=xs|bzm5GHekO6dww1*UmhTQy=%(P0}8rHgfSO)el(1x7Eq|_XS UJae9Q5ugx*r>mdKI;Vst09bu#uK)l5 diff --git a/build/darknet/x64/data/labels/110_3.png b/build/darknet/x64/data/labels/110_3.png deleted file mode 100644 index b0d6ae1bde6d28e6e4afa7c13e5643e2349263b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^;y|p;0VEi<{q$J{q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC0W_mv&aOZkpafHrx4R3&|Mvbf`++?6 z5>H=O_6OXodiQp`*_a9+}=;q5kj@d*UN&$32e=KF&7yIC;gR z{KQAg1CQS4kNwE#AKvUN!?2i5@OsTrEft{iR7+eVN>UO_QmvAUQh^kMk%6I^uA!l> zfoX_=xs|bzm8pd;kYQjTu+ak;7)Tm&^HVa@DsgK_eDlEq940^;auSnLa~Sf>dD=yQ OLJXd+elF{r5}E+JSdc{k diff --git a/build/darknet/x64/data/labels/110_4.png b/build/darknet/x64/data/labels/110_4.png deleted file mode 100644 index 8f57528a36347b334bc9f39cf3c0e6a15f90a3c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^vOsLg0VEh^u;;Xy){e0sC;f~7X=e#C#Ivz>B zRo$}2oLL~{|NsAnoiiD^epvrocv3Dr#ewPJicRho5&;KnQX<6_H*|jbV-P8v5~;v( z@2~KQTJyR5XOjQ*DMj-aKPz-I_;0dl%^m$6`g0C2c~3|U7ErvvAU2~(XSaajZf>0m zT{_jmiq*n80nIwUc@=+i=>+tuobDF+wBIl#G*F2xHmp8mTG7q_KMt(WsZC+z__NP@ zH@jy&(DAAzt`Q|Ei6yC4$wjF^iowXh&`j6RP}jgT#K7Fj*x1UzLKny|FxWm>_a2Id r-29Zxv`X9>j-8vD1P(Ev4LONPsW}XJ<~;2pKp_TCS3j3^P6kD0Ics#WBR=c=8W_0fQbb$xtV6)$?jUP81p$oMbs$*T3XR zw}HePmQC}QZ8AE*kp5A6$E5QD3(x-lum2$3fvxEI#i@TzCp$1d(!Vez#VDacBt$hX zVUlxHWRv8&mgm-8LJAXJ?flBG@#(vVh|d#|SwgG%3-Y%)wWcl9N~~_-=)A8buu&#N zb>9ic2nIoJw@@S5$dg$eGq_hx;y&Ru&*_Ly;FJx2-8yx|HZ0)l5;DDVLzIy_Yq3V5 zYv`gjS5KBzLdiN_mpHXg%7q#&nfgba!)&}n(G1?1_r%_u`5wDOkzp0VEh?7YXG8DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWUp{*>BkKmg1Iym^3Ny2591QvHGL@10 zM#H*yQ>DyOdDvdOicy@hVAD1u^G%1kGhR6;Bpi<3@L+Z3tAdR;C0_j~Q)+rR+1kg1 z-T7|RlY&~d&3D*h=gMUrS>n`s^y1a4i&jN*cZ-&kx(8gfZSDN;5PJL%udZu{lWN?e zRhJ$8J(mS^vafi>bm8hxXVrI$S7|$hi#Nx{vhUgz^5#|Ag4N!~*X3zWd^N3qm2{}P zYw7<^=EbkvuJW>$GL$f%`%`9iniuGM)e_f;l9a@fRIB8oR3OD*WMF8fYiOuzU>agz zZe?t2Wn``kWEdDQ|BLcM(U6;;l9^VCTSL*}N8i9f4zwXBF)1~NA@P7xOxBp diff --git a/build/darknet/x64/data/labels/110_7.png b/build/darknet/x64/data/labels/110_7.png deleted file mode 100644 index c7b4754ac10b30067ab80db341a76f08f5fbaccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^dO#e)0VEi1WJmb`DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWs!=UXOHTvEC6@niG zv2WCfZ(R3BEhbA;>}mdmssA50d!9WQvaVz1uH1y8V8f~G$y)u5Cw&iu#C5LRBcpb` ze`Sr@vQK3;r?w|+&2Mo3$?5a-@<)yRezQIuUwq1aYQNTUpP%)U4y^bT_;m3pb`MJi zH=cV7gP+*21H(+U#5JNMC9x#cD!C{XNHG{07@FxC8tNLDh8UPz85>&}o9hA@1_tLt wqOPE5$jwj5OsmALVISwC3~;OfZOBPXO3h)&Gv{d+0SYmAy85}Sb4q9e0Ev{#nE(I) diff --git a/build/darknet/x64/data/labels/111_0.png b/build/darknet/x64/data/labels/111_0.png deleted file mode 100644 index a0e58834cb5c5b5e88811f2cf56061448fbe0360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^96-zsA{f#?O#TU^SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_XsdCeZ?*kg2DOV+hCf!wGi*j&m;U|N z?`Jf+reRmV#8P(2vS=@nHEi208A7gkC5S#|y$&=$wZt`|BqgyV)hf9t6-Y4{85o-B z8XD>vn1&dbTNxW!8CmKA83qP>n7uSnH00)|WTsW()^IlN(^Rmlfi~nMCZ*;u!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4%kB}>~IpB}AmIX0BA!_Vp3`jL%sv|_9mbZgQu&X%Q~loCII*=f_?x1 diff --git a/build/darknet/x64/data/labels/111_2.png b/build/darknet/x64/data/labels/111_2.png deleted file mode 100644 index 477108699c03709393d95e0ad4d912ea9930ea23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Lb0VEjAIoY#-6id3JuOkD)#(wTUiL4;WWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{(zg6Pr*Pr))Qpd8BZ6-5RLQ6Kl)h>cr*|4OaGevEXGx^X4aWg3`}aj1)Fxe zN-Stt$*xw>!F-}LXGI|+r+y1ZU2sA|!hMdUcj74t532dZ=5SBRZ+vl!GbOB%wOLZ4 zVxOb#hSY=$Y}``D1`&tn1f4u^fJ@9IF`=N5^O})?!9O<6HY0-%{~Ne|85n3ZhU&4* z+Q*?(Hf?63BD2m9XUP{6f)$=|dM=n~uFz+Hit~$C#Qh@-Y76Gc?J#eBa4*N5<;3EM zv<)-<7EW1Ey?fdA!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4PJA|Jl;kd3)c2(|_hHJjlQ{ zC(t}F<=hH`1B~A6lg&_(_reM#oE?v{hX(0BuG=IZ&%2M;27dAI96C3pR?^LDMP|6o&nZp=Sb5`hN$8lxm4< zL`h0wNvc(HQ7VvPFfuSS(={~IH82e^Ft;)`vNE;M1u_f_1U7mABLPW6ZhlH;S|x4` jiElnwfa3yaLr!8+Y7Rrb1NZhOpb&$ntDnm{r-UW|5Q4Yp diff --git a/build/darknet/x64/data/labels/111_4.png b/build/darknet/x64/data/labels/111_4.png deleted file mode 100644 index 7a4aeda25fe1cd8e961362b47eeeaa97d0a64e96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^@<43L0VEjae9GSnq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5`zA(sQU7#J91JY5_^EKVo?=$AL>ImIvhv;6d99Z}YlHJiWvJF4{G zW_m9pTgvnQuG8nAKH9*eGk?*E{~jq0%t6y9KB=!XOkkLKoa1Ln$ApUCSL@@~eLLY; zv8+DfQ?w$}x_kwzeQJ(B?gsqaKPzF~P4gYIjSn!{$SZuZK49~0Hi!Lx6DICb$0xxD z=9D~fxXmkO)N&%b!BRcYDO6JB$QM49|IDMq)!KjANp2Ij?QEa7Z#}DG%GGBHOY#+V zSRZumogaH^O@;WjKaJcyr!I%dF|;vp>K=3B_zMhr)e_f;l9a@fRIB8oR3OD*WMF8f zYiOuzU>agzZe?t2WniHTWEdE1pR9WiMMG|WN@iLmZVkuIO-%wvF3^UY#H7?5hI|L^ R?M*--22WQ%mvv4FO#o1)>K*_9 diff --git a/build/darknet/x64/data/labels/111_5.png b/build/darknet/x64/data/labels/111_5.png deleted file mode 100644 index 180a9c58957adfc3b2bcdbf9e873013e9dba72ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^szB_(0VEi9oOx&lq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5|c_iC047#J8Ad%8G=cpOju;m?yG5o)?BD`2J7-B;^%H5JmN3|~s> zh2CGj!sr0wgM0innmEIfVY5-1=c|fOEB^NyU4|kh#rLtx`As|9|P!qV5#p+xTJ1Mdb>nO;dSx z3dBk6T9qwOXxXvKfMY#->{b5`3w4*N@?!E$jPfpzv^Pagz99NHwaKG~ZS|?c57(t@ zm^nRm2dd-h*kS5&l{KTn)-70+OHi+|&DLb%wFO$cSW2()W!RWG@A#w9R(q|vW7WUr zRaN>7f*XFf1$?>4`l|2bhcBkGT1m|3`O_0P-QTM#t^MV6lts#M+do^W<1F4k#UHK| z$k@kdv-0%J86OmiRBfCNRKD0Mxb4irJwNQbR{fvPY#`d1|F?hHtN;IJHf3}*#r-`V z^7X&(Q~@W>+;TRo|ce4*{EY?zg(>I!Xq-FrV^oy3~HC0;-6btg5p!P z#5JNMC9x#cD!C{XNHG{07@FxC8tNLDh8UPz85>&}TId291_srZx(+BBa`RI%(<*Um k;7XbL2dIG^WJ6A3QfdxEz61C6CZG_5r>mdKI;Vst07lIIJOBUy diff --git a/build/darknet/x64/data/labels/111_6.png b/build/darknet/x64/data/labels/111_6.png deleted file mode 100644 index e1482cd3de68a6854afdd02a5a3a2d641cebc228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmeAS@N?(olHy`uVBq!ia0vp^T0rc@0VEh+#LT=4q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5}PX}=m-fbvY9E{-7{$CH2fndB)ARFdaz zduDC7boZVJ34sRlcSd?km#>kyz!3b&ILE6#)W9%->EYfPUhz@J39LGkFHE%yNIJl} zY>`&2TEEJ1tuvjE9(+CFwSV?O)rwDi%*-$UUQ8<7A#gocW$Ds_#Q)|7%66iM_h$a* zU-w1H*k=QeWlq@UgDvR?rv5tIk`&NfqpTbf^UXZuW$lg=>RV>$w9nkgvuX>c+6FG$ zOZA!#scRN`B{r`ABCf1^w$aP5o<;jFZ*eVi+NR%!_@>@w39I5x`!A^Dc|}qyoI9+F zVc8d9v86u)c9v|ow048X!9}0yr9+H3Ts8U4mc|Bnif_2&Y`|V~WRZy2(|-v|zbAU} zCj?6IP4#Bg{(GABsaf)>Kk95#XESs%MKnYtYuPew{;1-T$v@?Eg{<>R?GUdg`Ytbv zBcys9!*{Z!W$>Bs{^@V)%yA2?WP8TFY_-AC?FlOz{!45+CHu!fS?S;5DgW{tIt$M? zY5$30JTJY+U%;#W<{{(hM`!6PTx36csl#UX7kj6d|EHhg;574%w)SLGVK`qfLFw^A zC1$+|f8|48{uf_%L)2*NKlkuo|EtZ+rUvc)pRD!wfBk;FT~6C-rd(+Y5&0jRe7<8z zz>XJ+SyL8>edtd+HnU@s@kfo_;qU+U%AIdsVa{^$-aZVgImsx96syh?&e+uQ^Mf)ba}G zN)T}2-|3j~%sEhDFNa=JXA-Mxpo){AZK%W*XBNS)Ni1O<3-&!}b`o6bCO@UIHYZhk z&FeW17SHePEKXary~(owzw!RWXZNhX^F4?cXHijL%)0Xky&somdsg~!eW>VDuSatEUHD|ALEN0s=`?BBns$Uzrrk@K}i&qj^ zH%IhZ0{{IFT$6Xtkrih7_ek^h;U#lVdUqxmZ{^Nh={RZ842=(V_a~__oYKggaMEOQ zoziQ~%&DGwKH_(j4y`YbQrpp_x5F)kS@o@)%6Xa82Tz0ayYv6(m3Mq#e`A>BKa)q` z<)asCJtyEyz23Y^Zv$G&UeoXTxLx5ddH{rspIh4&w7&{ zJyVMo{JP~rVprZ*)$fbk+MMRhFKBopsOq)J>Y&)wl~=d@Y7Cm%&UVq!C^|&{mesZ& z7dCG%ZwmYMeEW{*eUXc|cdyQx+__<%gHgIr&BOib?@uh~ez1B+|BCs}jStS~=?hps zw$Z+#nHJyCrDT}nH?1sepS?sOAr7xyjX4vjyr@Jske>%@1pqOLz5Hr@F4 zO!^XM-~WsDJ`PMm0`GtEZf|(to%f>I7?{*lOI#yLQW8s2t&)pUffR$0fuWhMp`osU zX^4Tjm9epvvAHggVPJ4RBzopr0ByWz+5i9m diff --git a/build/darknet/x64/data/labels/112_0.png b/build/darknet/x64/data/labels/112_0.png deleted file mode 100644 index d732efebfeffc29b6530cc348bc36189b61bb0ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)T0VEiv{XS6wq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3yUv?kF4ppdzzi(?4K_2eJ?j65&C6n%BrS|gzQ=ilyAZVI_y|JRoY zPk6THS5TVdgli>_y8rMlS-bGn+Q2W&3_Z#=N@Ck&+JHu=mbgZgq$HN4S|t~y0x1R~ z14A=iLqlBy(+~r5D`O)oBTHQ%!@ytzopr04Ky>tN;K2 diff --git a/build/darknet/x64/data/labels/112_1.png b/build/darknet/x64/data/labels/112_1.png deleted file mode 100644 index 11243af759f13ef0a6e490dd37dac29ef7bd25d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp@KrF@qBpB=_dj0@XEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4BPW!97L-`RvSx)eZc=%TEYDq`+pX`u_6# z(m6ag1?H(S3#&6XAK_l{Hks3o!BT7;d zOH!?pi&B9UgOP!unXaLsu7PQYfw`5jk(IHfE|6hhP_WW#JBo(f{FKbJO57S4zkK2b e`x$6MPGVAO4nx6N=3V7LAqG!ZKbLh*2~7a4G45bDP46hP^x@Isih!@P+6=(yLU`q0KcVYP7-hXC4kjGx) z>Fdh=fSZ+1!9Y3I6J*$SPZ!4!jq}Mr`WYqIwqMxKJbBjj`ev@bX$c88YQmU3j5yA_ zbCebvIyhLybj&`uX`l8y-V;%5!butIC*__eBn1577B%|8Zni|`gbkbMEWVAe3@2D} zYLzg&Qp#j&%UW?kZ^Z-|W@oXG74k}-S|>Ix6w_MrQC!DF^28mEVi#_YClgtin-7@J z5NQ6qr1hzj!!EgJS2WaCwEOHkxOcCkjE>MJHbJ5P^?5IIXP5I^76dd;IOa5CA{#^1 z`z6O%T~Cw%y`Wm+8c~vxSdwa$T$Bo=7>o=I&2$Y7bq!2I49u;JjjT*8bb$;5gFDh5 vQYad7^HVa@DsgLA>-J$8INX3XbP0l+XkKOqGrO diff --git a/build/darknet/x64/data/labels/112_3.png b/build/darknet/x64/data/labels/112_3.png deleted file mode 100644 index f830185e693ed124642b9b69a46d4b30a17c116b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^;y|p;0VEi<{q$J{q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC0W_mv&aOZkpafHrx4R3&|Mvbf`++?6 z5>H=O_6OXodx1gH;$j@M&q~iU}-JfmS zqMoxp`g-u_>x6T=k8wPyJbZNh;o3yTC!L3n+at_-@uqf&@Rp6q2?b6#eX;0^v+Z>S;p0wb2qw1GRZGG_W1vN>t&|?QNP7(>kKa) z4iNm`FZ)1(h_=BH$)RpQo=_~wHJIKY86bP0 Hl+XkK2#2?5 diff --git a/build/darknet/x64/data/labels/112_4.png b/build/darknet/x64/data/labels/112_4.png deleted file mode 100644 index a4b184a479a06f33fbaed17922ad4178037e2e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^vOsLg0VEh^uvngEo|G$2p0kg;s+anWnQydufPJrI8k8U!+4R%rON{j&r?)FK#IZ0 zz|c(B&`{UFG{nH%%GlV-z(N>zsJYD@<);T3K0RXAK(vScE diff --git a/build/darknet/x64/data/labels/112_5.png b/build/darknet/x64/data/labels/112_5.png deleted file mode 100644 index 02f97a201620537e7a64f78c6e6508d8e342e970..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^NMu<*RsXM&6B;gP`KabkkqB_qZxhmIE4k3Q%!Sp7 zQ-kxsR0COuP$s5p+IEbtalV4>pHl4>Xutf!Zu)boX2=q5Ur*jcv-OuMI(@1Sn3D0= zjce`HfP=9bUSW$^cFDPHkc;fR;4h+Tthgxegx8;d#qT7QBSK^%J#C}DoN9E9oH*6T zG58Ui;J>CNDPprGX>@$ZRZ*4A@Yg;f2QBJc^~hQ~V#-JDq6@KZ zftwhWRx}Fjda2>HXTq9x?ZlmJOCAY?6j)~Yysm9qU9p_4cdC5G%cIW}LyjtYukcWG zTlM(t&HrDXpI&@)!=6LmWt=&!UO4*het1ekOQ&vO>ZEF}46Q5k5}zCs|E8fO6Q7W> z_5c6>XWddf=DPm>mmK)%|Nr~RvYd7E9A{3}Q*1Zs5_*#ma?(Njr@ugeJ10YAGxzxj z>G)<~q^Op-MwFx^mZVxG7o`Fz1|tJQGhIVNT?5k)19K~5V=F@oT_D52pxRQ`0YyV@ reoAIqC2kE|DO3LdHL!zh$Vp5}&0#1w%e<=`D8%6D>gTe~DWM4fC2Qza diff --git a/build/darknet/x64/data/labels/112_6.png b/build/darknet/x64/data/labels/112_6.png deleted file mode 100644 index 2001b39e50b2eba5d5ff44f65464de467c4ea892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^8bIvD0VEjStn_>Uq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5}PX}=m-7#J9Ld%8G=cpQIw#aH8Sq73_o^v#u-nO)7zr@amz^j;*Z zA?~I3SfRJM`O&g19z_cZ42ow?`abcjJ^PQL^bAY%%+H_U-=>rK4ga`c9)o zJLkdDFPkQ5B=7WOs=di_?7>8*{f!+L^*kQTn)x8(nZX*RO)vNa|9EcwtRzwW$zM!e z>T)-W)byXX?b(H%O0-2D@6xwCbNfy>%k`=D(Q6v7%L!gPG?n$sntZW`jT`RpU3>1L zXmXUL;*h-}L*n|1n53UMn-~{L&vp2h!`||oqi=Jk?4f8D^P5Yg4^^|&<|H*==zqXB z`-;Pk{s&sKBNXR2Opx!<R<(R5F;(>N}O=Vj2Y7oS9~ul!VJquI3XU*jpozXg9|Gc$X4ConP`D>lu4pR={J zKi{5vwRqwsV0cPg5}9oDhwWaNaa~>$j{`7fRZCnWN>UO_QmvAUQh^kMk%6I^uA!l> zfoX_=xs|c8m65qFkYQlJ{4dH2MMG|WN@iLmZVg3?AAJL-9iR<4iAkwB3~`}vx>*zU^6ENZ?Y zWu@UIurX40mZP>8tK$i!9UOd*f)pQJXyWkFY2>idSfP9Os$zgkWke?Did@45)23|s z<)^#XyJ-J=+o*%C_sXlk|DCX>{ChR$~OOQSIQ^B!A{00*ito*FVb~!ugznyrs*pYpG zFNNCv`4`nPHMT@TU(4m^oL`m(Z)+EQ3CL&I zuhHN0!{)$FMR|plzl@&f#~hMhwU4bbPW4aYtGn0!&3(naKwqe?^UeA41HqqK|2h2O z`Y^kwp65|}<9wmibN-K3`@D*FiS#}{Jy+nL>%BVu4{?v!Q^nclxr*-7uTPBOd~&*P zv-xFhX?yp1mHSf9`6hsKe>M&Mo`SW{YZk^locsIEsn7D4zrOsxXOj5rlqDkd za~D7DOsKzq;YAG(kHv>;8~46_KlQ(QX>~no*(xsUXOBOu1*Qnq64!{5l*E!$tK_0o zAjM#0U}&amXsByo8e(8>Wo&F^Y_1Dr7#N%niMoQKAvZrIGp!Q0hJBomGQepLXhTk7 YQfdxE!CB^AgTe~DWM4fZU9|N diff --git a/build/darknet/x64/data/labels/113_1.png b/build/darknet/x64/data/labels/113_1.png deleted file mode 100644 index 4c81c210b49b704d7453e17289b5f40c39be627b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmeAS@N?(olHy`uVBq!ia0vp@KrF@qBpB=_dj0@XEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4x^d2SCV}7> z$t8Y&>K`&0KK-BS$HtbK=2yw_{=cWXo?iRpfZGcjV&ugBGcv4cyAkx!C8<`)MX5lF!N|bSOxMs**T6Kyz}(8%$jaDK7sxO$C|K#W9YsTKeoAIqC2kFj iUp{ez{SCAsCow5ChoNv6OV>l75QC?ypUXO@geCwchI#}5 diff --git a/build/darknet/x64/data/labels/113_2.png b/build/darknet/x64/data/labels/113_2.png deleted file mode 100644 index b29b8d012959e44ec9924a5f3735dbf0bca544cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^LO`s*0VEi##LIPo6id3JuOkD)#(wTUiL4;WWRD45bDP46hP^x@Isih!@P+6=(yLU`q0KcVYP7-hXC4kjGx) z>Fdh=fSZ+1!9Y3I6J*$SPZ!4!jq}Mr`WYqIHecvg)h*6f=B_=PoScx5!1H&)*#il@ zVpaLa7#Q7N8YtE)^s6sZi=Wvju2sULvFIDiiC?1U7(`F88}&8!)}Ce*-ISIP&=@7k zBN~*N(9y~j>exC(Qle{t)7Ah*X|^_n6#*O}8saZn%o8R)pA)dK*+Dwio*_~`C!z00 zK6}c^?Ky9!BsOs06>P2YI3ug}<^L?ph$D~G?%Z}LNXzUO_QmvAUQh^kMk%6I^uA!l>foX_=xs|bzm5GHekYQkON7_RQ uMMG|WN@iLmZVhYQJ}d)jU{;D-R4hMt^ z-q+iAe3aEH44lWv#qwRjd(QLp2Ih%cEl1Q-H%urii(P2Q%q;G-i1)~oD7I~d!u-rm zPEto=cuP;$v>YiFI4$?=#QswSokta}ne6!N{ZOb@;hN!&BT745Y&*V6>22iGyU3Yj z+wOg)*;|KoBi}*QqK87y9oHz$_~D*kacf9?^T7ff-as325|dJM7z%f>bUg$LF?hQAxvXYFzo z&~ACdBgm$~QSqzZc*aIqwcj_p85vd9FFLi)Jl%oqly_jtU&(+*yG?I&IwYdMUHtxk z|C{cVmQ{@>{)Ms>AMtaJ-9Jk*vW$7g*&3F2C$my+`WRRX3bM%moS34RXVEF*#ObkV zje^>JdzG66phR(}Xfbry}d3h`CKIPvT}g5#~&}`F~mh-*>i-C#tMdEPm~0 zKE-?U``7O`Ys}a}ZvOw6vGIJn((j8Bu0hFmS*xnk8&xuYap?N~`)@4yDuC_dwfiqL z#W?=Sz0~PA{r=8h_7lgZxUwzYbmX)WLtP}p<$vBD55LcF0*0q*iEBhjN@7W>RdP`( zkYX@0Ff`LOG}JXP4KXmcGB&m{u+RlE3=FnU*1dNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5|c_iC047#J9HJY5_^JdP*-@Ru;?StS|jtZ%yidYV+h#;#jeV^}}h zondb_K9Tj$Z&GRlLHD=f87H84qtC#|qNd%S_o!hFHX zp9@YjFq&Mv;&M=>WZB&xfByfzXjHc&XvVDBJpt}p{OQII$06Z%L+EiS2VI*11GaToVs9@W!oY(wnMY~S3MK%lFH|J zZxB_L;2f6B9r&5YmzRB$lz+#p>J?u55{u7ghL~;-xN^mzVspUNGwy+#84htfhYEKr zdZyTN{1?YjEww8aSDOl$CrtUX&8ho)nZ|ypbx-_ls%}-B=N9$&!4dfBimY<)-}TL% z9$Vvn{{HNvsU)d%<g716KJE}ODpX5c zBT7;dOH!?pi&B9UgOP!unXaLsu7PQYfw`5jv6Z2PE|6hhP;IH}fTAHcKP5A*61N7f jl&OD!8rVTLbP0l+XkK+T!yY diff --git a/build/darknet/x64/data/labels/113_6.png b/build/darknet/x64/data/labels/113_6.png deleted file mode 100644 index c4e0d989ddbc48df1e5bc73ca672d18495e40824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702 zcmeAS@N?(olHy`uVBq!ia0vp^8bIvD0VEjStn_>Uq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5}PX}=m-7#J8gd%8G=cpOju;jfY)5o)ojAVl#dSHJ0Q?+pdoKfc)< zSpMODQ8JrE0?#fMp_x34+JPc=MM(~9YrfY1|KGN$ccN(C^K=Jh!TlRFV@@AyVEnW} zBj)&-2G*Q|0TolFXIruPmbBLEJ}5eKakYHS@Bfc0W{XT>+i~bA$HMFl2Yy9%xh}Nx zIr5M@h+%uOh7G&$gvwqS;s0|kh+aF$61M2rP0y0nYX<)RoV#PaLt5*1F8HJNCFMf* zst0OY12|nD@~v>P_i6p3!L{B|R4Qr3?rtfY_(aV&#=8!wW&~<5Kh1Xtf6=?lK+gTg zog|mw9Xw*~y92KLEq3*{eQ&Xl>CyQKqT3RdeJGjHam%^I%7w{YW6wzzVWIZQ7r7GK z&V02ORm|A^bUg$LF?hQAxvXaF1tC~@GU@v#|7=LJ0lm7h*M;$s zpZD+c>}U6?&+VOl;Xd!hz3)ob|F-|A&KxSa@ZhvJyFTtdaBqKv#}AfpYx~C;_pfU# zDqr>GxJ1<5_og#zYlQx6nAtJ;<)o^7VMn!>L62&;vdmRt{jTd`^moPlX@x?$j(1HC`NwWA z*b#k8u>M=^s;(F7&tCBVV8XOLnfFW0+8*-@`VRTYs`5AA^|L*=9J%uNyMB=e$`LP* z)@Xik3wve|uUo}$zgYRqZP)*&&Yx)g=~ZA;b6hTYA4`R{Hs6`&C)WQLIW)iLfcb_b z_djYe_v6BX{$4P5-hcYC)PwJd7pfOWXtC8_XuPX0y5}o*jW);U>^(EDnck6fH+X;k zkzq>Q(eh-DS1*@nncLO8obIPQvBH1es`l+Ub^+TL2Y>!>v8pOViP8P@p0^VO*!eFWGI^SSua6@yX)GKfhyg z&h+)3TQjdJlHo=I z&2$Y7bq!2I49u;JjjfE$b%6{6gYzL#S5P$M=BH$)RpQpLkMmImIJE(7$Vp5}&0#3q T#nSZgTe~DWM4fyERD| diff --git a/build/darknet/x64/data/labels/114_0.png b/build/darknet/x64/data/labels/114_0.png deleted file mode 100644 index 9d42671db0a8f219f7f3497109ca87c338cf02c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1o0VEhE@kw|BDVB6cUq=Rpjs4tz5!lV|}@NWs&^F@)oK@(+F{o)b@sVhkYKpu8`KD-SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_Yp!eP<26vet~dYx zzkq9xV3xMv87&pzjf4STeZYBq9i4;B-JXpC>2OC7#SFv=^7g9 z8kmL{m|GbeSs7dE0vQGd1uMO_qiD#@PsvQH#I1qx%O`HIlYutmBqpWiFcc~C-i`(e OF?hQAxvXkr_Wm>bfjssS zPhVH|2i&ZD3I@uto*=_KJzX3_BrYfa=;x7OYb#&0`8P+$_t}k&iN(4T5@zr`4K-xq zy!SmoZgs}@u1{h!yw1Hg2zJ_MOnIf+TBISfV0ytku)LJXd+ KelF{r5}E*P0&D#M diff --git a/build/darknet/x64/data/labels/114_4.png b/build/darknet/x64/data/labels/114_4.png deleted file mode 100644 index 65912f0814169a0d5f2f73d2369537970f8911b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^B0y})0VEhwgr+zFDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWEs{%tOh+?Ldq4tO$1{8{{NpjPfdM#-ao?) z3(T1XUi{y$b%=pcT(IfB$-*Q)4=wG5Nj$R!nkLQR;d%3_%ZDfHzd#cY&zhvUlYfyKgX3UL}x#+)oD8PeNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5|c_iC04fI^czT^vI!PAC89XEx~Z;t}oqp74S9#67V^Cl0Qa+xkg5 z;*l}4M9TmFv(GTF{#hTWB9-unXP$RdP`(kYX@0Ff`LOG}JXP z4KXmcGB&m{w9o}I3=FC*bsbPN<*DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWez-zyECZ%rY#0+$a7{ZJCf{(W4dKu9Eso-gR9&w`ZQ^ zsyP-N56re)PD@Of@Vi%woyEzxzR70O!IjVLcg?xOJj4F~qSJ=+4snR@h5qSp=sy1;zdc4%Zl`3$ldy*qZ@0PUiOcOQt#~r6{}gZ3&i^|OuDJ7IDlNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5|wbCb@B0)-BGx;Tb-98dn?&tTA_B@t@yNc7Iy;?RWWfuHhrGlmCb z@w2Y~_y2$FsUr-`zy1cWzB8D3{QrMf1BFHbAJ*CvpLmWNh{UA1Puu>df8hbHqYb7K zTxttWX#YJLpunRhDigzVqv6Yu{}Nmd3S4jgu9s$JwNDN{uth*FVg0}4;0ukWD+IZ& z)CmV%_$vn1&db zTNxW$8Jp_@83qRDL!z#rXvob^$xN%ntzjSMqYQ8e0&U1iOiImRC{pIV9Ssy>@O1Ta JS?83{1OQZFnTh}a diff --git a/build/darknet/x64/data/labels/115_0.png b/build/darknet/x64/data/labels/115_0.png deleted file mode 100644 index 4767c453c05cb3cb0de36b7dc16362eb6565f82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)T0VEiv{XS6wq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3yUv?kF4ppb#5i(?4K_2eJ?j65&CM6>rs2<&zLcvyHt#af?l_6mPr z957!Q?C@*Nylv<8b$%@{VQ67+7XKP7y&kAnwZt`|BqgyV)hf9t6-Y4{85o-B8XD>v zn1&dbTNxW!8CmKA83qP>n7uSnH00)|WTsW()^IlN(^Rm7fi~nMCZ*;u6o+uVJ_{6L N@O1TaS?83{1OR-rT2%l5 diff --git a/build/darknet/x64/data/labels/115_1.png b/build/darknet/x64/data/labels/115_1.png deleted file mode 100644 index 79f5d39cd69c95b7e602f5de47613efc03d475a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^Ahs9>kYKpu8`KD-SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PJ_Yp!eP<2|g*0BWzEUUh4mS%1ad!63FDQy!WVN&nFyLX<|Nmc}{Nl&? z5634u>fCK@{HzynuwRWg%x`+~6bm6XhLT-d!t~Ayy#v~+TH+c}l9E`GYL#4+3Zxi} z3=GY54Gnb-OhXLJt&EMVj4gG63DwrAm)wSK?bJcwcbhK)T zYeY#(Vo9o1a#1RfVlXl=G}ARS)HN^-F)+6>HnK9Y&;>FK4DLvKNTF!R%}>cptHiBg jt=orX;E)2^kdv5{n!`{W!u9$rP>8|P)z4*}Q$iB}7krcx diff --git a/build/darknet/x64/data/labels/115_3.png b/build/darknet/x64/data/labels/115_3.png deleted file mode 100644 index bc0d24f56d239aaa7a6738acb543678091088ca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^!a%Ie0VEjq3%$7jq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3x*!yOBxfkMwbT^vI+&L{uq=agvMdt<-x=BVf}TSuYawxNxTEHiBM z4j;L9%isXRZK)MA_&bg#FJ@YlQr~biui?hJ{Qv*$R~~-wm1R+$uE!hAj=wc_XZm6l zHgd1X`>Dks5^UG~YMf-Blt=J48kJ_B$r|Pnv1Ezv*aNvkrUb-6t%Y*5om_=ACHB zVSC-nE_wFNl%(?vn1&dbTNxW!nOf)q83qOd y8$E#Gi=-hpKP5A*61RrLHy-AZn5QC?ypUXO@geCweq_e63 diff --git a/build/darknet/x64/data/labels/115_4.png b/build/darknet/x64/data/labels/115_4.png deleted file mode 100644 index a39b0f0c8094a685dddb1479c0471dd00549a66f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^5bC!ZDuaZ1e6#3TPw!k$?^9{&q31! z-RB8H%exbW)*lqQttix=Bq90DQB@(ZfJNux8O{_g=fliz6#MiOI>R<7&FeG&|9^fb z<7Q!nb-&&+7OE`X!qIZ@H^-|x`i&Za=k~F_`&`fcMDWos^$CYxoxkRz%&5i|w|Nn> z$nv`rH5eIGgTHORQK4E33_H~l*NBpo#FA92=)}hMdHt)EtK55U$r}fkF(Pu6{1-oD!M< Dy*$V2 diff --git a/build/darknet/x64/data/labels/115_5.png b/build/darknet/x64/data/labels/115_5.png deleted file mode 100644 index 63e00783a5de96c3bf0b031b4b83c2bbda9fe727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^GC=IW0VEi7v^PZ!4!i_^(J`q>S7y!vcT#%Evt;yOd}$)4Ho7kmGE zA(Yy{==S`v#-!aP3qfAek0 zBUg4ZTwlpNExDP?CnZJaSL24s%sP@>#YsQyRM!7#nK7&1RzT$7q@wv7yp}m{sj4}q zwp0F9-OSAU8(P-#o_SxBdE7wdy&}^z$JH+tqYm7^;>u+;?F9RZjh{A8;`N-BE*Di} z=ixFbEv9Fl&^2OC z7#SFv=^7g98kmL{m|GbeTNzsD0vQGd)t0&rC>nC}Q!>*kackg8nfeE)fgNN+PGVAO W4nuJW*Xy%DAqG!ZKbLh*2~7Zc0qQ6K diff --git a/build/darknet/x64/data/labels/115_6.png b/build/darknet/x64/data/labels/115_6.png deleted file mode 100644 index 344ef8493076438732bedaed260fd9b57fd77521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^3P9||0VEjy*KvvfDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tW0?{I7;U0XG%oB;*4qJ z^{G0%|NsC0vSp0LhwdNptzeldzKgr`x=0$^!BmfZH@HIsn7>D@d@Y=kuh*z`gGv0) zM}E}>+nhv89&o+d?jyi@XnVoYR?{mSON}i=&NNicwS1-&#%eDj_%Pk*sqVBFb_e@J zj^r%N-kpc!u`>HU-)gRh4 z3|cjRY>#Ple9u3LiC-n0NmRy+`Qt2sPwy=hxsncW)v-G6wPjqV!29Y1tAOyM#C@Ok z^G@5xJNfy4j=&FYVsd4Crjw=SNG9HKi*Sg2c6{1ri7oX9oIfqH5v%O1_L%t9s!=fZ z-WSEJDhv7ZjXG=1zw5g-{oJB=+pnv;u`yUP<&bEPNhdofMjCh+5=wnjKYe>w4U9t7 z64!{5l*E!$tK_0oAjM#0U}&amXsByo8e(8>Wo&F^WT6XW7#MurrnMMFLvDUbW?Cg~ k4K1%H$%7LK(1x7Eq|_XS;t;OaXMsWtp00i_>zopr0Ck-D>i_@% diff --git a/build/darknet/x64/data/labels/115_7.png b/build/darknet/x64/data/labels/115_7.png deleted file mode 100644 index c6e743c0af5468aa3be94cf6fc06be42086cc12e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmeAS@N?(olHy`uVBq!ia0vp^YCs&q0VEhs?~&R8q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3fC?L07#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`vY!PK1H>2lg^4VFfe}hba4#vIG+5&UnD^y)NEBwh~(O-e=YZyg@ymV@>c(Y z#_wGRT4ytIT{*QbA^h9cdHsy6JLVl;l(W`^*(zbxkLG1>;yIbk1ir9`N|uH4@VIK6 zGJ70w^gxNU=goN29Xp#Qzr~nrj&B+-t_;uMd0J0?O)~0QvdUFFLJMXAgFWd zpMBX;54nB)hExCkHxK2Ao%_*M%=76$GY$x731d6eT9{t6=?2V&}vPZ*bl}W4mH!NAeU3^=oY()o0 z(5!~vTY$c{u`#%rwcqK;yypj6B-S6QjcS}yP<(x^?QRPeLGFVcCw{#?-N609#;NP_ z`aFve!*$M{9`&C#u1cEQJWr=zDtXly{8|VTV1_nzopr0GcCHo=I&2$Y7bq!2I z49u;JjjW6B&Mb9V|=_PEg@ltpPl*)My5Z8 z7L~8G9F{GrG7EjP(5!tnqFCYHKDhJismdKI;Vst0FWbC?*IS* diff --git a/build/darknet/x64/data/labels/116_3.png b/build/darknet/x64/data/labels/116_3.png deleted file mode 100644 index 0314e85e75e0c6c22d2c0149042199407ba792e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD0VEij8hW<@DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tW2OC z7#SFv=^7g98kmL{m|GbeS(#es0vQGd0vkPmPDav@o1c=IR*73f;+qc^V3z}J$Vp5} X&0#1xl~bP0l+XkKR$5*F diff --git a/build/darknet/x64/data/labels/116_4.png b/build/darknet/x64/data/labels/116_4.png deleted file mode 100644 index cf919a6ba13a9c69e5b0d93848f5a330b14c3334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^LO^WF0VEhQd7iKWDVB6cUq=Rpjs4tz545bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{(zg6Pmx2&<-jeVkfo=KV~EE2^oO zG9@iHcP+ysLuScq{%pPS?p*>}5}Zy9Gy85`PG`H54m3oy#5JNMC9x#cD!C{XNHG{0 z7@FxC8tNLDh8UPz85>&}Sm**71_s+F>)u1rkei>9nO2Eg!?ANylfW(q+K`i&l$yg( Uaw@Mb4=BXo>FVdQ&MBb@03X>{t^fc4 diff --git a/build/darknet/x64/data/labels/116_5.png b/build/darknet/x64/data/labels/116_5.png deleted file mode 100644 index c9e04ed2ab4c48ed245a8954a1c460aa7be53a89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^qCo7x0VEhM*eCM=DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWEs{%yaqf)7p2c6Y!D0mV#O@6MlNm9X~_!* zYNER23fP&XI~o`}_GWKrIlSUUL+7IAz`(3dCI)4>fA&224ab27sg}4#l%ynNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5`;j(H->fkKX+E{-778T_s%9mPK^p0s$9a*&X=#8jE7Do#QSk#%1laP2t212j>! z#5JNMC9x#cD!C{XNHG{07@FxC8tNLDh8UPz85>&}Tj&BA1_qWgTDB+}a`RI%(<*Um j@Nk^e2=)fhhMdHt)EtJAQ+aiHKp_TCS3j3^P6_E)T0VEiv{XS6wq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz3x}|J^R9fI|A7E{-7_*OPznGxEInlJxxl|E=cAFP8fK|DXN#&-sF& zPgj-i{dOqb*`)L};)`P@gQm8_agE4rUx8XxOI#yLQW8s2t&)pUffR$0fuWhMp`osU zX^4Tjm9dePv4Jj-VPNpokUs@QLvDUbW?Cg~4O4Qq-vGN8XhTk7QfdxE>E2AgA3z}n MPgg&ebxsLQ0H|(X#Q*>R diff --git a/build/darknet/x64/data/labels/117_1.png b/build/darknet/x64/data/labels/117_1.png deleted file mode 100644 index 59cae8a9830e32de09632c6bc97548b6d4e54e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmeAS@N?(olHy`uVBq!ia0vp@KrF@qBpB=_dj0@XEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4J<=E3ywjKs3W3T??9X8-@#&2D^X*75yzPh(@}#70HIN7MLKSG|$3TDyP63uO^G zhF{8W?i^XN+ZkxQYKdz^NlIc#s#S7PDv)9@GB7mLH8j*UFby#45bDP46hP^x@Isih!@P+6=(yLU`q0KcVYP7-hXC4kjGx) z>Fdh=fSZ+1!7wDMaxze;+|$J|MB{w&kA6mpwh0%C+1T1X3zS(iH{0B86>)I#4{R}U zaEfnm+O6Ppl!s?p!gX(BgA&IU8%c>t2c0(Z@C2=QR9Y?}DKV{~wU4Q^>)DsmqlJtw z^#$^u8y#SH%$4Es=e0;vhsIiGmUI2imv398&;M)Pk;K7}@Z-vL{S#Af0iB>);u=ws zl30>zm0Xkxq!^4049#>64RsAnLk!HVjE$^JEOmhl1B0p@=XEF=a`RI%(<*Um;5PgX g3Ql&A4LONPsW}X#do%rh0EHMlUHx3vIVCg!05n&0GXMYp diff --git a/build/darknet/x64/data/labels/117_3.png b/build/darknet/x64/data/labels/117_3.png deleted file mode 100644 index 18679c3975b37da13835d3dd31fe167846bab46c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^5Y!S$?}@oZBWtXmGQD+`L>XVszlQB*AOACE=?rwyCErE<5qvg_OTmQn$M zYR8*13jd|N{j%*`2OC7#SFv z=^7g98kmL{m|GbeS(#es0vQGd0vkPmVS=O~H$NpatrE9}#5W%-z(E7FAtx~@HHV>e TZ>HZ5pb&$ntDnm{r-UW|`ZR*S diff --git a/build/darknet/x64/data/labels/117_4.png b/build/darknet/x64/data/labels/117_4.png deleted file mode 100644 index bceedf94d925066c0afe60090bb9c4c7e049d0f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^vOsLg0VEh^u;wz1;WmD*I6WYlyl<-1s>e5L$ z{4QalyWfa(tdZ-GZB?n}*V!$gl+B&=Tk&KZ+v#=fC)%2Bw0UgWeQ?usg-y8%X0P2_ za@ai@-io`3Eh-U;`6Pcsc-e(5AH7+Q2=8H={FZt3yQZb9YYf5{yfvHf{d0uOjN_j; z)PDEOXJp#3#3gdU8JUPxzyH_sF~)DmVZCUNiB@4CVR%+$aA1 z|375+^fn9W?uIar|ISM$NG_=?xN(w+q2b*5`Cm9EI|IF?TH+c}l9E`GYL#4+3Zxi} z3=GY54Gnb-OhXLJt&EMW3@mhk3M_YsY&3l1lo|3n3S5s VP`WqM?*~wb!PC{xWt~$(69C*xrxySK diff --git a/build/darknet/x64/data/labels/117_5.png b/build/darknet/x64/data/labels/117_5.png deleted file mode 100644 index c0bddab6e857f4a905e5e20eab8d64276e08ba59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^N|XzF65*^ zP!U(ZPD{r9 zQ$Y29=>Z#Q5!Ky_Uf&$29%-)h@t-jDiQ|+#jaoCgA1+h8t;`{2^pijI(?sqw>2tWk zKc19aw3>a{lX@AKhJ&S#ttX_f^PkZEA#(nKsdt{XtV&FHGJSeNd!acptHiB=D`n~*payo34LONPsW}X#do%rh Q0EHMlUHx3vIVCg!0LY`c0RR91 diff --git a/build/darknet/x64/data/labels/117_6.png b/build/darknet/x64/data/labels/117_6.png deleted file mode 100644 index 731fd1448d568383400162b42f43ab2e0b24dbcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^8bIvD0VEjStn_>Uq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBga(Rz5`;j(H->85kI)JY5_^JdP*-@K;HY2(?&M5Te*CB4+GxptwXbd&QCG zfvt|zqF zLyo*L-?U5D;Nt&+R{xm`lj7zJy!!URnf12-*Z*qAqY^Ez{TqC1cO7dN)H?Ey$Ma#O z7@I|cVCb}GZUvHB|CBZV#2;$l_NZ|R{1M9EZnez!f1t>}`o37z(|7)7aQ&}8n{X&( zdC>#=wnP8_>#G(m*1A0J-(P#P*8l(i--vs@UjNw1Bd4_U=URMatCErwx_W%Yp}agzZe?t2Wn`fXWEdEH x-KMn|MMG|WN@iLmZVfH3C&`1O253W0Vp3`jL+Rd3zaKy$22WQ%mvv4FO#sVF!<7I4 diff --git a/build/darknet/x64/data/labels/117_7.png b/build/darknet/x64/data/labels/117_7.png deleted file mode 100644 index c04ed0b1256b450aaa7948e740bf31a3c67a6b76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^dO#e)0VEi1WJmb`DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWRs&C1U zYCh&=>m8o%){B{Qu=;0k$1P>vM+J`G(lt(*8z?X{y4IQ&ilt1v^IzlC|J}w9n3dLF zoMJD0ba~CydXuOB&wqFncK3t4^Uwd?UKS$8-~S(9^ymL^r?8w=zUTfNU-jqze|6JS z8CjNp$`+_|PpSI)>y1vhZ=#-BSX}1i2gh6JK43pfMKgz z;u=wsl30>zm0Xkxq!^4049#>64RsAnLk!HVjE${~Ep&kl0|QGLEn5@~x%nxXX_dG& jcsNdK1jioGhMdHt)EtJ=y_tSLfIy{8|VTV1_n@~ diff --git a/build/darknet/x64/data/labels/118_1.png b/build/darknet/x64/data/labels/118_1.png deleted file mode 100644 index fa886ac2f4f6a4dc392f332c93f865703e936f0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmeAS@N?(olHy`uVBq!ia0vp@KrF@qBpB=_dj0@XEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4kr_Wm>bfjssS zPhVH|2i&ZD3Wgz3m6L%&>pfi@Lp07O|LEtGXj>E^#oYYEpJR7RW8-^Wk2iMQ%!ipa zTnKk$Ys>1m=fcM3yy1op8{56@0voN*@bIuZ_{6fcdCidB$ivgQscr8|CQ6&-d*R|xY~#3&wVXPiBl8q%A7i|!D&Y0YtcSv5w&I)(RSl!mS;OB{vv64!@7eUs~0?zm0Xkxq!^4049#>64RsAnLk!HVjE$^JEOmhl1B0p@=XEF=a`RI% n(<*Um;5Pg%1P(8t4LONPsW}W~DhcvVKp_TCS3j3^P6_(xD4tILwcKt7rl$aqY!D64p z^4n{|cga}>j~}lW3yAr^Jgp;&Yf8ouvF7?K5-fHJlYi`QSSVLL=f7E1zp~*TMWd-a z!ki2$A1cn+tDHUu^tNh=YeY#(Vo9o1a#1RfVlXl=G}ARS)HN^-F)+6>HnK9c)CDpO z47MF}1_msWhTQy=%(P0}8jjEY-2)D5pba^RNvSyuWhx2sPCy|BPgg&ebxsLQ0F!T| AzyJUM diff --git a/build/darknet/x64/data/labels/118_4.png b/build/darknet/x64/data/labels/118_4.png deleted file mode 100644 index 93991521924b8c3224489ca21a621365ae3a0586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmeAS@N?(olHy`uVBq!ia0vp^azJd#0VEiT4OqH?6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeM~ zFY)wsWq-iU%BRR7#cYk4*cTre8b7@;qlWv z;(L+6?1gNeyQFlCES&pPx- zz6ksjE2OgL>wiuG)!)L($9_3Ha{Ry8;fl!_j=ySbWiryM(p+lF8^3IA=vaAU(qVDI z1w9M`-v1A%{oOy6kx4Dt-)BC{!A%;oCSHzGj;Oj+FLO!$N8_fT`-Ps($;prE=UjSU zA*r(e@w9*OoPDBmF0BvU_i*yR|1a$0UjAQv>BM_YsY&2i d1KN<2n3S5sP^OX~?*tTL@O1TaS?83{1ORcg*}?z- diff --git a/build/darknet/x64/data/labels/118_5.png b/build/darknet/x64/data/labels/118_5.png deleted file mode 100644 index 279c954365ddf40c62623842b47dbfad798bbb41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 653 zcmeAS@N?(olHy`uVBq!ia0vp^DnRVO0VEj0`MN+fOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>}0Wrb5XX~q(w3v z7uZ@B@iQd|%C^k%-;*HNT<_r+z0fd0pp)$0mQ0bi60ULOynLx? zZ6WgR&wbXg#XrSoFZzEo;pDFWaS2s7>(_M2ZEjRqd%yYb`j6tf7yW;!5V4FD5?)FK#IZ0z|c(B&`{UFG{nH%%GlV- z&_Wl;FfgdL)OA47kei>9nO2Eg16Rt_KR^xaARBTLlTvdS%2X2Moq$3Np00i_>zopr E00B7pod5s; diff --git a/build/darknet/x64/data/labels/118_6.png b/build/darknet/x64/data/labels/118_6.png deleted file mode 100644 index 9379cb994f2e170c2dac1bbb6882882b59855c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmeAS@N?(olHy`uVBq!ia0vp^nn3Ku0VEihvz6`vDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tW?Eavh-$l6k-3+sW$7-xkF9@YlL~+OkA48 z9a(i*beXg|B9@#G->`Ax#*f?)+7&KMfi@g$ohuG1DMfTNDR>14Y!q_2n||l}w|&dJ zwg#s>|9iiG=9@D{4`k0wU00H7ntJnmfe7zjmeRJ2vm#eHZFPRHD0cj`k}v!HW