From 31b92128cfcdf5cc7630b04ce046345caa33877a Mon Sep 17 00:00:00 2001 From: gongdaguo Date: Tue, 15 Sep 2020 16:33:11 +0800 Subject: [PATCH] add object detection --- .../image_classification/app/build.gradle | 6 - .../image_classification/app/download.gradle | 7 +- .../app/src/main/cpp/MSNetWork.cpp | 107 +-- .../app/src/main/cpp/MSNetWork.h | 7 +- .../app/src/main/cpp/MindSporeNetnative.cpp | 112 ++- .../app/src/main/cpp/MindSporeNetnative.h | 3 + .../widget/CameraFragment.java | 1 - .../official/lite/object_detection/.gitignore | 83 ++ .../lite/object_detection/README.en.md | 549 +++++++++++ .../official/lite/object_detection/README.md | 490 ++++++++++ .../lite/object_detection/app/.gitignore | 3 + .../lite/object_detection/app/CMakeLists.txt | 82 ++ .../lite/object_detection/app/build.gradle | 61 ++ .../lite/object_detection/app/download.gradle | 82 ++ .../object_detection/app/proguard-rules.pro | 21 + .../hiobject/ExampleInstrumentedTest.java | 26 + .../app/src/main/AndroidManifest.xml | 46 + .../app/src/main/cpp/MSNetWork.cpp | 55 ++ .../app/src/main/cpp/MSNetWork.h | 59 ++ .../app/src/main/cpp/MindSporeNetnative.cpp | 269 ++++++ .../app/src/main/cpp/ssd_util/ssd_util.cpp | 293 ++++++ .../app/src/main/cpp/ssd_util/ssd_util.h | 202 ++++ .../mindspore/hiobject/SplashActivity.java | 95 ++ .../hiobject/help/ImageDegreeHelper.java | 185 ++++ .../hiobject/help/RecognitionObjectBean.java | 159 ++++ .../hiobject/help/TrackingMobile.java | 118 +++ .../objectdetect/AutoFitTextureView.java | 78 ++ .../hiobject/objectdetect/CameraActivity.java | 48 + .../hiobject/objectdetect/CameraFragment.java | 899 ++++++++++++++++++ .../objectdetect/DealDataActivity.java | 263 +++++ .../hiobject/objectdetect/ObjectRectView.java | 114 +++ .../hiobject/objectdetect/PhotoActivity.java | 116 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 + .../app/src/main/res/drawable/dog_cat.jpg | Bin 0 -> 86807 bytes .../app/src/main/res/drawable/error.jpg | Bin 0 -> 224683 bytes .../res/drawable/ic_launcher_background.xml | 170 ++++ .../app/src/main/res/drawable/mindspore.png | Bin 0 -> 35998 bytes .../src/main/res/layout/activity_camera.xml | 22 + .../src/main/res/layout/activity_dealdata.xml | 6 + .../src/main/res/layout/activity_photo.xml | 13 + .../src/main/res/layout/activity_splash.xml | 52 + .../src/main/res/layout/fragment_camera.xml | 18 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../app/src/main/res/mipmap-xxhdpi/logo.png | Bin 0 -> 16217 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes .../app/src/main/res/values/colors.xml | 7 + .../app/src/main/res/values/strings.xml | 11 + .../app/src/main/res/values/styles.xml | 10 + .../mindspore/hiobject/ExampleUnitTest.java | 17 + .../lite/object_detection/build.gradle | 24 + .../lite/object_detection/gradle.properties | 19 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../official/lite/object_detection/gradlew | 172 ++++ .../lite/object_detection/gradlew.bat | 84 ++ .../object_detection/images/app_result.jpg | Bin 0 -> 111233 bytes .../lite/object_detection/images/home.png | Bin 0 -> 40083 bytes .../lite/object_detection/images/install.jpg | Bin 0 -> 27417 bytes .../images/object_detection.png | Bin 0 -> 164013 bytes .../images/project_structure.png | Bin 0 -> 37421 bytes .../lite/object_detection/images/run_app.PNG | Bin 0 -> 5165 bytes .../images/sdk_management.png | Bin 0 -> 88566 bytes .../lite/object_detection/settings.gradle | 2 + 73 files changed, 5191 insertions(+), 121 deletions(-) create mode 100644 model_zoo/official/lite/object_detection/.gitignore create mode 100644 model_zoo/official/lite/object_detection/README.en.md create mode 100644 model_zoo/official/lite/object_detection/README.md create mode 100644 model_zoo/official/lite/object_detection/app/.gitignore create mode 100644 model_zoo/official/lite/object_detection/app/CMakeLists.txt create mode 100644 model_zoo/official/lite/object_detection/app/build.gradle create mode 100644 model_zoo/official/lite/object_detection/app/download.gradle create mode 100644 model_zoo/official/lite/object_detection/app/proguard-rules.pro create mode 100644 model_zoo/official/lite/object_detection/app/src/androidTest/java/com/mindspore/hiobject/ExampleInstrumentedTest.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/AndroidManifest.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/cpp/MSNetWork.cpp create mode 100644 model_zoo/official/lite/object_detection/app/src/main/cpp/MSNetWork.h create mode 100644 model_zoo/official/lite/object_detection/app/src/main/cpp/MindSporeNetnative.cpp create mode 100644 model_zoo/official/lite/object_detection/app/src/main/cpp/ssd_util/ssd_util.cpp create mode 100644 model_zoo/official/lite/object_detection/app/src/main/cpp/ssd_util/ssd_util.h create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/SplashActivity.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/ImageDegreeHelper.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/RecognitionObjectBean.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/TrackingMobile.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/AutoFitTextureView.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/CameraActivity.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/CameraFragment.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/DealDataActivity.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/ObjectRectView.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/PhotoActivity.java create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/drawable/dog_cat.jpg create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/drawable/error.jpg create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/drawable/mindspore.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_camera.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_dealdata.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_photo.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_splash.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/layout/fragment_camera.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-xxhdpi/logo.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/values/colors.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/values/strings.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/main/res/values/styles.xml create mode 100644 model_zoo/official/lite/object_detection/app/src/test/java/com/mindspore/hiobject/ExampleUnitTest.java create mode 100644 model_zoo/official/lite/object_detection/build.gradle create mode 100644 model_zoo/official/lite/object_detection/gradle.properties create mode 100644 model_zoo/official/lite/object_detection/gradle/wrapper/gradle-wrapper.jar create mode 100644 model_zoo/official/lite/object_detection/gradle/wrapper/gradle-wrapper.properties create mode 100644 model_zoo/official/lite/object_detection/gradlew create mode 100644 model_zoo/official/lite/object_detection/gradlew.bat create mode 100644 model_zoo/official/lite/object_detection/images/app_result.jpg create mode 100644 model_zoo/official/lite/object_detection/images/home.png create mode 100644 model_zoo/official/lite/object_detection/images/install.jpg create mode 100644 model_zoo/official/lite/object_detection/images/object_detection.png create mode 100644 model_zoo/official/lite/object_detection/images/project_structure.png create mode 100644 model_zoo/official/lite/object_detection/images/run_app.PNG create mode 100644 model_zoo/official/lite/object_detection/images/sdk_management.png create mode 100644 model_zoo/official/lite/object_detection/settings.gradle diff --git a/model_zoo/official/lite/image_classification/app/build.gradle b/model_zoo/official/lite/image_classification/app/build.gradle index ed58f89cded..8b62db4e623 100644 --- a/model_zoo/official/lite/image_classification/app/build.gradle +++ b/model_zoo/official/lite/image_classification/app/build.gradle @@ -49,8 +49,6 @@ android { } } packagingOptions{ - pickFirst 'lib/arm64-v8a/libminddata-lite.so' - pickFirst 'lib/arm64-v8a/libmindspore-lite.so' pickFirst 'lib/arm64-v8a/libmlkit-label-MS.so' } @@ -61,10 +59,6 @@ android { // Before gradle build. // To download some necessary libraries. apply from:'download.gradle' -/*if (!file("libs/arm64-v8a/libmindspore-lite.so").exists() || - !file("libs/arm64-v8a/libopencv_java4.so").exists()){ - apply from:'download.gradle' -}*/ diff --git a/model_zoo/official/lite/image_classification/app/download.gradle b/model_zoo/official/lite/image_classification/app/download.gradle index 52ce5301817..b1795f8c548 100644 --- a/model_zoo/official/lite/image_classification/app/download.gradle +++ b/model_zoo/official/lite/image_classification/app/download.gradle @@ -14,6 +14,10 @@ def mindsporeLiteDownloadUrl = "https://download.mindspore.cn/model_zoo/official def cleantargetMindSporeInclude = "src/main/cpp" +task cleanCmakeCache(type: Delete) { + delete '.cxx/cmake/debug' + delete '.cxx/cmake/release' +} task downloadModelFile(type: DownloadUrlTask) { doFirst { @@ -45,7 +49,7 @@ task cleanUnusedmindsporeFiles(type: Delete, dependsOn: ['unzipMindSporeInclude' } } /* - * Using preBuild to download mindspore library, opencv library and model file. + * Using preBuild to download mindspore library and model file. * Run before gradle build. */ if (file("src/main/cpp/${mindsporeLite_Version}/lib/libmindspore-lite.so").exists()){ @@ -58,6 +62,7 @@ if (file("src/main/assets/model/mobilenetv2.ms").exists()){ downloadModelFile.enabled = false } +preBuild.dependsOn cleanCmakeCache preBuild.dependsOn downloadModelFile preBuild.dependsOn downloadMindSporeLibrary preBuild.dependsOn unzipMindSporeInclude diff --git a/model_zoo/official/lite/image_classification/app/src/main/cpp/MSNetWork.cpp b/model_zoo/official/lite/image_classification/app/src/main/cpp/MSNetWork.cpp index abce847eabb..ea1736e6f48 100644 --- a/model_zoo/official/lite/image_classification/app/src/main/cpp/MSNetWork.cpp +++ b/model_zoo/official/lite/image_classification/app/src/main/cpp/MSNetWork.cpp @@ -22,14 +22,14 @@ #define MS_PRINT(format, ...) __android_log_print(ANDROID_LOG_INFO, "MSJNI", format, ##__VA_ARGS__) -MSNetWork::MSNetWork(void) : session(nullptr), model(nullptr) {} +MSNetWork::MSNetWork(void) : session_(nullptr) {} MSNetWork::~MSNetWork(void) {} void MSNetWork::CreateSessionMS(char *modelBuffer, size_t bufferLen, mindspore::lite::Context *ctx) { - session = mindspore::session::LiteSession::CreateSession(ctx); - if (session == nullptr) { + session_ = mindspore::session::LiteSession::CreateSession(ctx); + if (session_ == nullptr) { MS_PRINT("Create Session failed."); return; } @@ -41,7 +41,7 @@ MSNetWork::CreateSessionMS(char *modelBuffer, size_t bufferLen, mindspore::lite: return; } - int ret = session->CompileGraph(model); + int ret = session_->CompileGraph(model); if (ret != mindspore::lite::RET_OK) { MS_PRINT("CompileGraph failed."); return; @@ -49,104 +49,7 @@ MSNetWork::CreateSessionMS(char *modelBuffer, size_t bufferLen, mindspore::lite: } int MSNetWork::ReleaseNets(void) { - delete session; -// delete model; + delete session_; return 0; } -const char *MSNetWork::labels_name_map[MSNetWork::RET_CATEGORY_SUM] = { - {"Tortoise"}, {"Container"}, {"Magpie"}, {"Seaturtle"}, {"Football"}, {"Ambulance"}, {"Ladder"}, - {"Toothbrush"}, {"Syringe"}, {"Sink"}, {"Toy"}, {"Organ(MusicalInstrument) "}, {"Cassettedeck"}, - {"Apple"}, {"Humaneye"}, {"Cosmetics"}, {"Paddle"}, {"Snowman"}, {"Beer"}, {"Chopsticks"}, - {"Humanbeard"}, {"Bird"}, {"Parkingmeter"}, {"Trafficlight"}, {"Croissant"}, {"Cucumber"}, - {"Radish"}, {"Towel"}, {"Doll"}, {"Skull"}, {"Washingmachine"}, {"Glove"}, {"Tick"}, {"Belt"}, - {"Sunglasses"}, {"Banjo"}, {"Cart"}, {"Ball"}, {"Backpack"}, {"Bicycle"}, {"Homeappliance"}, - {"Centipede"}, {"Boat"}, {"Surfboard"}, {"Boot"}, {"Headphones"}, {"Hotdog"}, {"Shorts"}, - {"Fastfood"}, {"Bus"}, {"Boy "}, {"Screwdriver"}, {"Bicyclewheel"}, {"Barge"}, {"Laptop"}, - {"Miniskirt"}, {"Drill(Tool)"}, {"Dress"}, {"Bear"}, {"Waffle"}, {"Pancake"}, {"Brownbear"}, - {"Woodpecker"}, {"Bluejay"}, {"Pretzel"}, {"Bagel"}, {"Tower"}, {"Teapot"}, {"Person"}, - {"Bowandarrow"}, {"Swimwear"}, {"Beehive"}, {"Brassiere"}, {"Bee"}, {"Bat(Animal)"}, - {"Starfish"}, {"Popcorn"}, {"Burrito"}, {"Chainsaw"}, {"Balloon"}, {"Wrench"}, {"Tent"}, - {"Vehicleregistrationplate"}, {"Lantern"}, {"Toaster"}, {"Flashlight"}, {"Billboard"}, - {"Tiara"}, {"Limousine"}, {"Necklace"}, {"Carnivore"}, {"Scissors"}, {"Stairs"}, - {"Computerkeyboard"}, {"Printer"}, {"Trafficsign"}, {"Chair"}, {"Shirt"}, {"Poster"}, - {"Cheese"}, {"Sock"}, {"Firehydrant"}, {"Landvehicle"}, {"Earrings"}, {"Tie"}, {"Watercraft"}, - {"Cabinetry"}, {"Suitcase"}, {"Muffin"}, {"Bidet"}, {"Snack"}, {"Snowmobile"}, {"Clock"}, - {"Medicalequipment"}, {"Cattle"}, {"Cello"}, {"Jetski"}, {"Camel"}, {"Coat"}, {"Suit"}, - {"Desk"}, {"Cat"}, {"Bronzesculpture"}, {"Juice"}, {"Gondola"}, {"Beetle"}, {"Cannon"}, - {"Computermouse"}, {"Cookie"}, {"Officebuilding"}, {"Fountain"}, {"Coin"}, {"Calculator"}, - {"Cocktail"}, {"Computermonitor"}, {"Box"}, {"Stapler"}, {"Christmastree"}, {"Cowboyhat"}, - {"Hikingequipment"}, {"Studiocouch"}, {"Drum"}, {"Dessert"}, {"Winerack"}, {"Drink"}, - {"Zucchini"}, {"Ladle"}, {"Humanmouth"}, {"DairyProduct"}, {"Dice"}, {"Oven"}, {"Dinosaur"}, - {"Ratchet(Device)"}, {"Couch"}, {"Cricketball"}, {"Wintermelon"}, {"Spatula"}, {"Whiteboard"}, - {"Pencilsharpener"}, {"Door"}, {"Hat"}, {"Shower"}, {"Eraser"}, {"Fedora"}, {"Guacamole"}, - {"Dagger"}, {"Scarf"}, {"Dolphin"}, {"Sombrero"}, {"Tincan"}, {"Mug"}, {"Tap"}, {"Harborseal"}, - {"Stretcher"}, {"Canopener"}, {"Goggles"}, {"Humanbody"}, {"Rollerskates"}, {"Coffeecup"}, - {"Cuttingboard"}, {"Blender"}, {"Plumbingfixture"}, {"Stopsign"}, {"Officesupplies"}, - {"Volleyball(Ball)"}, {"Vase"}, {"Slowcooker"}, {"Wardrobe"}, {"Coffee"}, {"Whisk"}, - {"Papertowel"}, {"Personalcare"}, {"Food"}, {"Sunhat"}, {"Treehouse"}, {"Flyingdisc"}, - {"Skirt"}, {"Gasstove"}, {"Saltandpeppershakers"}, {"Mechanicalfan"}, {"Facepowder"}, {"Fax"}, - {"Fruit"}, {"Frenchfries"}, {"Nightstand"}, {"Barrel"}, {"Kite"}, {"Tart"}, {"Treadmill"}, - {"Fox"}, {"Flag"}, {"Frenchhorn"}, {"Windowblind"}, {"Humanfoot"}, {"Golfcart"}, {"Jacket"}, - {"Egg(Food)"}, {"Streetlight"}, {"Guitar"}, {"Pillow"}, {"Humanleg"}, {"Isopod"}, {"Grape"}, - {"Humanear"}, {"Powerplugsandsockets"}, {"Panda"}, {"Giraffe"}, {"Woman"}, {"Doorhandle"}, - {"Rhinoceros"}, {"Bathtub"}, {"Goldfish"}, {"Houseplant"}, {"Goat"}, {"Baseballbat"}, - {"Baseballglove"}, {"Mixingbowl"}, {"Marineinvertebrates"}, {"Kitchenutensil"}, {"Lightswitch"}, - {"House"}, {"Horse"}, {"Stationarybicycle"}, {"Hammer"}, {"Ceilingfan"}, {"Sofabed"}, - {"Adhesivetape "}, {"Harp"}, {"Sandal"}, {"Bicyclehelmet"}, {"Saucer"}, {"Harpsichord"}, - {"Humanhair"}, {"Heater"}, {"Harmonica"}, {"Hamster"}, {"Curtain"}, {"Bed"}, {"Kettle"}, - {"Fireplace"}, {"Scale"}, {"Drinkingstraw"}, {"Insect"}, {"Hairdryer"}, {"Kitchenware"}, - {"Indoorrower"}, {"Invertebrate"}, {"Foodprocessor"}, {"Bookcase"}, {"Refrigerator"}, - {"Wood-burningstove"}, {"Punchingbag"}, {"Commonfig"}, {"Cocktailshaker"}, {"Jaguar(Animal)"}, - {"Golfball"}, {"Fashionaccessory"}, {"Alarmclock"}, {"Filingcabinet"}, {"Artichoke"}, {"Table"}, - {"Tableware"}, {"Kangaroo"}, {"Koala"}, {"Knife"}, {"Bottle"}, {"Bottleopener"}, {"Lynx"}, - {"Lavender(Plant)"}, {"Lighthouse"}, {"Dumbbell"}, {"Humanhead"}, {"Bowl"}, {"Humidifier"}, - {"Porch"}, {"Lizard"}, {"Billiardtable"}, {"Mammal"}, {"Mouse"}, {"Motorcycle"}, - {"Musicalinstrument"}, {"Swimcap"}, {"Fryingpan"}, {"Snowplow"}, {"Bathroomcabinet"}, - {"Missile"}, {"Bust"}, {"Man"}, {"Waffleiron"}, {"Milk"}, {"Ringbinder"}, {"Plate"}, - {"Mobilephone"}, {"Bakedgoods"}, {"Mushroom"}, {"Crutch"}, {"Pitcher(Container)"}, {"Mirror"}, - {"Personalflotationdevice"}, {"Tabletennisracket"}, {"Pencilcase"}, {"Musicalkeyboard"}, - {"Scoreboard"}, {"Briefcase"}, {"Kitchenknife"}, {"Nail(Construction)"}, {"Tennisball"}, - {"Plasticbag"}, {"Oboe"}, {"Chestofdrawers"}, {"Ostrich"}, {"Piano"}, {"Girl"}, {"Plant"}, - {"Potato"}, {"Hairspray"}, {"Sportsequipment"}, {"Pasta"}, {"Penguin"}, {"Pumpkin"}, {"Pear"}, - {"Infantbed"}, {"Polarbear"}, {"Mixer"}, {"Cupboard"}, {"Jacuzzi"}, {"Pizza"}, {"Digitalclock"}, - {"Pig"}, {"Reptile"}, {"Rifle"}, {"Lipstick"}, {"Skateboard"}, {"Raven"}, {"Highheels"}, - {"Redpanda"}, {"Rose"}, {"Rabbit"}, {"Sculpture"}, {"Saxophone"}, {"Shotgun"}, {"Seafood"}, - {"Submarinesandwich"}, {"Snowboard"}, {"Sword"}, {"Pictureframe"}, {"Sushi"}, {"Loveseat"}, - {"Ski"}, {"Squirrel"}, {"Tripod"}, {"Stethoscope"}, {"Submarine"}, {"Scorpion"}, {"Segway"}, - {"Trainingbench"}, {"Snake"}, {"Coffeetable"}, {"Skyscraper"}, {"Sheep"}, {"Television"}, - {"Trombone"}, {"Tea"}, {"Tank"}, {"Taco"}, {"Telephone"}, {"Torch"}, {"Tiger"}, {"Strawberry"}, - {"Trumpet"}, {"Tree"}, {"Tomato"}, {"Train"}, {"Tool"}, {"Picnicbasket"}, {"Cookingspray"}, - {"Trousers"}, {"Bowlingequipment"}, {"Footballhelmet"}, {"Truck"}, {"Measuringcup"}, - {"Coffeemaker"}, {"Violin"}, {"Vehicle"}, {"Handbag"}, {"Papercutter"}, {"Wine"}, {"Weapon"}, - {"Wheel"}, {"Worm"}, {"Wok"}, {"Whale"}, {"Zebra"}, {"Autopart"}, {"Jug"}, {"Pizzacutter"}, - {"Cream"}, {"Monkey"}, {"Lion"}, {"Bread"}, {"Platter"}, {"Chicken"}, {"Eagle"}, {"Helicopter"}, - {"Owl"}, {"Duck"}, {"Turtle"}, {"Hippopotamus"}, {"Crocodile"}, {"Toilet"}, {"Toiletpaper"}, - {"Squid"}, {"Clothing"}, {"Footwear"}, {"Lemon"}, {"Spider"}, {"Deer"}, {"Frog"}, {"Banana"}, - {"Rocket"}, {"Wineglass"}, {"Countertop"}, {"Tabletcomputer"}, {"Wastecontainer"}, - {"Swimmingpool"}, {"Dog"}, {"Book"}, {"Elephant"}, {"Shark"}, {"Candle"}, {"Leopard"}, {"Axe"}, - {"Handdryer"}, {"Soapdispenser"}, {"Porcupine"}, {"Flower"}, {"Canary"}, {"Cheetah"}, - {"Palmtree"}, {"Hamburger"}, {"Maple"}, {"Building"}, {"Fish"}, {"Lobster"}, - {"GardenAsparagus"}, {"Furniture"}, {"Hedgehog"}, {"Airplane"}, {"Spoon"}, {"Otter"}, {"Bull"}, - {"Oyster"}, {"Horizontalbar"}, {"Conveniencestore"}, {"Bomb"}, {"Bench"}, {"Icecream"}, - {"Caterpillar"}, {"Butterfly"}, {"Parachute"}, {"Orange"}, {"Antelope"}, {"Beaker"}, - {"Mothsandbutterflies"}, {"Window"}, {"Closet"}, {"Castle"}, {"Jellyfish"}, {"Goose"}, {"Mule"}, - {"Swan"}, {"Peach"}, {"Coconut"}, {"Seatbelt"}, {"Raccoon"}, {"Chisel"}, {"Fork"}, {"Lamp"}, - {"Camera"}, {"Squash(Plant)"}, {"Racket"}, {"Humanface"}, {"Humanarm"}, {"Vegetable"}, - {"Diaper"}, {"Unicycle"}, {"Falcon"}, {"Chime"}, {"Snail"}, {"Shellfish"}, {"Cabbage"}, - {"Carrot"}, {"Mango"}, {"Jeans"}, {"Flowerpot"}, {"Pineapple"}, {"Drawer"}, {"Stool"}, - {"Envelope"}, {"Cake"}, {"Dragonfly"}, {"Commonsunflower"}, {"Microwaveoven"}, {"Honeycomb"}, - {"Marinemammal"}, {"Sealion"}, {"Ladybug"}, {"Shelf"}, {"Watch"}, {"Candy"}, {"Salad"}, - {"Parrot"}, {"Handgun"}, {"Sparrow"}, {"Van"}, {"Grinder"}, {"Spicerack"}, {"Lightbulb"}, - {"Cordedphone"}, {"Sportsuniform"}, {"Tennisracket"}, {"Wallclock"}, {"Servingtray"}, - {"Kitchen&diningroomtable"}, {"Dogbed"}, {"Cakestand"}, {"Catfurniture"}, {"Bathroomaccessory"}, - {"Facialtissueholder"}, {"Pressurecooker"}, {"Kitchenappliance"}, {"Tire"}, {"Ruler"}, - {"Luggageandbags"}, {"Microphone"}, {"Broccoli"}, {"Umbrella"}, {"Pastry"}, {"Grapefruit"}, - {"Band-aid"}, {"Animal"}, {"Bellpepper"}, {"Turkey"}, {"Lily"}, {"Pomegranate"}, {"Doughnut"}, - {"Glasses"}, {"Humannose"}, {"Pen"}, {"Ant"}, {"Car"}, {"Aircraft"}, {"Humanhand"}, {"Skunk"}, - {"Teddybear"}, {"Watermelon"}, {"Cantaloupe"}, {"Dishwasher"}, {"Flute"}, {"Balancebeam"}, - {"Sandwich"}, {"Shrimp"}, {"Sewingmachine"}, {"Binoculars"}, {"Raysandskates"}, {"Ipod"}, - {"Accordion"}, {"Willow"}, {"Crab"}, {"Crown"}, {"Seahorse"}, {"Perfume"}, {"Alpaca"}, {"Taxi"}, - {"Canoe"}, {"Remotecontrol"}, {"Wheelchair"}, {"Rugbyball"}, {"Armadillo"}, {"Maracas"}, - {"Helmet"}}; - diff --git a/model_zoo/official/lite/image_classification/app/src/main/cpp/MSNetWork.h b/model_zoo/official/lite/image_classification/app/src/main/cpp/MSNetWork.h index da04476180a..9ba12e53fc1 100644 --- a/model_zoo/official/lite/image_classification/app/src/main/cpp/MSNetWork.h +++ b/model_zoo/official/lite/image_classification/app/src/main/cpp/MSNetWork.h @@ -52,9 +52,8 @@ class MSNetWork { int ReleaseNets(void); - mindspore::session::LiteSession *session; - mindspore::lite::Model *model; - static const int RET_CATEGORY_SUM = 601; - static const char *labels_name_map[RET_CATEGORY_SUM]; + mindspore::session::LiteSession * session() const { return session_; } + private: + mindspore::session::LiteSession *session_; }; #endif diff --git a/model_zoo/official/lite/image_classification/app/src/main/cpp/MindSporeNetnative.cpp b/model_zoo/official/lite/image_classification/app/src/main/cpp/MindSporeNetnative.cpp index c0283a2dc8e..8788a892915 100644 --- a/model_zoo/official/lite/image_classification/app/src/main/cpp/MindSporeNetnative.cpp +++ b/model_zoo/official/lite/image_classification/app/src/main/cpp/MindSporeNetnative.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,103 @@ using mindspore::dataset::LPixelType; using mindspore::dataset::LDataType; #define MS_PRINT(format, ...) __android_log_print(ANDROID_LOG_INFO, "MSJNI", format, ##__VA_ARGS__) +static const int RET_CATEGORY_SUM = 601; +static const char *labels_name_map[RET_CATEGORY_SUM] = { + {"Tortoise"}, {"Container"}, {"Magpie"}, {"Seaturtle"}, {"Football"}, {"Ambulance"}, {"Ladder"}, + {"Toothbrush"}, {"Syringe"}, {"Sink"}, {"Toy"}, {"Organ(MusicalInstrument) "}, {"Cassettedeck"}, + {"Apple"}, {"Humaneye"}, {"Cosmetics"}, {"Paddle"}, {"Snowman"}, {"Beer"}, {"Chopsticks"}, + {"Humanbeard"}, {"Bird"}, {"Parkingmeter"}, {"Trafficlight"}, {"Croissant"}, {"Cucumber"}, + {"Radish"}, {"Towel"}, {"Doll"}, {"Skull"}, {"Washingmachine"}, {"Glove"}, {"Tick"}, {"Belt"}, + {"Sunglasses"}, {"Banjo"}, {"Cart"}, {"Ball"}, {"Backpack"}, {"Bicycle"}, {"Homeappliance"}, + {"Centipede"}, {"Boat"}, {"Surfboard"}, {"Boot"}, {"Headphones"}, {"Hotdog"}, {"Shorts"}, + {"Fastfood"}, {"Bus"}, {"Boy "}, {"Screwdriver"}, {"Bicyclewheel"}, {"Barge"}, {"Laptop"}, + {"Miniskirt"}, {"Drill(Tool)"}, {"Dress"}, {"Bear"}, {"Waffle"}, {"Pancake"}, {"Brownbear"}, + {"Woodpecker"}, {"Bluejay"}, {"Pretzel"}, {"Bagel"}, {"Tower"}, {"Teapot"}, {"Person"}, + {"Bowandarrow"}, {"Swimwear"}, {"Beehive"}, {"Brassiere"}, {"Bee"}, {"Bat(Animal)"}, + {"Starfish"}, {"Popcorn"}, {"Burrito"}, {"Chainsaw"}, {"Balloon"}, {"Wrench"}, {"Tent"}, + {"Vehicleregistrationplate"}, {"Lantern"}, {"Toaster"}, {"Flashlight"}, {"Billboard"}, + {"Tiara"}, {"Limousine"}, {"Necklace"}, {"Carnivore"}, {"Scissors"}, {"Stairs"}, + {"Computerkeyboard"}, {"Printer"}, {"Trafficsign"}, {"Chair"}, {"Shirt"}, {"Poster"}, + {"Cheese"}, {"Sock"}, {"Firehydrant"}, {"Landvehicle"}, {"Earrings"}, {"Tie"}, {"Watercraft"}, + {"Cabinetry"}, {"Suitcase"}, {"Muffin"}, {"Bidet"}, {"Snack"}, {"Snowmobile"}, {"Clock"}, + {"Medicalequipment"}, {"Cattle"}, {"Cello"}, {"Jetski"}, {"Camel"}, {"Coat"}, {"Suit"}, + {"Desk"}, {"Cat"}, {"Bronzesculpture"}, {"Juice"}, {"Gondola"}, {"Beetle"}, {"Cannon"}, + {"Computermouse"}, {"Cookie"}, {"Officebuilding"}, {"Fountain"}, {"Coin"}, {"Calculator"}, + {"Cocktail"}, {"Computermonitor"}, {"Box"}, {"Stapler"}, {"Christmastree"}, {"Cowboyhat"}, + {"Hikingequipment"}, {"Studiocouch"}, {"Drum"}, {"Dessert"}, {"Winerack"}, {"Drink"}, + {"Zucchini"}, {"Ladle"}, {"Humanmouth"}, {"DairyProduct"}, {"Dice"}, {"Oven"}, {"Dinosaur"}, + {"Ratchet(Device)"}, {"Couch"}, {"Cricketball"}, {"Wintermelon"}, {"Spatula"}, {"Whiteboard"}, + {"Pencilsharpener"}, {"Door"}, {"Hat"}, {"Shower"}, {"Eraser"}, {"Fedora"}, {"Guacamole"}, + {"Dagger"}, {"Scarf"}, {"Dolphin"}, {"Sombrero"}, {"Tincan"}, {"Mug"}, {"Tap"}, {"Harborseal"}, + {"Stretcher"}, {"Canopener"}, {"Goggles"}, {"Humanbody"}, {"Rollerskates"}, {"Coffeecup"}, + {"Cuttingboard"}, {"Blender"}, {"Plumbingfixture"}, {"Stopsign"}, {"Officesupplies"}, + {"Volleyball(Ball)"}, {"Vase"}, {"Slowcooker"}, {"Wardrobe"}, {"Coffee"}, {"Whisk"}, + {"Papertowel"}, {"Personalcare"}, {"Food"}, {"Sunhat"}, {"Treehouse"}, {"Flyingdisc"}, + {"Skirt"}, {"Gasstove"}, {"Saltandpeppershakers"}, {"Mechanicalfan"}, {"Facepowder"}, {"Fax"}, + {"Fruit"}, {"Frenchfries"}, {"Nightstand"}, {"Barrel"}, {"Kite"}, {"Tart"}, {"Treadmill"}, + {"Fox"}, {"Flag"}, {"Frenchhorn"}, {"Windowblind"}, {"Humanfoot"}, {"Golfcart"}, {"Jacket"}, + {"Egg(Food)"}, {"Streetlight"}, {"Guitar"}, {"Pillow"}, {"Humanleg"}, {"Isopod"}, {"Grape"}, + {"Humanear"}, {"Powerplugsandsockets"}, {"Panda"}, {"Giraffe"}, {"Woman"}, {"Doorhandle"}, + {"Rhinoceros"}, {"Bathtub"}, {"Goldfish"}, {"Houseplant"}, {"Goat"}, {"Baseballbat"}, + {"Baseballglove"}, {"Mixingbowl"}, {"Marineinvertebrates"}, {"Kitchenutensil"}, {"Lightswitch"}, + {"House"}, {"Horse"}, {"Stationarybicycle"}, {"Hammer"}, {"Ceilingfan"}, {"Sofabed"}, + {"Adhesivetape "}, {"Harp"}, {"Sandal"}, {"Bicyclehelmet"}, {"Saucer"}, {"Harpsichord"}, + {"Humanhair"}, {"Heater"}, {"Harmonica"}, {"Hamster"}, {"Curtain"}, {"Bed"}, {"Kettle"}, + {"Fireplace"}, {"Scale"}, {"Drinkingstraw"}, {"Insect"}, {"Hairdryer"}, {"Kitchenware"}, + {"Indoorrower"}, {"Invertebrate"}, {"Foodprocessor"}, {"Bookcase"}, {"Refrigerator"}, + {"Wood-burningstove"}, {"Punchingbag"}, {"Commonfig"}, {"Cocktailshaker"}, {"Jaguar(Animal)"}, + {"Golfball"}, {"Fashionaccessory"}, {"Alarmclock"}, {"Filingcabinet"}, {"Artichoke"}, {"Table"}, + {"Tableware"}, {"Kangaroo"}, {"Koala"}, {"Knife"}, {"Bottle"}, {"Bottleopener"}, {"Lynx"}, + {"Lavender(Plant)"}, {"Lighthouse"}, {"Dumbbell"}, {"Humanhead"}, {"Bowl"}, {"Humidifier"}, + {"Porch"}, {"Lizard"}, {"Billiardtable"}, {"Mammal"}, {"Mouse"}, {"Motorcycle"}, + {"Musicalinstrument"}, {"Swimcap"}, {"Fryingpan"}, {"Snowplow"}, {"Bathroomcabinet"}, + {"Missile"}, {"Bust"}, {"Man"}, {"Waffleiron"}, {"Milk"}, {"Ringbinder"}, {"Plate"}, + {"Mobilephone"}, {"Bakedgoods"}, {"Mushroom"}, {"Crutch"}, {"Pitcher(Container)"}, {"Mirror"}, + {"Personalflotationdevice"}, {"Tabletennisracket"}, {"Pencilcase"}, {"Musicalkeyboard"}, + {"Scoreboard"}, {"Briefcase"}, {"Kitchenknife"}, {"Nail(Construction)"}, {"Tennisball"}, + {"Plasticbag"}, {"Oboe"}, {"Chestofdrawers"}, {"Ostrich"}, {"Piano"}, {"Girl"}, {"Plant"}, + {"Potato"}, {"Hairspray"}, {"Sportsequipment"}, {"Pasta"}, {"Penguin"}, {"Pumpkin"}, {"Pear"}, + {"Infantbed"}, {"Polarbear"}, {"Mixer"}, {"Cupboard"}, {"Jacuzzi"}, {"Pizza"}, {"Digitalclock"}, + {"Pig"}, {"Reptile"}, {"Rifle"}, {"Lipstick"}, {"Skateboard"}, {"Raven"}, {"Highheels"}, + {"Redpanda"}, {"Rose"}, {"Rabbit"}, {"Sculpture"}, {"Saxophone"}, {"Shotgun"}, {"Seafood"}, + {"Submarinesandwich"}, {"Snowboard"}, {"Sword"}, {"Pictureframe"}, {"Sushi"}, {"Loveseat"}, + {"Ski"}, {"Squirrel"}, {"Tripod"}, {"Stethoscope"}, {"Submarine"}, {"Scorpion"}, {"Segway"}, + {"Trainingbench"}, {"Snake"}, {"Coffeetable"}, {"Skyscraper"}, {"Sheep"}, {"Television"}, + {"Trombone"}, {"Tea"}, {"Tank"}, {"Taco"}, {"Telephone"}, {"Torch"}, {"Tiger"}, {"Strawberry"}, + {"Trumpet"}, {"Tree"}, {"Tomato"}, {"Train"}, {"Tool"}, {"Picnicbasket"}, {"Cookingspray"}, + {"Trousers"}, {"Bowlingequipment"}, {"Footballhelmet"}, {"Truck"}, {"Measuringcup"}, + {"Coffeemaker"}, {"Violin"}, {"Vehicle"}, {"Handbag"}, {"Papercutter"}, {"Wine"}, {"Weapon"}, + {"Wheel"}, {"Worm"}, {"Wok"}, {"Whale"}, {"Zebra"}, {"Autopart"}, {"Jug"}, {"Pizzacutter"}, + {"Cream"}, {"Monkey"}, {"Lion"}, {"Bread"}, {"Platter"}, {"Chicken"}, {"Eagle"}, {"Helicopter"}, + {"Owl"}, {"Duck"}, {"Turtle"}, {"Hippopotamus"}, {"Crocodile"}, {"Toilet"}, {"Toiletpaper"}, + {"Squid"}, {"Clothing"}, {"Footwear"}, {"Lemon"}, {"Spider"}, {"Deer"}, {"Frog"}, {"Banana"}, + {"Rocket"}, {"Wineglass"}, {"Countertop"}, {"Tabletcomputer"}, {"Wastecontainer"}, + {"Swimmingpool"}, {"Dog"}, {"Book"}, {"Elephant"}, {"Shark"}, {"Candle"}, {"Leopard"}, {"Axe"}, + {"Handdryer"}, {"Soapdispenser"}, {"Porcupine"}, {"Flower"}, {"Canary"}, {"Cheetah"}, + {"Palmtree"}, {"Hamburger"}, {"Maple"}, {"Building"}, {"Fish"}, {"Lobster"}, + {"GardenAsparagus"}, {"Furniture"}, {"Hedgehog"}, {"Airplane"}, {"Spoon"}, {"Otter"}, {"Bull"}, + {"Oyster"}, {"Horizontalbar"}, {"Conveniencestore"}, {"Bomb"}, {"Bench"}, {"Icecream"}, + {"Caterpillar"}, {"Butterfly"}, {"Parachute"}, {"Orange"}, {"Antelope"}, {"Beaker"}, + {"Mothsandbutterflies"}, {"Window"}, {"Closet"}, {"Castle"}, {"Jellyfish"}, {"Goose"}, {"Mule"}, + {"Swan"}, {"Peach"}, {"Coconut"}, {"Seatbelt"}, {"Raccoon"}, {"Chisel"}, {"Fork"}, {"Lamp"}, + {"Camera"}, {"Squash(Plant)"}, {"Racket"}, {"Humanface"}, {"Humanarm"}, {"Vegetable"}, + {"Diaper"}, {"Unicycle"}, {"Falcon"}, {"Chime"}, {"Snail"}, {"Shellfish"}, {"Cabbage"}, + {"Carrot"}, {"Mango"}, {"Jeans"}, {"Flowerpot"}, {"Pineapple"}, {"Drawer"}, {"Stool"}, + {"Envelope"}, {"Cake"}, {"Dragonfly"}, {"Commonsunflower"}, {"Microwaveoven"}, {"Honeycomb"}, + {"Marinemammal"}, {"Sealion"}, {"Ladybug"}, {"Shelf"}, {"Watch"}, {"Candy"}, {"Salad"}, + {"Parrot"}, {"Handgun"}, {"Sparrow"}, {"Van"}, {"Grinder"}, {"Spicerack"}, {"Lightbulb"}, + {"Cordedphone"}, {"Sportsuniform"}, {"Tennisracket"}, {"Wallclock"}, {"Servingtray"}, + {"Kitchen&diningroomtable"}, {"Dogbed"}, {"Cakestand"}, {"Catfurniture"}, {"Bathroomaccessory"}, + {"Facialtissueholder"}, {"Pressurecooker"}, {"Kitchenappliance"}, {"Tire"}, {"Ruler"}, + {"Luggageandbags"}, {"Microphone"}, {"Broccoli"}, {"Umbrella"}, {"Pastry"}, {"Grapefruit"}, + {"Band-aid"}, {"Animal"}, {"Bellpepper"}, {"Turkey"}, {"Lily"}, {"Pomegranate"}, {"Doughnut"}, + {"Glasses"}, {"Humannose"}, {"Pen"}, {"Ant"}, {"Car"}, {"Aircraft"}, {"Humanhand"}, {"Skunk"}, + {"Teddybear"}, {"Watermelon"}, {"Cantaloupe"}, {"Dishwasher"}, {"Flute"}, {"Balancebeam"}, + {"Sandwich"}, {"Shrimp"}, {"Sewingmachine"}, {"Binoculars"}, {"Raysandskates"}, {"Ipod"}, + {"Accordion"}, {"Willow"}, {"Crab"}, {"Crown"}, {"Seahorse"}, {"Perfume"}, {"Alpaca"}, {"Taxi"}, + {"Canoe"}, {"Remotecontrol"}, {"Wheelchair"}, {"Rugbyball"}, {"Armadillo"}, {"Maracas"}, + {"Helmet"}}; + char *CreateLocalModelBuffer(JNIEnv *env, jobject modelBuffer) { jbyte *modelAddr = static_cast(env->GetDirectBufferAddress(modelBuffer)); int modelLen = static_cast(env->GetDirectBufferCapacity(modelBuffer)); @@ -186,12 +284,12 @@ Java_com_mindspore_himindsporedemo_gallery_classify_TrackingMobile_loadModel(JNI context->thread_num_ = num_thread; labelNet->CreateSessionMS(modelBuffer, bufferLen, context); - delete (context); + delete context; - if (labelNet->session == nullptr) { + if (labelNet->session() == nullptr) { MS_PRINT("MindSpore create session failed!."); - delete (labelNet); - delete (labelEnv); + delete labelNet; + delete labelEnv; return (jlong) nullptr; } @@ -234,7 +332,7 @@ Java_com_mindspore_himindsporedemo_gallery_classify_TrackingMobile_runNet(JNIEnv } MSNetWork *labelNet = static_cast(*labelEnv); - auto mSession = labelNet->session; + auto mSession = labelNet->session(); if (mSession == nullptr) { MS_PRINT("MindSpore error, Session is a nullptr."); return NULL; @@ -272,8 +370,8 @@ Java_com_mindspore_himindsporedemo_gallery_classify_TrackingMobile_runNet(JNIEnv msOutputs.insert(std::pair {name, temp_dat}); } - std::string resultStr = ProcessRunnetResult(MSNetWork::RET_CATEGORY_SUM, - MSNetWork::labels_name_map, msOutputs); + std::string resultStr = ProcessRunnetResult(::RET_CATEGORY_SUM, + ::labels_name_map, msOutputs); const char *resultCharData = resultStr.c_str(); return (env)->NewStringUTF(resultCharData); diff --git a/model_zoo/official/lite/image_classification/app/src/main/cpp/MindSporeNetnative.h b/model_zoo/official/lite/image_classification/app/src/main/cpp/MindSporeNetnative.h index 9f01714462e..08374ac5af4 100644 --- a/model_zoo/official/lite/image_classification/app/src/main/cpp/MindSporeNetnative.h +++ b/model_zoo/official/lite/image_classification/app/src/main/cpp/MindSporeNetnative.h @@ -17,4 +17,7 @@ #ifndef MINDSPORE_JNI_HMS_DEBUG_MINDSPORENETNATIVE_H #define MINDSPORE_JNI_HMS_DEBUG_MINDSPORENETNATIVE_H + + + #endif // MINDSPORE_JNI_HMS_DEBUG_MINDSPORENETNATIVE_H diff --git a/model_zoo/official/lite/image_classification/app/src/main/java/com/mindspore/himindsporedemo/widget/CameraFragment.java b/model_zoo/official/lite/image_classification/app/src/main/java/com/mindspore/himindsporedemo/widget/CameraFragment.java index 1dc7f46df2b..07a4ce420bf 100644 --- a/model_zoo/official/lite/image_classification/app/src/main/java/com/mindspore/himindsporedemo/widget/CameraFragment.java +++ b/model_zoo/official/lite/image_classification/app/src/main/java/com/mindspore/himindsporedemo/widget/CameraFragment.java @@ -427,7 +427,6 @@ public class CameraFragment extends Fragment { mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); mPreviewRequestBuilder.addTarget(surface); - // mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); // Here, we create a CameraCaptureSession for ic_launcher preview. mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() { diff --git a/model_zoo/official/lite/object_detection/.gitignore b/model_zoo/official/lite/object_detection/.gitignore new file mode 100644 index 00000000000..693777911f0 --- /dev/null +++ b/model_zoo/official/lite/object_detection/.gitignore @@ -0,0 +1,83 @@ +# MindSpore +build/ +app/src/main/cpp/mindspore-lite* +app/src/main/assets/model/ +mindspore/lib +output +*.ir +mindspore/ccsrc/schema/inner/* + +# Cmake files +CMakeFiles/ +cmake_install.cmake +CMakeCache.txt +Makefile +cmake-build-debug + +# Dynamic libraries +*.so +*.so.* +*.dylib + +# Static libraries +*.la +*.lai +*.a +*.lib + +# Protocol buffers +*_pb2.py +*.pb.h +*.pb.cc + +# Object files +*.o + +# Editor +.vscode +.idea/ + +# Cquery +.cquery_cached_index/ +compile_commands.json + +# Ctags and cscope +tags +TAGS +CTAGS +GTAGS +GRTAGS +GSYMS +GPATH +cscope.* + +# Python files +*__pycache__* +.pytest_cache + +# Mac files +*.DS_Store + +# Test results +test_temp_summary_event_file/ +*.dot +*.dat +*.svg +*.perf +*.info +*.ckpt +*.shp +*.pkl +.clangd +mindspore/version.py +mindspore/default_config.py +mindspore/.commit_id +onnx.proto +mindspore/ccsrc/onnx.proto + +# Android +local.properties +.gradle +sdk/build +sdk/.cxx +app/.cxx diff --git a/model_zoo/official/lite/object_detection/README.en.md b/model_zoo/official/lite/object_detection/README.en.md new file mode 100644 index 00000000000..883fe05f664 --- /dev/null +++ b/model_zoo/official/lite/object_detection/README.en.md @@ -0,0 +1,549 @@ +# demo_object_detection + +The following describes how to use the MindSpore Lite C++ APIs (Android JNIs) and MindSpore Lite object detection models to perform on-device inference, detect the content captured by a device camera, and display the most possible detection result on the application's image preview screen. + +## Deploying an Application + +The following section describes how to build and execute an on-device object detecion task on MindSpore Lite. + +### Running Dependencies + +- Android Studio 3.2 or later (Android 4.0 or later is recommended.) +- Native development kit (NDK) 21.3 +- CMake 3.10.2 +- Android software development kit (SDK) 26 or later +- OpenCV 4.0.0 or later (included in the sample code) + +### Building and Running + +1. Load the sample source code to Android Studio and install the corresponding SDK. (After the SDK version is specified, Android Studio automatically installs the SDK.) + + ![start_home](images/home.png) + + Start Android Studio, click `File > Settings > System Settings > Android SDK`, and select the corresponding SDK. As shown in the following figure, select an SDK and click `OK`. Android Studio automatically installs the SDK. + + ![start_sdk](images/sdk_management.png) + +2. Connect to an Android device and runs the object detection application. + + Connect to the Android device through a USB cable for debugging. Click `Run 'app'` to run the sample project on your device. + + ![run_app](images/project_structure.png) + + For details about how to connect the Android Studio to a device for debugging, see . + +3. Continue the installation on the Android device. After the installation is complete, you can view the content captured by a camera and the inference result. + + ![result](images/object_detection.png) + + +## Detailed Description of the Sample Program + +This object detection sample program on the Android device includes a Java layer and a JNI layer. At the Java layer, the Android Camera 2 API is used to enable a camera to obtain image frames and process images. At the JNI layer, the model inference process is completed . + +### Configuring MindSpore Lite Dependencies + +In Android Studio, place the compiled `libmindspore-lite.so` library file (which can contain multiple compatible architectures) in the `app/libs/ARM64-V8a` (Arm64) or `app/libs/armeabi-v7a` (Arm32) directory of the application project. In the `build.gradle` file of the application, configure the compilation support of CMake, `arm64-v8a`, and `armeabi-v7a`.   + +``` +android{ + defaultConfig{ + externalNativeBuild{ + cmake{ + arguments "-DANDROID_STL=c++_shared" + } + } + + ndk{ + abiFilters'armeabi-v7a', 'arm64-v8a' + } + } +} +``` + +Create a link to the `.so` library file in the `app/CMakeLists.txt` file: + +``` +# Set MindSpore Lite Dependencies. +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include/MindSpore) +add_library(mindspore-lite SHARED IMPORTED ) +set_target_properties(mindspore-lite PROPERTIES + IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/libs/libmindspore-lite.so") + +# Link target library. +target_link_libraries( + ... + mindspore-lite + minddata-lite + ... +) +``` + + + +In this example, the download.gradle File configuration auto download library file, placed in the 'app / libs / arm64-v8a' directory. + +Note: if the automatic download fails, please manually download the relevant library files and put them in the corresponding location. + +libmindspore-lite.so [libmindspore-lite.so]( https://download.mindspore.cn/model_zoo/official/lite/lib/mindspore%20version%200.7/libmindspore-lite.so) + + + +### Downloading and Deploying a Model File + +In this example, the download.gradle File configuration auto download `ssd.ms `and placed in the 'app / libs / arm64-v8a' directory. + +Note: if the automatic download fails, please manually download the relevant library files and put them in the corresponding location. + +ssd.ms [ssd.ms]( https://download.mindspore.cn/model_zoo/official/lite/ssd_mobilenetv2_lite/ssd.ms) + + + +### Compiling On-Device Inference Code + +Call MindSpore Lite C++ APIs at the JNI layer to implement on-device inference. + +The inference code process is as follows. For details about the complete code, see `src/cpp/MindSporeNetnative.cpp`. + +1. Load the MindSpore Lite model file and build the context, session, and computational graph for inference. + + - Load a model file. Create and configure the context for model inference. + + ```cpp + // Buffer is the model data passed in by the Java layer + jlong bufferLen = env->GetDirectBufferCapacity(buffer); + char *modelBuffer = CreateLocalModelBuffer(env, buffer); + ``` + + - Create a session. + + ```cpp + void **labelEnv = new void *; + MSNetWork *labelNet = new MSNetWork; + *labelEnv = labelNet; + + // Create context. + lite::Context *context = new lite::Context; + + context->device_ctx_.type = lite::DT_CPU; + context->thread_num_ = numThread; //Specify the number of threads to run inference + + // Create the mindspore session. + labelNet->CreateSessionMS(modelBuffer, bufferLen, "device label", context); + delete(context); + + ``` + + - Load the model file and build a computational graph for inference. + + ```cpp + void MSNetWork::CreateSessionMS(char* modelBuffer, size_t bufferLen, std::string name, mindspore::lite::Context* ctx) + { + CreateSession(modelBuffer, bufferLen, ctx); + session = mindspore::session::LiteSession::CreateSession(ctx); + auto model = mindspore::lite::Model::Import(modelBuffer, bufferLen); + int ret = session->CompileGraph(model); + } + ``` + +2. Pre-Process the imagedata and convert the input image into the Tensor format of the MindSpore model. + + ```cpp + // Convert the Bitmap image passed in from the JAVA layer to Mat for OpenCV processing + LiteMat lite_mat_bgr,lite_norm_mat_cut; + + if (!BitmapToLiteMat(env, srcBitmap, lite_mat_bgr)){ + MS_PRINT("BitmapToLiteMat error"); + return NULL; + } + int srcImageWidth = lite_mat_bgr.width_; + int srcImageHeight = lite_mat_bgr.height_; + if(!PreProcessImageData(lite_mat_bgr, lite_norm_mat_cut)){ + MS_PRINT("PreProcessImageData error"); + return NULL; + } + ImgDims inputDims; + inputDims.channel =lite_norm_mat_cut.channel_; + inputDims.width = lite_norm_mat_cut.width_; + inputDims.height = lite_norm_mat_cut.height_; + + // Get the mindsore inference environment which created in loadModel(). + void **labelEnv = reinterpret_cast(netEnv); + if (labelEnv == nullptr) { + MS_PRINT("MindSpore error, labelEnv is a nullptr."); + return NULL; + } + MSNetWork *labelNet = static_cast(*labelEnv); + + auto mSession = labelNet->session; + if (mSession == nullptr) { + MS_PRINT("MindSpore error, Session is a nullptr."); + return NULL; + } + MS_PRINT("MindSpore get session."); + + auto msInputs = mSession->GetInputs(); + auto inTensor = msInputs.front(); + + float *dataHWC = reinterpret_cast(lite_norm_mat_cut.data_ptr_); + // copy input Tensor + memcpy(inTensor->MutableData(), dataHWC, + inputDims.channel * inputDims.width * inputDims.height * sizeof(float)); + delete[] (dataHWC); + ``` + +3. The input image shall be NHWC(1:300:300:3). + + ```cpp + bool PreProcessImageData(const LiteMat &lite_mat_bgr, LiteMat *lite_norm_mat_ptr) { + bool ret = false; + LiteMat lite_mat_resize; + LiteMat &lite_norm_mat_cut = *lite_norm_mat_ptr; + ret = ResizeBilinear(lite_mat_bgr, lite_mat_resize, 300, 300); + if (!ret) { + MS_PRINT("ResizeBilinear error"); + return false; + } + LiteMat lite_mat_convert_float; + ret = ConvertTo(lite_mat_resize, lite_mat_convert_float, 1.0 / 255.0); + if (!ret) { + MS_PRINT("ConvertTo error"); + return false; + } + + float means[3] = {0.485, 0.456, 0.406}; + float vars[3] = {1.0 / 0.229, 1.0 / 0.224, 1.0 / 0.225}; + SubStractMeanNormalize(lite_mat_convert_float, lite_norm_mat_cut, means, vars); + return true; + } + + ``` + +4. Perform inference on the input tensor based on the model, obtain the output tensor, and perform post-processing. + + Perform graph execution and on-device inference. + + ```cpp + // After the model and image tensor data is loaded, run inference. + auto status = mSession->RunGraph(); + ``` + + Obtain the output data. + + ```cpp + auto names = mSession->GetOutputTensorNames(); + typedef std::unordered_map> Msout; + std::unordered_map msOutputs; + for (const auto &name : names) { + auto temp_dat =mSession->GetOutputByTensorName(name); + msOutputs.insert(std::pair {name, temp_dat}); + } + std::string retStr = ProcessRunnetResult(msOutputs, ret); + ``` + + The model output the object category scores (1:1917:81) and the object detection location offset (1:1917:4). The location offset can be calcalation the object location in getDefaultBoxes function . + + ```cpp + void SSDModelUtil::getDefaultBoxes() { + float fk[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::vector all_sizes; + struct Product mProductData[19 * 19] = {0}; + + for (int i = 0; i < 6; i++) { + fk[i] = config.model_input_height / config.steps[i]; + } + float scale_rate = + (config.max_scale - config.min_scale) / (sizeof(config.num_default) / sizeof(int) - 1); + float scales[7] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; + for (int i = 0; i < sizeof(config.num_default) / sizeof(int); i++) { + scales[i] = config.min_scale + scale_rate * i; + } + + for (int idex = 0; idex < sizeof(config.feature_size) / sizeof(int); idex++) { + float sk1 = scales[idex]; + float sk2 = scales[idex + 1]; + float sk3 = sqrt(sk1 * sk2); + struct WHBox tempWHBox; + + all_sizes.clear(); + + if (idex == 0) { + float w = sk1 * sqrt(2); + float h = sk1 / sqrt(2); + + tempWHBox.boxw = 0.1; + tempWHBox.boxh = 0.1; + all_sizes.push_back(tempWHBox); + + tempWHBox.boxw = w; + tempWHBox.boxh = h; + all_sizes.push_back(tempWHBox); + + tempWHBox.boxw = h; + tempWHBox.boxh = w; + all_sizes.push_back(tempWHBox); + + } else { + tempWHBox.boxw = sk1; + tempWHBox.boxh = sk1; + all_sizes.push_back(tempWHBox); + + for (int j = 0; j < sizeof(config.aspect_ratios[idex]) / sizeof(int); j++) { + float w = sk1 * sqrt(config.aspect_ratios[idex][j]); + float h = sk1 / sqrt(config.aspect_ratios[idex][j]); + tempWHBox.boxw = w; + tempWHBox.boxh = h; + all_sizes.push_back(tempWHBox); + tempWHBox.boxw = h; + tempWHBox.boxh = w; + all_sizes.push_back(tempWHBox); + } + + tempWHBox.boxw = sk3; + tempWHBox.boxh = sk3; + all_sizes.push_back(tempWHBox); + } + + for (int i = 0; i < config.feature_size[idex]; i++) { + for (int j = 0; j < config.feature_size[idex]; j++) { + mProductData[i * config.feature_size[idex] + j].x = i; + mProductData[i * config.feature_size[idex] + j].y = j; + } + } + + int productLen = config.feature_size[idex] * config.feature_size[idex]; + + for (int i = 0; i < productLen; i++) { + for (int j = 0; j < all_sizes.size(); j++) { + struct NormalBox tempBox; + float cx = (mProductData[i].y + 0.5) / fk[idex]; + float cy = (mProductData[i].x + 0.5) / fk[idex]; + tempBox.y = cy; + tempBox.x = cx; + tempBox.h = all_sizes[j].boxh; + tempBox.w = all_sizes[j].boxw; + mDefaultBoxes.push_back(tempBox); + } + } + } + } + ``` + + - The higher scores and location of category can be calcluted by the nonMaximumSuppression function. + + ```cpp + void SSDModelUtil::nonMaximumSuppression(const YXBoxes *const decoded_boxes, + const float *const scores, + const std::vector &in_indexes, + std::vector &out_indexes, const float nmsThreshold, + const int count, const int max_results) { + int nR = 0; //number of results + std::vector del(count, false); + for (size_t i = 0; i < in_indexes.size(); i++) { + if (!del[in_indexes[i]]) { + out_indexes.push_back(in_indexes[i]); + if (++nR == max_results) { + break; + } + for (size_t j = i + 1; j < in_indexes.size(); j++) { + const auto boxi = decoded_boxes[in_indexes[i]], boxj = decoded_boxes[in_indexes[j]]; + float a[4] = {boxi.xmin, boxi.ymin, boxi.xmax, boxi.ymax}; + float b[4] = {boxj.xmin, boxj.ymin, boxj.xmax, boxj.ymax}; + if (IOU(a, b) > nmsThreshold) { + del[in_indexes[j]] = true; + } + } + } + } + } + ``` + + - For the targets whose probability is greater than the threshold value, the output rectangle box needs to be restored to the original size after the rectangular box is filtered by NMS algorithm. + +```cpp +std::string SSDModelUtil::getDecodeResult(float *branchScores, float *branchBoxData) { + std::string result = ""; + NormalBox tmpBox[1917] = {0}; + float mScores[1917][81] = {0}; + + float outBuff[1917][7] = {0}; + + float scoreWithOneClass[1917] = {0}; + int outBoxNum = 0; + YXBoxes decodedBoxes[1917] = {0}; + + // Copy branch outputs box data to tmpBox. + for (int i = 0; i < 1917; ++i) { + tmpBox[i].y = branchBoxData[i * 4 + 0]; + tmpBox[i].x = branchBoxData[i * 4 + 1]; + tmpBox[i].h = branchBoxData[i * 4 + 2]; + tmpBox[i].w = branchBoxData[i * 4 + 3]; + } + + // Copy branch outputs score to mScores. + for (int i = 0; i < 1917; ++i) { + for (int j = 0; j < 81; ++j) { + mScores[i][j] = branchScores[i * 81 + j]; + } + } + + // NMS processing. + ssd_boxes_decode(tmpBox, decodedBoxes); + // const float nms_threshold = 0.6; + const float nms_threshold = 0.3; + for (int i = 1; i < 81; i++) { + std::vector in_indexes; + for (int j = 0; j < 1917; j++) { + scoreWithOneClass[j] = mScores[j][i]; + // if (mScores[j][i] > 0.1) { + if (mScores[j][i] > g_thres_map[i]) { + in_indexes.push_back(j); + } + } + if (in_indexes.size() == 0) { + continue; + } + + sort(in_indexes.begin(), in_indexes.end(), + [&](int a, int b) { return scoreWithOneClass[a] > scoreWithOneClass[b]; }); + std::vector out_indexes; + + nonMaximumSuppression(decodedBoxes, scoreWithOneClass, in_indexes, out_indexes, + nms_threshold); + for (int k = 0; k < out_indexes.size(); k++) { + outBuff[outBoxNum][0] = out_indexes[k]; //image id + outBuff[outBoxNum][1] = i; //labelid + outBuff[outBoxNum][2] = scoreWithOneClass[out_indexes[k]]; //scores + outBuff[outBoxNum][3] = + decodedBoxes[out_indexes[k]].xmin * inputImageWidth / 300; + outBuff[outBoxNum][4] = + decodedBoxes[out_indexes[k]].ymin * inputImageHeight / 300; + outBuff[outBoxNum][5] = + decodedBoxes[out_indexes[k]].xmax * inputImageWidth / 300; + outBuff[outBoxNum][6] = + decodedBoxes[out_indexes[k]].ymax * inputImageHeight / 300; + outBoxNum++; + } + } + MS_PRINT("outBoxNum %d", outBoxNum); + + for (int i = 0; i < outBoxNum; ++i) { + std::string tmpid_str = std::to_string(outBuff[i][0]); + result += tmpid_str; // image ID + result += "_"; + // tmpid_str = std::to_string(outBuff[i][1]); + MS_PRINT("label_classes i %d, outBuff %d",i, (int) outBuff[i][1]); + tmpid_str = label_classes[(int) outBuff[i][1]]; + result += tmpid_str; // label id + result += "_"; + tmpid_str = std::to_string(outBuff[i][2]); + result += tmpid_str; // scores + result += "_"; + tmpid_str = std::to_string(outBuff[i][3]); + result += tmpid_str; // xmin + result += "_"; + tmpid_str = std::to_string(outBuff[i][4]); + result += tmpid_str; // ymin + result += "_"; + tmpid_str = std::to_string(outBuff[i][5]); + result += tmpid_str; // xmax + result += "_"; + tmpid_str = std::to_string(outBuff[i][6]); + result += tmpid_str; // ymax + result += ";"; + } + + return result; +} +std::string SSDModelUtil::getDecodeResult(float *branchScores, float *branchBoxData) { + std::string result = ""; + NormalBox tmpBox[1917] = {0}; + float mScores[1917][81] = {0}; + float outBuff[1917][7] = {0}; + float scoreWithOneClass[1917] = {0}; + int outBoxNum = 0; + YXBoxes decodedBoxes[1917] = {0}; + + // Copy branch outputs box data to tmpBox. + for (int i = 0; i < 1917; ++i) { + tmpBox[i].y = branchBoxData[i * 4 + 0]; + tmpBox[i].x = branchBoxData[i * 4 + 1]; + tmpBox[i].h = branchBoxData[i * 4 + 2]; + tmpBox[i].w = branchBoxData[i * 4 + 3]; + } + + // Copy branch outputs score to mScores. + for (int i = 0; i < 1917; ++i) { + for (int j = 0; j < 81; ++j) { + mScores[i][j] = branchScores[i * 81 + j]; + } + } + + ssd_boxes_decode(tmpBox, decodedBoxes); + const float nms_threshold = 0.3; + for (int i = 1; i < 81; i++) { + std::vector in_indexes; + for (int j = 0; j < 1917; j++) { + scoreWithOneClass[j] = mScores[j][i]; + if (mScores[j][i] > g_thres_map[i]) { + in_indexes.push_back(j); + } + } + if (in_indexes.size() == 0) { + continue; + } + + sort(in_indexes.begin(), in_indexes.end(), + [&](int a, int b) { return scoreWithOneClass[a] > scoreWithOneClass[b]; }); + std::vector out_indexes; + + nonMaximumSuppression(decodedBoxes, scoreWithOneClass, in_indexes, out_indexes, + nms_threshold); + for (int k = 0; k < out_indexes.size(); k++) { + outBuff[outBoxNum][0] = out_indexes[k]; //image id + outBuff[outBoxNum][1] = i; //labelid + outBuff[outBoxNum][2] = scoreWithOneClass[out_indexes[k]]; //scores + outBuff[outBoxNum][3] = + decodedBoxes[out_indexes[k]].xmin * inputImageWidth / 300; + outBuff[outBoxNum][4] = + decodedBoxes[out_indexes[k]].ymin * inputImageHeight / 300; + outBuff[outBoxNum][5] = + decodedBoxes[out_indexes[k]].xmax * inputImageWidth / 300; + outBuff[outBoxNum][6] = + decodedBoxes[out_indexes[k]].ymax * inputImageHeight / 300; + outBoxNum++; + } + } + MS_PRINT("outBoxNum %d", outBoxNum); + + for (int i = 0; i < outBoxNum; ++i) { + std::string tmpid_str = std::to_string(outBuff[i][0]); + result += tmpid_str; // image ID + result += "_"; + // tmpid_str = std::to_string(outBuff[i][1]); + MS_PRINT("label_classes i %d, outBuff %d",i, (int) outBuff[i][1]); + tmpid_str = label_classes[(int) outBuff[i][1]]; + result += tmpid_str; // label id + result += "_"; + tmpid_str = std::to_string(outBuff[i][2]); + result += tmpid_str; // scores + result += "_"; + tmpid_str = std::to_string(outBuff[i][3]); + result += tmpid_str; // xmin + result += "_"; + tmpid_str = std::to_string(outBuff[i][4]); + result += tmpid_str; // ymin + result += "_"; + tmpid_str = std::to_string(outBuff[i][5]); + result += tmpid_str; // xmax + result += "_"; + tmpid_str = std::to_string(outBuff[i][6]); + result += tmpid_str; // ymax + result += ";"; + } + return result; +} +``` + diff --git a/model_zoo/official/lite/object_detection/README.md b/model_zoo/official/lite/object_detection/README.md new file mode 100644 index 00000000000..d632cb7295a --- /dev/null +++ b/model_zoo/official/lite/object_detection/README.md @@ -0,0 +1,490 @@ +## MindSpore Lite 端侧目标检测demo(Android) + +本示例程序演示了如何在端侧利用MindSpore Lite C++ API(Android JNI)以及MindSpore Lite 目标检测模型完成端侧推理,实现对图库或者设备摄像头捕获的内容进行检测,并在App图像预览界面中显示连续目标检测结果。 + + +### 运行依赖 + +- Android Studio >= 3.2 (推荐4.0以上版本) +- NDK 21.3 +- CMake 3.10 +- Android SDK >= 26 + +### 构建与运行 + +1. 在Android Studio中加载本示例源码,并安装相应的SDK(指定SDK版本后,由Android Studio自动安装)。 + + ![start_home](images/home.png) + + 启动Android Studio后,点击`File->Settings->System Settings->Android SDK`,勾选相应的SDK。如下图所示,勾选后,点击`OK`,Android Studio即可自动安装SDK。 + + ![start_sdk](images/sdk_management.png) + + (可选)若安装时出现NDK版本问题,可手动下载相应的[NDK版本](https://developer.android.com/ndk/downloads?hl=zh-cn)(本示例代码使用的NDK版本为21.3),并在`Project Structure`的`Android NDK location`设置中指定SDK的位置。 + + ![project_structure](images/project_structure.png) + +2. 连接Android设备,运行目标检测示例应用程序。 + + 通过USB连接Android设备调试,点击`Run 'app'`即可在你的设备上运行本示例项目。 + * 注:编译过程中Android Studio会自动下载MindSpore Lite、OpenCV、模型文件等相关依赖项,编译过程需做耐心等待。 + + ![run_app](images/run_app.PNG) + + Android Studio连接设备调试操作,可参考。 + +3. 在Android设备上,点击“继续安装”,安装完即可查看到设备摄像头捕获的内容和推理结果。 + + ![install](images/install.jpg) + + 如下图所示,检测出图中内容是鼠标。 + + ![result](images/object_detection.png) + + +## 示例程序详细说明 + +本端侧目标检测Android示例程序分为JAVA层和JNI层,其中,JAVA层主要通过Android Camera 2 API实现摄像头获取图像帧,以及相应的图像处理(针对推理结果画框)等功能;JNI层在[Runtime](https://www.mindspore.cn/tutorial/zh-CN/master/use/lite_runtime.html)中完成模型推理的过程。 + +> 此处详细说明示例程序的JNI层实现,JAVA层运用Android Camera 2 API实现开启设备摄像头以及图像帧处理等功能,需读者具备一定的Android开发基础知识。 + +### 示例程序结构 + +``` +app +| +├── libs # 存放demo jni层编译出的库文件 +│ └── arm64-v8a +│ │── libmlkit-label-MS.so # +| +├── src/main +│ ├── assets # 资源文件 +| | └── ssd.ms # 存放模型文件 +│ | +│ ├── cpp # 模型加载和预测主要逻辑封装类 +| | ├── mindspore-lite-...-cpu # minspore源码编译出的调用包,包含demo jni层依赖的库文件及相关的头文件 +| | | └── ... +│ | | +| | ├── MindSporeNetnative.cpp # MindSpore调用相关的JNI方法 +│ ├── java # java层应用代码 +│ │ └── com.huawei.himindsporedemo +│ │ ├── help # 图像处理及MindSpore JNI调用相关实现 +│ │ │ └── ... +│ │ └── obejctdetect # 开启摄像头及绘制相关实现 +│ │ └── ... +│ │ +│ ├── res # 存放Android相关的资源文件 +│ └── AndroidManifest.xml # Android配置文件 +│ +├── CMakeList.txt # cmake编译入口文件 +│ +├── build.gradle # 其他Android配置文件 +├── download.gradle # APP构建时由gradle自动从HuaWei Server下载依赖的库文件及模型文件 +└── ... +``` + +### 配置MindSpore Lite依赖项 + +Android JNI层调用MindSpore C++ API时,需要相关库文件支持。可通过MindSpore Lite[源码编译](https://www.mindspore.cn/lite/docs/zh-CN/master/deploy.html)生成`libmindspore-lite.so`库文件。 + +在Android Studio中将编译完成的`libmindspore-lite.so`库文件(可包含多个兼容架构),分别放置在APP工程的`app/libs/arm64-v8a`(ARM64)或`app/libs/armeabi-v7a`(ARM32)目录下,并在app的`build.gradle`文件中配置CMake编译支持,以及`arm64-v8a`和`armeabi-v7a`的编译支持,如下所示: +``` +android{ + defaultConfig{ + externalNativeBuild{ + cmake{ + arguments "-DANDROID_STL=c++_shared" + } + } + + ndk{ + abiFilters 'arm64-v8a' + } + } +} +``` + +在`app/CMakeLists.txt`文件中建立`.so`库文件链接,如下所示。 + +``` +# Set MindSpore Lite Dependencies. +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include/MindSpore) +add_library(mindspore-lite SHARED IMPORTED ) +set_target_properties(mindspore-lite PROPERTIES + IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/libs/libmindspore-lite.so") + +# Link target library. +target_link_libraries( + ... + mindspore-lite + minddata-lite + ... +) +``` + +本示例中,app build过程由download.gradle文件自动从华为服务器下载mindspore所编译的库及相关头文件,并放置在`src/main/cpp`工程目录下。 + + +* 注:若自动下载失败,请手动下载相关库文件并将其放在对应位置: +* libmindspore-lite.so [下载链接](https://download.mindspore.cn/model_zoo/official/lite/lib/mindspore%20version%200.7/libmindspore-lite.so) + + +### 下载及部署模型文件 + +从MindSpore Model Hub中下载模型文件,本示例程序中使用的目标检测模型文件为`ssd.ms`,同样通过download.gradle脚本在APP构建时自动下载,并放置在`app/src/main/assets`工程目录下。 + +* 注:若下载失败请手动下载模型文件,ssd.ms [下载链接](https://download.mindspore.cn/model_zoo/official/lite/ssd_mobilenetv2_lite/ssd.ms)。 + + +### 编写端侧推理代码 + +在JNI层调用MindSpore Lite C++ API实现端测推理。 + +推理代码流程如下,完整代码请参见`src/cpp/MindSporeNetnative.cpp`。 + +1. 加载MindSpore Lite模型文件,构建上下文、会话以及用于推理的计算图。 + + - 加载模型文件:创建并配置用于模型推理的上下文 + ```cpp + // Buffer is the model data passed in by the Java layer + jlong bufferLen = env->GetDirectBufferCapacity(buffer); + char *modelBuffer = CreateLocalModelBuffer(env, buffer); + ``` + + - 创建会话 + ```cpp + void **labelEnv = new void *; + MSNetWork *labelNet = new MSNetWork; + *labelEnv = labelNet; + + // Create context. + lite::Context *context = new lite::Context; + context->cpu_bind_mode_ = lite::NO_BIND; + context->device_ctx_.type = lite::DT_CPU; + context->thread_num_ = numThread; //Specify the number of threads to run inference + + // Create the mindspore session. + labelNet->CreateSessionMS(modelBuffer, bufferLen, "device label", context); + delete context; + + ``` + + - 加载模型文件并构建用于推理的计算图 + ```cpp + void MSNetWork::CreateSessionMS(char* modelBuffer, size_t bufferLen, std::string name, mindspore::lite::Context* ctx) + { + CreateSession(modelBuffer, bufferLen, ctx); + session = mindspore::session::LiteSession::CreateSession(ctx); + auto model = mindspore::lite::Model::Import(modelBuffer, bufferLen); + int ret = session->CompileGraph(model); // Compile Graph + } + ``` + +2. 将输入图片转换为传入MindSpore模型的Tensor格式。 + + 将待检测图片数据转换为输入MindSpore模型的Tensor。 + + ```cpp + // Convert the Bitmap image passed in from the JAVA layer to Mat for OpenCV processing + LiteMat lite_mat_bgr,lite_norm_mat_cut; + + if (!BitmapToLiteMat(env, srcBitmap, lite_mat_bgr)){ + MS_PRINT("BitmapToLiteMat error"); + return NULL; + } + int srcImageWidth = lite_mat_bgr.width_; + int srcImageHeight = lite_mat_bgr.height_; + if(!PreProcessImageData(lite_mat_bgr, lite_norm_mat_cut)){ + MS_PRINT("PreProcessImageData error"); + return NULL; + } + ImgDims inputDims; + inputDims.channel =lite_norm_mat_cut.channel_; + inputDims.width = lite_norm_mat_cut.width_; + inputDims.height = lite_norm_mat_cut.height_; + + // Get the mindsore inference environment which created in loadModel(). + void **labelEnv = reinterpret_cast(netEnv); + if (labelEnv == nullptr) { + MS_PRINT("MindSpore error, labelEnv is a nullptr."); + return NULL; + } + MSNetWork *labelNet = static_cast(*labelEnv); + + auto mSession = labelNet->session; + if (mSession == nullptr) { + MS_PRINT("MindSpore error, Session is a nullptr."); + return NULL; + } + MS_PRINT("MindSpore get session."); + + auto msInputs = mSession->GetInputs(); + auto inTensor = msInputs.front(); + + float *dataHWC = reinterpret_cast(lite_norm_mat_cut.data_ptr_); + // copy input Tensor + memcpy(inTensor->MutableData(), dataHWC, + inputDims.channel * inputDims.width * inputDims.height * sizeof(float)); + delete[] (dataHWC); + ``` + +3. 进行模型推理前,输入tensor格式为 NHWC,shape为1:300:300:3,格式为RGB, 并对输入tensor做标准化处理. + + ```cpp +bool PreProcessImageData(LiteMat &lite_mat_bgr,LiteMat &lite_norm_mat_cut) { + bool ret=false; + LiteMat lite_mat_resize; + ret = ResizeBilinear(lite_mat_bgr, lite_mat_resize, 300, 300); + if (!ret) { + MS_PRINT("ResizeBilinear error"); + return false; + } + LiteMat lite_mat_convert_float; + ret = ConvertTo(lite_mat_resize, lite_mat_convert_float, 1.0 / 255.0); + if (!ret) { + MS_PRINT("ConvertTo error"); + return false; + } + + float means[3] = {0.485, 0.456, 0.406}; + float vars[3] = {1.0 / 0.229, 1.0 / 0.224, 1.0 / 0.225}; + SubStractMeanNormalize(lite_mat_convert_float, lite_norm_mat_cut, means, vars); + return true; + } + ``` + +4. 对输入Tensor按照模型进行推理,获取输出Tensor,并进行后处理。 + + - 图执行,端测推理。 + + ```cpp + // After the model and image tensor data is loaded, run inference. + auto status = mSession->RunGraph(); + ``` + + - 获取输出数据。 + ```cpp + auto names = mSession->GetOutputTensorNames(); + typedef std::unordered_map> Msout; + std::unordered_map msOutputs; + for (const auto &name : names) { + auto temp_dat =mSession->GetOutputByTensorName(name); + msOutputs.insert(std::pair {name, temp_dat}); + } + std::string retStr = ProcessRunnetResult(msOutputs, ret); + ``` + + - 模型有2个输出,输出1是目标的类别置信度,维度为1:1917: 81; 输出2是目标的矩形框坐标偏移量,维度为1:1917:4。 为了得出目标的实际矩形框,需要根据偏移量计算出矩形框的位置。这部分在 getDefaultBoxes中实现。 + + ```cpp + void SSDModelUtil::getDefaultBoxes() { + float fk[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::vector all_sizes; + struct Product mProductData[19 * 19] = {0}; + + for (int i = 0; i < 6; i++) { + fk[i] = config.model_input_height / config.steps[i]; + } + float scale_rate = + (config.max_scale - config.min_scale) / (sizeof(config.num_default) / sizeof(int) - 1); + float scales[7] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; + for (int i = 0; i < sizeof(config.num_default) / sizeof(int); i++) { + scales[i] = config.min_scale + scale_rate * i; + } + + for (int idex = 0; idex < sizeof(config.feature_size) / sizeof(int); idex++) { + float sk1 = scales[idex]; + float sk2 = scales[idex + 1]; + float sk3 = sqrt(sk1 * sk2); + struct WHBox tempWHBox; + + all_sizes.clear(); + + if (idex == 0) { + float w = sk1 * sqrt(2); + float h = sk1 / sqrt(2); + + tempWHBox.boxw = 0.1; + tempWHBox.boxh = 0.1; + all_sizes.push_back(tempWHBox); + + tempWHBox.boxw = w; + tempWHBox.boxh = h; + all_sizes.push_back(tempWHBox); + + tempWHBox.boxw = h; + tempWHBox.boxh = w; + all_sizes.push_back(tempWHBox); + + } else { + tempWHBox.boxw = sk1; + tempWHBox.boxh = sk1; + all_sizes.push_back(tempWHBox); + + for (int j = 0; j < sizeof(config.aspect_ratios[idex]) / sizeof(int); j++) { + float w = sk1 * sqrt(config.aspect_ratios[idex][j]); + float h = sk1 / sqrt(config.aspect_ratios[idex][j]); + tempWHBox.boxw = w; + tempWHBox.boxh = h; + all_sizes.push_back(tempWHBox); + tempWHBox.boxw = h; + tempWHBox.boxh = w; + all_sizes.push_back(tempWHBox); + } + + tempWHBox.boxw = sk3; + tempWHBox.boxh = sk3; + all_sizes.push_back(tempWHBox); + } + + for (int i = 0; i < config.feature_size[idex]; i++) { + for (int j = 0; j < config.feature_size[idex]; j++) { + mProductData[i * config.feature_size[idex] + j].x = i; + mProductData[i * config.feature_size[idex] + j].y = j; + } + } + + int productLen = config.feature_size[idex] * config.feature_size[idex]; + + for (int i = 0; i < productLen; i++) { + for (int j = 0; j < all_sizes.size(); j++) { + struct NormalBox tempBox; + float cx = (mProductData[i].y + 0.5) / fk[idex]; + float cy = (mProductData[i].x + 0.5) / fk[idex]; + tempBox.y = cy; + tempBox.x = cx; + tempBox.h = all_sizes[j].boxh; + tempBox.w = all_sizes[j].boxw; + mDefaultBoxes.push_back(tempBox); + } + } + } + } + ``` + + - 通过最大值抑制将目标类型置信度较高的输出筛选出来。 + + ```cpp + void SSDModelUtil::nonMaximumSuppression(const YXBoxes *const decoded_boxes, + const float *const scores, + const std::vector &in_indexes, + std::vector &out_indexes, const float nmsThreshold, + const int count, const int max_results) { + int nR = 0; //number of results + std::vector del(count, false); + for (size_t i = 0; i < in_indexes.size(); i++) { + if (!del[in_indexes[i]]) { + out_indexes.push_back(in_indexes[i]); + if (++nR == max_results) { + break; + } + for (size_t j = i + 1; j < in_indexes.size(); j++) { + const auto boxi = decoded_boxes[in_indexes[i]], boxj = decoded_boxes[in_indexes[j]]; + float a[4] = {boxi.xmin, boxi.ymin, boxi.xmax, boxi.ymax}; + float b[4] = {boxj.xmin, boxj.ymin, boxj.xmax, boxj.ymax}; + if (IOU(a, b) > nmsThreshold) { + del[in_indexes[j]] = true; + } + } + } + } + } + ``` + + - 对每类的概率大于阈值,通过NMS算法筛选出矩形框后, 还需要将输出的矩形框恢复到原图尺寸。 + + ```cpp + std::string SSDModelUtil::getDecodeResult(float *branchScores, float *branchBoxData) { + std::string result = ""; + NormalBox tmpBox[1917] = {0}; + float mScores[1917][81] = {0}; + float outBuff[1917][7] = {0}; + float scoreWithOneClass[1917] = {0}; + int outBoxNum = 0; + YXBoxes decodedBoxes[1917] = {0}; + + // Copy branch outputs box data to tmpBox. + for (int i = 0; i < 1917; ++i) { + tmpBox[i].y = branchBoxData[i * 4 + 0]; + tmpBox[i].x = branchBoxData[i * 4 + 1]; + tmpBox[i].h = branchBoxData[i * 4 + 2]; + tmpBox[i].w = branchBoxData[i * 4 + 3]; + } + + // Copy branch outputs score to mScores. + for (int i = 0; i < 1917; ++i) { + for (int j = 0; j < 81; ++j) { + mScores[i][j] = branchScores[i * 81 + j]; + } + } + + ssd_boxes_decode(tmpBox, decodedBoxes); + const float nms_threshold = 0.3; + for (int i = 1; i < 81; i++) { + std::vector in_indexes; + for (int j = 0; j < 1917; j++) { + scoreWithOneClass[j] = mScores[j][i]; + // if (mScores[j][i] > 0.1) { + if (mScores[j][i] > g_thres_map[i]) { + in_indexes.push_back(j); + } + } + if (in_indexes.size() == 0) { + continue; + } + + sort(in_indexes.begin(), in_indexes.end(), + [&](int a, int b) { return scoreWithOneClass[a] > scoreWithOneClass[b]; }); + std::vector out_indexes; + + nonMaximumSuppression(decodedBoxes, scoreWithOneClass, in_indexes, out_indexes, + nms_threshold); + for (int k = 0; k < out_indexes.size(); k++) { + outBuff[outBoxNum][0] = out_indexes[k]; //image id + outBuff[outBoxNum][1] = i; //labelid + outBuff[outBoxNum][2] = scoreWithOneClass[out_indexes[k]]; //scores + outBuff[outBoxNum][3] = + decodedBoxes[out_indexes[k]].xmin * inputImageWidth / 300; + outBuff[outBoxNum][4] = + decodedBoxes[out_indexes[k]].ymin * inputImageHeight / 300; + outBuff[outBoxNum][5] = + decodedBoxes[out_indexes[k]].xmax * inputImageWidth / 300; + outBuff[outBoxNum][6] = + decodedBoxes[out_indexes[k]].ymax * inputImageHeight / 300; + outBoxNum++; + } + } + MS_PRINT("outBoxNum %d", outBoxNum); + + for (int i = 0; i < outBoxNum; ++i) { + std::string tmpid_str = std::to_string(outBuff[i][0]); + result += tmpid_str; // image ID + result += "_"; + // tmpid_str = std::to_string(outBuff[i][1]); + MS_PRINT("label_classes i %d, outBuff %d",i, (int) outBuff[i][1]); + tmpid_str = label_classes[(int) outBuff[i][1]]; + result += tmpid_str; // label id + result += "_"; + tmpid_str = std::to_string(outBuff[i][2]); + result += tmpid_str; // scores + result += "_"; + tmpid_str = std::to_string(outBuff[i][3]); + result += tmpid_str; // xmin + result += "_"; + tmpid_str = std::to_string(outBuff[i][4]); + result += tmpid_str; // ymin + result += "_"; + tmpid_str = std::to_string(outBuff[i][5]); + result += tmpid_str; // xmax + result += "_"; + tmpid_str = std::to_string(outBuff[i][6]); + result += tmpid_str; // ymax + result += ";"; + } + return result; + } + ``` + +​ \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/.gitignore b/model_zoo/official/lite/object_detection/app/.gitignore new file mode 100644 index 00000000000..8591057e7d1 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/.gitignore @@ -0,0 +1,3 @@ +/build +/libs +/src/main/cpp/include/ diff --git a/model_zoo/official/lite/object_detection/app/CMakeLists.txt b/model_zoo/official/lite/object_detection/app/CMakeLists.txt new file mode 100644 index 00000000000..c90ce2199a0 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/CMakeLists.txt @@ -0,0 +1,82 @@ +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. + +cmake_minimum_required(VERSION 3.4.1) + +set(CMAKE_VERBOSE_MAKEFILE on) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}) + +set(MINDSPORELITE_VERSION mindspore-lite-0.7.0-minddata-arm64-cpu) + +# ============== Set MindSpore Dependencies. ============= +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/third_party/flatbuffers/include) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include/ir/dtype) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include/schema) + +#include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include/ModelUtil) + +add_library(mindspore-lite SHARED IMPORTED ) +add_library(minddata-lite SHARED IMPORTED ) + +set_target_properties(mindspore-lite PROPERTIES IMPORTED_LOCATION + ${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/lib/libmindspore-lite.so) +set_target_properties(minddata-lite PROPERTIES IMPORTED_LOCATION + ${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/lib/libminddata-lite.so) +# --------------- MindSpore Lite set End. -------------------- + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. + +file(GLOB_RECURSE cpp_src "src/main/cpp/*.cpp" "src/main/cpp/*.h") + +add_library( # Sets the name of the library. + mlkit-label-MS + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + ${cpp_src}) + + +# Searches for a specified prebuilt library and stores the path as a +# variable. Because CMake includes system libraries in the search path by +# default, you only need to specify the name of the public NDK library +# you want to add. CMake verifies that the library exists before +# completing its build. + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log ) + + +find_library( jnigraphics-lib jnig·raphics ) + +# Specifies libraries CMake should link to your target library. You +# can link multiple libraries, such as libraries you define in this +# build script, prebuilt third-party libraries, or system libraries. +add_definitions(-DMNN_USE_LOGCAT) +target_link_libraries( # Specifies the target library. + mlkit-label-MS + + # --- mindspore --- + minddata-lite + mindspore-lite + + # --- other dependencies.--- + -ljnigraphics + android + + # Links the target library to the log library + ${log-lib} + ) \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/build.gradle b/model_zoo/official/lite/object_detection/app/build.gradle new file mode 100644 index 00000000000..a7a88d896a3 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/build.gradle @@ -0,0 +1,61 @@ +apply plugin: 'com.android.application' + +// Before gradle build. +// To download some necessary libraries. +apply from:'download.gradle' + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.1" + + defaultConfig { + applicationId "com.mindspore.hiobject" + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + arguments "-DANDROID_STL=c++_shared" + cppFlags "" + } + } + ndk { + //abiFilters 'arm64-v8a', 'armeabi-v7a' + abiFilters 'arm64-v8a' + } + } + aaptOptions { +// noCompress '.so', ".tflite", ".mnn", ".cambricon", '.mslite', 'om', 'ms' + noCompress '.so', 'ms' + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + + customDebugType { + debuggable true + } + } + externalNativeBuild { + cmake { + path file('CMakeLists.txt') + } + } + ndkVersion '21.3.6528147' +} + + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} diff --git a/model_zoo/official/lite/object_detection/app/download.gradle b/model_zoo/official/lite/object_detection/app/download.gradle new file mode 100644 index 00000000000..4ce258ce39c --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/download.gradle @@ -0,0 +1,82 @@ +/** + * To download necessary library from HuaWei server. + * Including mindspore-lite .so file, minddata-lite .so file and model file. + * The libraries can be downloaded manually. + */ +def targetMindSporeInclude = "src/main/cpp/" +def mindsporeLite_Version = "mindspore-lite-0.7.0-minddata-arm64-cpu" + +def targetModelFile = "src/main/assets/model/ssd.ms" +def mindSporeLibrary_arm64 = "src/main/cpp/${mindsporeLite_Version}.tar.gz" + +def modelDownloadUrl = "https://download.mindspore.cn/model_zoo/official/lite/ssd_mobilenetv2_lite/ssd.ms" +def mindsporeLiteDownloadUrl = "https://download.mindspore.cn/model_zoo/official/lite/lib/mindspore%20version%201.0/${mindsporeLite_Version}.tar.gz" + +def cleantargetMindSporeInclude = "src/main/cpp" + +task cleanCmakeCache(type: Delete) { + delete '.cxx/cmake/debug' + delete '.cxx/cmake/release' +} + +task downloadModelFile(type: DownloadUrlTask) { + doFirst { + println "Downloading ${modelDownloadUrl}" + } + sourceUrl = "${modelDownloadUrl}" + target = file("${targetModelFile}") +} + +task downloadMindSporeLibrary(type: DownloadUrlTask) { + doFirst { + println "Downloading ${mindsporeLiteDownloadUrl}" + } + sourceUrl = "${mindsporeLiteDownloadUrl}" + target = file("${mindSporeLibrary_arm64}") +} + +task unzipMindSporeInclude(type: Copy, dependsOn: 'downloadMindSporeLibrary') { + doFirst { + println "Unzipping ${mindSporeLibrary_arm64}" + } + from tarTree(resources.gzip("${mindSporeLibrary_arm64}")) + into "${targetMindSporeInclude}" +} + +task cleanUnusedmindsporeFiles(type: Delete, dependsOn: ['unzipMindSporeInclude']) { + delete fileTree("${cleantargetMindSporeInclude}").matching { + include "*.tar.gz" + } +} +/* + * Using preBuild to download mindspore library and model file. + * Run before gradle build. + */ +if (file("src/main/cpp/${mindsporeLite_Version}/lib/libmindspore-lite.so").exists()){ + downloadMindSporeLibrary.enabled = false + unzipMindSporeInclude.enabled = false + cleanUnusedmindsporeFiles.enabled = false +} + +if (file("src/main/assets/model/ssd.ms").exists()){ + downloadModelFile.enabled = false +} + +preBuild.dependsOn cleanCmakeCache +preBuild.dependsOn downloadModelFile +preBuild.dependsOn downloadMindSporeLibrary +preBuild.dependsOn unzipMindSporeInclude +preBuild.dependsOn cleanUnusedmindsporeFiles + +class DownloadUrlTask extends DefaultTask { + @Input + String sourceUrl + + @OutputFile + File target + + @TaskAction + void download() { + ant.get(src: sourceUrl, dest: target) + } +} diff --git a/model_zoo/official/lite/object_detection/app/proguard-rules.pro b/model_zoo/official/lite/object_detection/app/proguard-rules.pro new file mode 100644 index 00000000000..481bb434814 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/src/androidTest/java/com/mindspore/hiobject/ExampleInstrumentedTest.java b/model_zoo/official/lite/object_detection/app/src/androidTest/java/com/mindspore/hiobject/ExampleInstrumentedTest.java new file mode 100644 index 00000000000..f952634596e --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/androidTest/java/com/mindspore/hiobject/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.mindspore.hiobject; + +import android.content.Context; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.assertEquals; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.huawei.himindsporedemo", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/src/main/AndroidManifest.xml b/model_zoo/official/lite/object_detection/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..80618396457 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/AndroidManifest.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/src/main/cpp/MSNetWork.cpp b/model_zoo/official/lite/object_detection/app/src/main/cpp/MSNetWork.cpp new file mode 100644 index 00000000000..ea1736e6f48 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/cpp/MSNetWork.cpp @@ -0,0 +1,55 @@ +/** + * Copyright 2020 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MSNetWork.h" +#include +#include +#include +#include "include/errorcode.h" + +#define MS_PRINT(format, ...) __android_log_print(ANDROID_LOG_INFO, "MSJNI", format, ##__VA_ARGS__) + +MSNetWork::MSNetWork(void) : session_(nullptr) {} + +MSNetWork::~MSNetWork(void) {} + +void +MSNetWork::CreateSessionMS(char *modelBuffer, size_t bufferLen, mindspore::lite::Context *ctx) { + session_ = mindspore::session::LiteSession::CreateSession(ctx); + if (session_ == nullptr) { + MS_PRINT("Create Session failed."); + return; + } + + // Compile model. + auto model = mindspore::lite::Model::Import(modelBuffer, bufferLen); + if (model == nullptr) { + MS_PRINT("Import model failed."); + return; + } + + int ret = session_->CompileGraph(model); + if (ret != mindspore::lite::RET_OK) { + MS_PRINT("CompileGraph failed."); + return; + } +} + +int MSNetWork::ReleaseNets(void) { + delete session_; + return 0; +} + diff --git a/model_zoo/official/lite/object_detection/app/src/main/cpp/MSNetWork.h b/model_zoo/official/lite/object_detection/app/src/main/cpp/MSNetWork.h new file mode 100644 index 00000000000..9ba12e53fc1 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/cpp/MSNetWork.h @@ -0,0 +1,59 @@ +/** + * Copyright 2020 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MSNETWORK_H +#define MSNETWORK_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct ImgDims { + int channel = 0; + int width = 0; + int height = 0; +}; + +/*struct SessIterm { + std::shared_ptr sess = nullptr; +};*/ + +class MSNetWork { + public: + MSNetWork(); + + ~MSNetWork(); + + void CreateSessionMS(char *modelBuffer, size_t bufferLen, mindspore::lite::Context *ctx); + + int ReleaseNets(void); + + mindspore::session::LiteSession * session() const { return session_; } + private: + mindspore::session::LiteSession *session_; +}; +#endif diff --git a/model_zoo/official/lite/object_detection/app/src/main/cpp/MindSporeNetnative.cpp b/model_zoo/official/lite/object_detection/app/src/main/cpp/MindSporeNetnative.cpp new file mode 100644 index 00000000000..f47e65b1bcb --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/cpp/MindSporeNetnative.cpp @@ -0,0 +1,269 @@ +/** + * Copyright 2020 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "include/errorcode.h" +#include "include/ms_tensor.h" +#include "MSNetWork.h" +#include "ssd_util/ssd_util.h" +#include "lite_cv/lite_mat.h" +#include "lite_cv/image_process.h" + +using mindspore::dataset::LiteMat; +using mindspore::dataset::LPixelType; +using mindspore::dataset::LDataType; +#define MS_PRINT(format, ...) __android_log_print(ANDROID_LOG_INFO, "MSJNI", format, ##__VA_ARGS__) + +bool BitmapToLiteMat(JNIEnv *env, const jobject &srcBitmap, LiteMat *lite_mat) { + bool ret = false; + AndroidBitmapInfo info; + void *pixels = nullptr; + LiteMat &lite_mat_bgr = *lite_mat; + AndroidBitmap_getInfo(env, srcBitmap, &info); + if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { + MS_PRINT("Image Err, Request RGBA"); + return false; + } + AndroidBitmap_lockPixels(env, srcBitmap, &pixels); + if (info.stride == info.width*4) { + ret = InitFromPixel(reinterpret_cast(pixels), + LPixelType::RGBA2RGB, LDataType::UINT8, + info.width, info.height, lite_mat_bgr); + if (!ret) { + MS_PRINT("Init From RGBA error"); + } + } else { + unsigned char *pixels_ptr = new unsigned char[info.width*info.height*4]; + unsigned char *ptr = pixels_ptr; + unsigned char *data = reinterpret_cast(pixels); + for (int i = 0; i < info.height; i++) { + memcpy(ptr, data, info.width*4); + ptr += info.width*4; + data += info.stride; + } + ret = InitFromPixel(reinterpret_cast(pixels_ptr), + LPixelType::RGBA2RGB, LDataType::UINT8, + info.width, info.height, lite_mat_bgr); + if (!ret) { + MS_PRINT("Init From RGBA error"); + } + delete[] (pixels_ptr); + } + AndroidBitmap_unlockPixels(env, srcBitmap); + return ret; +} + +bool PreProcessImageData(const LiteMat &lite_mat_bgr, LiteMat *lite_norm_mat_ptr) { + bool ret = false; + LiteMat lite_mat_resize; + LiteMat &lite_norm_mat_cut = *lite_norm_mat_ptr; + ret = ResizeBilinear(lite_mat_bgr, lite_mat_resize, 300, 300); + if (!ret) { + MS_PRINT("ResizeBilinear error"); + return false; + } + LiteMat lite_mat_convert_float; + ret = ConvertTo(lite_mat_resize, lite_mat_convert_float, 1.0 / 255.0); + if (!ret) { + MS_PRINT("ConvertTo error"); + return false; + } + + float means[3] = {0.485, 0.456, 0.406}; + float vars[3] = {1.0 / 0.229, 1.0 / 0.224, 1.0 / 0.225}; + SubStractMeanNormalize(lite_mat_convert_float, lite_norm_mat_cut, means, vars); + return true; +} + +char *CreateLocalModelBuffer(JNIEnv *env, jobject modelBuffer) { + jbyte *modelAddr = static_cast(env->GetDirectBufferAddress(modelBuffer)); + int modelLen = static_cast(env->GetDirectBufferCapacity(modelBuffer)); + char *buffer(new char[modelLen]); + memcpy(buffer, modelAddr, modelLen); + return buffer; +} + +/** + * + * @param msOutputs Model output, the mindspore inferencing result. + * @param srcImageWidth The width of the original input image. + * @param srcImageHeight The height of the original input image. + * @return + */ +std::string ProcessRunnetResult(std::unordered_map msOutputs, + int srcImageWidth, int srcImageHeight) { + std::unordered_map::iterator iter; + iter = msOutputs.begin(); + auto branch2_string = iter->first; + auto branch2_tensor = iter->second; + + ++iter; + auto branch1_string = iter->first; + auto branch1_tensor = iter->second; + MS_PRINT("%s %s", branch1_string.c_str(), branch2_string.c_str()); + + // ----------- 接口测试 -------------------------- + float *tmpscores2 = reinterpret_cast(branch1_tensor->MutableData()); + float *tmpdata = reinterpret_cast(branch2_tensor->MutableData()); + + // Using ssd model util to process model branch outputs. + SSDModelUtil ssdUtil(srcImageWidth, srcImageHeight); + + std::string retStr = ssdUtil.getDecodeResult(tmpscores2, tmpdata); + MS_PRINT("retStr %s", retStr.c_str()); + + return retStr; +} + +extern "C" JNIEXPORT jlong JNICALL +Java_com_mindspore_hiobject_help_TrackingMobile_loadModel(JNIEnv *env, jobject thiz, + jobject assetManager, + jobject buffer, + jint numThread) { + MS_PRINT("MindSpore so version 20200730"); + if (nullptr == buffer) { + MS_PRINT("error, buffer is nullptr!"); + return (jlong) nullptr; + } + jlong bufferLen = env->GetDirectBufferCapacity(buffer); + MS_PRINT("MindSpore get bufferLen:%d", static_cast(bufferLen)); + if (0 == bufferLen) { + MS_PRINT("error, bufferLen is 0!"); + return (jlong) nullptr; + } + + char *modelBuffer = CreateLocalModelBuffer(env, buffer); + if (modelBuffer == nullptr) { + MS_PRINT("modelBuffer create failed!"); + return (jlong) nullptr; + } + + MS_PRINT("MindSpore loading Model."); + void **labelEnv = new void *; + MSNetWork *labelNet = new MSNetWork; + *labelEnv = labelNet; + + mindspore::lite::Context *context = new mindspore::lite::Context; + context->device_type_ = mindspore::lite::DT_CPU; + context->thread_num_ = numThread; + + labelNet->CreateSessionMS(modelBuffer, bufferLen, context); + delete context; + if (labelNet->session() == nullptr) { + delete labelNet; + delete labelEnv; + MS_PRINT("MindSpore create session failed!."); + return (jlong) nullptr; + } + MS_PRINT("MindSpore create session successfully."); + + if (buffer != nullptr) { + env->DeleteLocalRef(buffer); + } + + if (assetManager != nullptr) { + env->DeleteLocalRef(assetManager); + } + MS_PRINT("ptr released successfully."); + + return (jlong) labelEnv; +} + + +extern "C" JNIEXPORT jstring JNICALL +Java_com_mindspore_hiobject_help_TrackingMobile_runNet(JNIEnv *env, jobject thiz, + jlong netEnv, + jobject srcBitmap) { + LiteMat lite_mat_bgr, lite_norm_mat_cut; + + if (!BitmapToLiteMat(env, srcBitmap, &lite_mat_bgr)) { + MS_PRINT("BitmapToLiteMat error"); + return NULL; + } + int srcImageWidth = lite_mat_bgr.width_; + int srcImageHeight = lite_mat_bgr.height_; + if (!PreProcessImageData(lite_mat_bgr, &lite_norm_mat_cut)) { + MS_PRINT("PreProcessImageData error"); + return NULL; + } + + ImgDims inputDims; + inputDims.channel = lite_norm_mat_cut.channel_; + inputDims.width = lite_norm_mat_cut.width_; + inputDims.height = lite_norm_mat_cut.height_; + + // Get the mindsore inference environment which created in loadModel(). + void **labelEnv = reinterpret_cast(netEnv); + if (labelEnv == nullptr) { + MS_PRINT("MindSpore error, labelEnv is a nullptr."); + return NULL; + } + MSNetWork *labelNet = static_cast(*labelEnv); + + auto mSession = labelNet->session(); + if (mSession == nullptr) { + MS_PRINT("MindSpore error, Session is a nullptr."); + return NULL; + } + MS_PRINT("MindSpore get session."); + + auto msInputs = mSession->GetInputs(); + auto inTensor = msInputs.front(); + float *dataHWC = reinterpret_cast(lite_norm_mat_cut.data_ptr_); + // copy input Tensor + memcpy(inTensor->MutableData(), dataHWC, + inputDims.channel * inputDims.width * inputDims.height * sizeof(float)); + MS_PRINT("MindSpore get msInputs."); + + auto status = mSession->RunGraph(); + if (status != mindspore::lite::RET_OK) { + MS_PRINT("MindSpore runnet error."); + return NULL; + } + + auto names = mSession->GetOutputTensorNames(); + std::unordered_map msOutputs; + for (const auto &name : names) { + auto temp_dat = mSession->GetOutputByTensorName(name); + msOutputs.insert(std::pair {name, temp_dat}); + } + std::string retStr = ProcessRunnetResult(msOutputs, srcImageWidth, srcImageHeight); + const char *resultChardata = retStr.c_str(); + + return (env)->NewStringUTF(resultChardata); +} + + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_mindspore_hiobject_help_TrackingMobile_unloadModel(JNIEnv *env, + jobject thiz, + jlong netEnv) { + void **labelEnv = reinterpret_cast(netEnv); + MSNetWork *labelNet = static_cast(*labelEnv); + labelNet->ReleaseNets(); + return (jboolean) true; +} + diff --git a/model_zoo/official/lite/object_detection/app/src/main/cpp/ssd_util/ssd_util.cpp b/model_zoo/official/lite/object_detection/app/src/main/cpp/ssd_util/ssd_util.cpp new file mode 100644 index 00000000000..1a7fdb237dc --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/cpp/ssd_util/ssd_util.cpp @@ -0,0 +1,293 @@ +/** + * Copyright 2020 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "ssd_util/ssd_util.h" + +#define MS_PRINT(format, ...) __android_log_print(ANDROID_LOG_INFO, "MSJNI", format, ##__VA_ARGS__) + + +/** + * SSD model util constructor. + * @param srcImgWidth The width of the original input image. + * @param srcImgHeight The height of the original input image. + */ +SSDModelUtil::SSDModelUtil(int srcImgWidth, int srcImgHeight) { + inputImageWidth = srcImgWidth; + inputImageHeight = srcImgHeight; + + getDefaultBoxes(); // To fill the vectordefaultboxes. +} + + +std::string SSDModelUtil::getDecodeResult(float *branchScores, float *branchBoxData) { + std::string result = ""; + NormalBox tmpBox[1917] = {0}; + float mScores[1917][81] = {0}; + + float outBuff[1917][7] = {0}; + + float scoreWithOneClass[1917] = {0}; + int outBoxNum = 0; + YXBoxes decodedBoxes[1917] = {0}; + + // Copy branch outputs box data to tmpBox. + for (int i = 0; i < 1917; ++i) { + tmpBox[i].y = branchBoxData[i * 4 + 0]; + tmpBox[i].x = branchBoxData[i * 4 + 1]; + tmpBox[i].h = branchBoxData[i * 4 + 2]; + tmpBox[i].w = branchBoxData[i * 4 + 3]; + } + + // Copy branch outputs score to mScores. + for (int i = 0; i < 1917; ++i) { + for (int j = 0; j < 81; ++j) { + mScores[i][j] = branchScores[i * 81 + j]; + } + } + + // NMS processing. + ssd_boxes_decode(tmpBox, decodedBoxes); + // const float nms_threshold = 0.6; + const float nms_threshold = 0.3; + for (int i = 1; i < 81; i++) { + std::vector in_indexes; + for (int j = 0; j < 1917; j++) { + scoreWithOneClass[j] = mScores[j][i]; + if (mScores[j][i] > g_thres_map[i]) { + in_indexes.push_back(j); + } + } + if (in_indexes.size() == 0) { + continue; + } + + sort(in_indexes.begin(), in_indexes.end(), + [&](int a, int b) { return scoreWithOneClass[a] > scoreWithOneClass[b]; }); + std::vector out_indexes; + + nonMaximumSuppression(decodedBoxes, scoreWithOneClass, in_indexes, &out_indexes, + nms_threshold); + for (int k = 0; k < out_indexes.size(); k++) { + // image id + outBuff[outBoxNum][0] = out_indexes[k]; + // labelid + outBuff[outBoxNum][1] = i; + // scores + outBuff[outBoxNum][2] = scoreWithOneClass[out_indexes[k]]; + outBuff[outBoxNum][3] = + decodedBoxes[out_indexes[k]].xmin * inputImageWidth / 300; + outBuff[outBoxNum][4] = + decodedBoxes[out_indexes[k]].ymin * inputImageHeight / 300; + outBuff[outBoxNum][5] = + decodedBoxes[out_indexes[k]].xmax * inputImageWidth / 300; + outBuff[outBoxNum][6] = + decodedBoxes[out_indexes[k]].ymax * inputImageHeight / 300; + outBoxNum++; + } + } + MS_PRINT("outBoxNum %d", outBoxNum); + + for (int i = 0; i < outBoxNum; ++i) { + std::string tmpid_str = std::to_string(outBuff[i][0]); + result += tmpid_str; + result += "_"; + // tmpid_str = std::to_string(outBuff[i][1]); + MS_PRINT("label_classes i %d, outBuff %d", i, (int) outBuff[i][1]); + tmpid_str = label_classes[static_cast(outBuff[i][1])]; + // label id + result += tmpid_str; + result += "_"; + tmpid_str = std::to_string(outBuff[i][2]); + // scores + result += tmpid_str; + result += "_"; + tmpid_str = std::to_string(outBuff[i][3]); + // xmin + result += tmpid_str; + result += "_"; + tmpid_str = std::to_string(outBuff[i][4]); + // ymin + result += tmpid_str; + result += "_"; + tmpid_str = std::to_string(outBuff[i][5]); + // xmax + result += tmpid_str; + result += "_"; + tmpid_str = std::to_string(outBuff[i][6]); + // ymax + result += tmpid_str; + result += ";"; + } + + return result; +} + +void SSDModelUtil::getDefaultBoxes() { + float fk[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::vector all_sizes; + struct Product mProductData[19 * 19] = {0}; + + for (int i = 0; i < 6; i++) { + fk[i] = config.model_input_height / config.steps[i]; + } + float scale_rate = + (config.max_scale - config.min_scale) / (sizeof(config.num_default) / sizeof(int) - 1); + float scales[7] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; + for (int i = 0; i < sizeof(config.num_default) / sizeof(int); i++) { + scales[i] = config.min_scale + scale_rate * i; + } + + for (int idex = 0; idex < sizeof(config.feature_size) / sizeof(int); idex++) { + float sk1 = scales[idex]; + float sk2 = scales[idex + 1]; + float sk3 = sqrt(sk1 * sk2); + struct WHBox tempWHBox; + + all_sizes.clear(); + + // idex == 0时, len(all_sizes) = 3. + if (idex == 0) { + float w = sk1 * sqrt(2); + float h = sk1 / sqrt(2); + + // all_sizes = [(0.1, 0.1), (w, h), (h, w)] + tempWHBox.boxw = 0.1; + tempWHBox.boxh = 0.1; + all_sizes.push_back(tempWHBox); + + tempWHBox.boxw = w; + tempWHBox.boxh = h; + all_sizes.push_back(tempWHBox); + + tempWHBox.boxw = h; + tempWHBox.boxh = w; + all_sizes.push_back(tempWHBox); + + } else { + // len(all_sizes) = 6. + tempWHBox.boxw = sk1; + tempWHBox.boxh = sk1; + all_sizes.push_back(tempWHBox); + + for (int j = 0; j < sizeof(config.aspect_ratios[idex]) / sizeof(int); j++) { + float w = sk1 * sqrt(config.aspect_ratios[idex][j]); + float h = sk1 / sqrt(config.aspect_ratios[idex][j]); + + tempWHBox.boxw = w; + tempWHBox.boxh = h; + all_sizes.push_back(tempWHBox); + + tempWHBox.boxw = h; + tempWHBox.boxh = w; + all_sizes.push_back(tempWHBox); + } + + tempWHBox.boxw = sk3; + tempWHBox.boxh = sk3; + all_sizes.push_back(tempWHBox); + } + + for (int i = 0; i < config.feature_size[idex]; i++) { + for (int j = 0; j < config.feature_size[idex]; j++) { + mProductData[i * config.feature_size[idex] + j].x = i; + mProductData[i * config.feature_size[idex] + j].y = j; + } + } + + int productLen = config.feature_size[idex] * config.feature_size[idex]; + + for (int i = 0; i < productLen; i++) { + for (int j = 0; j < all_sizes.size(); j++) { + struct NormalBox tempBox; + + float cx = (mProductData[i].y + 0.5) / fk[idex]; + float cy = (mProductData[i].x + 0.5) / fk[idex]; + + tempBox.y = cy; + tempBox.x = cx; + tempBox.h = all_sizes[j].boxh; + tempBox.w = all_sizes[j].boxw; + + mDefaultBoxes.push_back(tempBox); + } + } + } +} + + +void SSDModelUtil::ssd_boxes_decode(const NormalBox *boxes, + YXBoxes *const decoded_boxes, const float scale0, + const float scale1, const int count) { + if (mDefaultBoxes.size() == 0) { + MS_PRINT("get default boxes error."); + return; + } + + for (int i = 0; i < count; ++i) { + float cy = boxes[i].y * scale0 * mDefaultBoxes[i].h + mDefaultBoxes[i].y; + float cx = boxes[i].x * scale0 * mDefaultBoxes[i].w + mDefaultBoxes[i].x; + float h = exp(boxes[i].h * scale1) * mDefaultBoxes[i].h; + float w = exp(boxes[i].w * scale1) * mDefaultBoxes[i].w; + decoded_boxes[i].ymin = std::min(1.0f, std::max(0.0f, cy - h / 2)) * config.model_input_height; + decoded_boxes[i].xmin = std::min(1.0f, std::max(0.0f, cx - w / 2)) * config.model_input_width; + decoded_boxes[i].ymax = std::min(1.0f, std::max(0.0f, cy + h / 2)) * config.model_input_height; + decoded_boxes[i].xmax = std::min(1.0f, std::max(0.0f, cx + w / 2)) * config.model_input_width; + } +} + +void SSDModelUtil::nonMaximumSuppression(const YXBoxes *const decoded_boxes, + const float *const scores, + const std::vector &in_indexes, + std::vector *out_indexes_p, const float nmsThreshold, + const int count, const int max_results) { + int nR = 0; + std::vector &out_indexes = *out_indexes_p; + std::vector del(count, false); + for (size_t i = 0; i < in_indexes.size(); i++) { + if (!del[in_indexes[i]]) { + out_indexes.push_back(in_indexes[i]); + if (++nR == max_results) { + break; + } + for (size_t j = i + 1; j < in_indexes.size(); j++) { + const auto boxi = decoded_boxes[in_indexes[i]], boxj = decoded_boxes[in_indexes[j]]; + float a[4] = {boxi.xmin, boxi.ymin, boxi.xmax, boxi.ymax}; + float b[4] = {boxj.xmin, boxj.ymin, boxj.xmax, boxj.ymax}; + if (IOU(a, b) > nmsThreshold) { + del[in_indexes[j]] = true; + } + } + } + } +} + +double SSDModelUtil::IOU(float r1[4], float r2[4]) { + float x1 = std::max(r1[0], r2[0]); + float y1 = std::max(r1[1], r2[1]); + float x2 = std::min(r1[2], r2[2]); + float y2 = std::min(r1[3], r2[3]); + // if max(min) > min(max), there is no intersection + if (x2 - x1 + 1 <= 0 || y2 - y1 + 1 <= 0) + return 0; + double insect_area = (x2 - x1 + 1) * (y2 - y1 + 1); + double union_area = + (r1[2] - r1[0] + 1) * (r1[3] - r1[1] + 1) + (r2[2] - r2[0] + 1) * (r2[3] - r2[1] + 1) - + insect_area; + double iou = insect_area / union_area; + return (iou > 0) ? iou : 0; +} diff --git a/model_zoo/official/lite/object_detection/app/src/main/cpp/ssd_util/ssd_util.h b/model_zoo/official/lite/object_detection/app/src/main/cpp/ssd_util/ssd_util.h new file mode 100644 index 00000000000..8016aef8937 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/cpp/ssd_util/ssd_util.h @@ -0,0 +1,202 @@ +/** + * Copyright 2020 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef HIMINDSPOREDEMO_SSD_UTIL_H +#define HIMINDSPOREDEMO_SSD_UTIL_H + +#include +#include + + +class SSDModelUtil { + public: + // Constructor. + SSDModelUtil(int srcImageWidth, int srcImgHeight); + + /** + * Return the SSD model post-processing result. + * @param branchScores + * @param branchBoxData + * @return + */ + std::string getDecodeResult(float *branchScores, float *branchBoxData); + + // ============= variables =============. + int inputImageHeight; + int inputImageWidth; + + struct NormalBox { + float y; + float x; + float h; + float w; + }; + + struct YXBoxes { + float ymin; + float xmin; + float ymax; + float xmax; + }; + + struct Product { + int x; + int y; + }; + + struct WHBox { + float boxw; + float boxh; + }; + + private: + std::vector mDefaultBoxes; + + + void getDefaultBoxes(); + + void ssd_boxes_decode(const NormalBox *boxes, + YXBoxes *const decoded_boxes, + const float scale0 = 0.1, const float scale1 = 0.2, + const int count = 1917); + + void nonMaximumSuppression(const YXBoxes *const decoded_boxes, const float *const scores, + const std::vector &in_indexes, std::vector *out_indexes_p, + const float nmsThreshold = 0.6, + const int count = 1917, const int max_results = 100); + + double IOU(float r1[4], float r2[4]); + + + // ============= variables =============. + struct network { + int model_input_height = 300; + int model_input_width = 300; + + int num_default[6] = {3, 6, 6, 6, 6, 6}; + int feature_size[6] = {19, 10, 5, 3, 2, 1}; + double min_scale = 0.2; + float max_scale = 0.95; + float steps[6] = {16, 32, 64, 100, 150, 300}; + float prior_scaling[2] = {0.1, 0.2}; + float gamma = 2.0; + float alpha = 0.75; + int aspect_ratios[6][2] = {{2, 0}, + {2, 3}, + {2, 3}, + {2, 3}, + {2, 3}, + {2, 3}}; + } config; + + float g_thres_map[81] = {0, 0.635, 0.627, 0.589, 0.585, 0.648, 0.664, 0.655, + 0.481, 0.529, 0.611, 0.641, 0.774, 0.549, 0.513, 0.652, + 0.552, 0.590, 0.650, 0.575, 0.583, 0.650, 0.656, 0.696, + 0.653, 0.438, 0.515, 0.459, 0.561, 0.545, 0.635, 0.540, + 0.560, 0.721, 0.544, 0.548, 0.511, 0.611, 0.592, 0.542, + 0.512, 0.635, 0.531, 0.437, 0.525, 0.445, 0.484, 0.546, + 0.490, 0.581, 0.566, 0.516, 0.445, 0.541, 0.613, 0.560, + 0.483, 0.509, 0.464, 0.543, 0.538, 0.490, 0.576, 0.617, + 0.577, 0.595, 0.640, 0.585, 0.598, 0.592, 0.514, 0.397, + 0.592, 0.504, 0.548, 0.642, 0.581, 0.497, 0.545, 0.154, + 0.580, + }; + + std::string label_classes[81] = { + {"background"}, + {"human"}, + {"bike"}, + {"automobile"}, + {"motorbike"}, + {"aircraft"}, + {"motorbus"}, + {"train"}, + {"motortruck"}, + {"boat"}, + {"traffic signal"}, + {"fireplug"}, + {"stop sign"}, + {"parking meter"}, + {"seat"}, + {"bird"}, + {"cat"}, + {"dog"}, + {"horse"}, + {"sheep"}, + {"cow"}, + {"elephant"}, + {"bear"}, + {"zebra"}, + {"giraffe"}, + {"knapsack"}, + {"bumbershoot"}, + {"purse"}, + {"neckwear"}, + {"traveling bag"}, + {"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"}, + {"houseplant"}, + {"bed"}, + {"dinner table"}, + {"toilet"}, + {"television"}, + {"notebook computer"}, + {"mouse"}, + {"remote"}, + {"keyboard"}, + {"smartphone"}, + {"microwave"}, + {"oven"}, + {"toaster"}, + {"water sink"}, + {"fridge"}, + {"book"}, + {"bell"}, + {"vase"}, + {"shears"}, + {"toy bear"}, + {"hair drier"}, + {"toothbrush"} + }; +}; +#endif diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/SplashActivity.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/SplashActivity.java new file mode 100644 index 00000000000..e5422373982 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/SplashActivity.java @@ -0,0 +1,95 @@ +package com.mindspore.hiobject; + +import android.Manifest; +import android.content.Intent; +import android.os.Bundle; +import android.provider.MediaStore; +import android.view.View; +import android.widget.Button; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; + +import com.mindspore.hiobject.objectdetect.CameraActivity; +import com.mindspore.hiobject.objectdetect.DealDataActivity; +import com.mindspore.hiobject.objectdetect.PhotoActivity; + +public class SplashActivity extends AppCompatActivity implements View.OnClickListener { + + private static final int RC_CHOOSE_PHOTO = 1; + private static final int REQUEST_CAMERA_PERMISSION = 2; + + private Button btnPhoto, btnCamera, btnDealData; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_splash); + + btnPhoto = findViewById(R.id.btn_photo); + btnCamera = findViewById(R.id.btn_camera); + btnDealData = findViewById(R.id.btn_deal); + btnDealData.setVisibility(View.GONE); + + btnPhoto.setOnClickListener(this); + btnCamera.setOnClickListener(this); + btnDealData.setOnClickListener(this); + + } + + + @Override + public void onClick(View view) { + if (R.id.btn_photo == view.getId()) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE}, RC_CHOOSE_PHOTO); + } else if (R.id.btn_camera == view.getId()) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); + + } else if (R.id.btn_deal == view.getId()) { + Intent intent = new Intent(SplashActivity.this, DealDataActivity.class); + startActivity(intent); + } + } + + /** + * 权限申请结果回调 + */ + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (RC_CHOOSE_PHOTO == requestCode) { + choosePhoto(); + } else if (REQUEST_CAMERA_PERMISSION == requestCode) { + chooseCamera(); + } + } + + + private void choosePhoto() { + Intent intentToPickPic = new Intent(Intent.ACTION_PICK, null); + intentToPickPic.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); + startActivityForResult(intentToPickPic, RC_CHOOSE_PHOTO); + } + + private void chooseCamera() { + Intent intent = new Intent(SplashActivity.this, CameraActivity.class); + startActivity(intent); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (RC_CHOOSE_PHOTO == requestCode && null != data && null != data.getData()) { + Intent intent = new Intent(SplashActivity.this, PhotoActivity.class); + intent.setData(data.getData()); + startActivity(intent); + } + } +} + diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/ImageDegreeHelper.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/ImageDegreeHelper.java new file mode 100644 index 00000000000..a1df52f05a8 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/ImageDegreeHelper.java @@ -0,0 +1,185 @@ +package com.mindspore.hiobject.help; + +import android.annotation.SuppressLint; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.Matrix; +import android.media.ExifInterface; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.DocumentsContract; +import android.provider.MediaStore; + +import java.io.IOException; + +public class ImageDegreeHelper { + /** + * 专为Android4.4及以上设计的从Uri获取文件绝对路径,以前的方法已不好使 + */ + @SuppressLint("NewApi") + public static String getPath(final Context context, final Uri uri) { + + final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; + + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + if ("primary".equalsIgnoreCase(type)) { + return Environment.getExternalStorageDirectory() + "/" + split[1]; + } + + // TODO handle non-primary volumes + } + // DownloadsProvider + else if (isDownloadsDocument(uri)) { + + final String id = DocumentsContract.getDocumentId(uri); + final Uri contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); + + return getDataColumn(context, contentUri, null, null); + } + // MediaProvider + else if (isMediaDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if ("video".equals(type)) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if ("audio".equals(type)) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + } + + final String selection = "_id=?"; + final String[] selectionArgs = new String[]{split[1]}; + + return getDataColumn(context, contentUri, selection, selectionArgs); + } + } + // MediaStore (and general) + else if ("content".equalsIgnoreCase(uri.getScheme())) { + return getDataColumn(context, uri, null, null); + } + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) { + return uri.getPath(); + } + + return null; + } + + /** + * Get the value of the data column for this Uri. This is useful for + * MediaStore Uris, and other file-based ContentProviders. + * + * @param context The context. + * @param uri The Uri to query. + * @param selection (Optional) Filter used in the query. + * @param selectionArgs (Optional) Selection arguments used in the query. + * @return The value of the _data column, which is typically a file path. + */ + public static String getDataColumn(Context context, Uri uri, String selection, + String[] selectionArgs) { + + Cursor cursor = null; + final String column = "_data"; + final String[] projection = {column}; + + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, + null); + if (cursor != null && cursor.moveToFirst()) { + final int column_index = cursor.getColumnIndexOrThrow(column); + return cursor.getString(column_index); + } + } finally { + if (cursor != null) + cursor.close(); + } + return null; + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is ExternalStorageProvider. + */ + public static boolean isExternalStorageDocument(Uri uri) { + return "com.android.externalstorage.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is DownloadsProvider. + */ + public static boolean isDownloadsDocument(Uri uri) { + return "com.android.providers.downloads.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is MediaProvider. + */ + public static boolean isMediaDocument(Uri uri) { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + + /** + * 读取照片旋转角度 + * + * @param path 照片路径 + * @return 角度 + */ + public static int readPictureDegree(String path) { + int degree = 0; + try { + ExifInterface exifInterface = new ExifInterface(path); + int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + switch (orientation) { + case ExifInterface.ORIENTATION_ROTATE_90: + degree = 90; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + degree = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_270: + degree = 270; + break; + } + } catch (IOException e) { + e.printStackTrace(); + } + return degree; + } + + + public static Bitmap rotaingImageView(int angle, Bitmap bitmap) { + Bitmap returnBm = null; + // 根据旋转角度,生成旋转矩阵 + Matrix matrix = new Matrix(); + matrix.postRotate(angle); + try { + // 将原始图片按照旋转矩阵进行旋转,并得到新的图片 + returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + } catch (OutOfMemoryError e) { + } + if (returnBm == null) { + returnBm = bitmap; + } + if (bitmap != returnBm) { + bitmap.recycle(); + } + return returnBm; + } +} diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/RecognitionObjectBean.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/RecognitionObjectBean.java new file mode 100644 index 00000000000..2afcf351291 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/RecognitionObjectBean.java @@ -0,0 +1,159 @@ +package com.mindspore.hiobject.help; + +import android.text.TextUtils; + +import java.util.ArrayList; +import java.util.List; + +public class RecognitionObjectBean { + private String rectID; + private String imgID; + private String objectName; + private float score; + private float left; + private float top; + private float right; + private float bottom; + + private RecognitionObjectBean(Builder builder){ + this.rectID = builder.rectID; + this.imgID = builder.imgID; + this.objectName = builder.objectName; + this.score = builder.score; + this.left = builder.left; + this.top = builder.top; + this.right = builder.right; + this.bottom = builder.bottom; + } + + + public static class Builder { + private String rectID; + private String imgID; + private String objectName; + private float score; + private float left; + private float top; + private float right; + private float bottom; + + public RecognitionObjectBean build(){ + return new RecognitionObjectBean(this); + } + + public Builder setRectID(String rectID) { + this.rectID = rectID; + return this; + } + + public Builder setImgID(String imgID) { + this.imgID = imgID; + return this; + } + + public Builder setObjectName(String objectName) { + this.objectName = objectName; + return this; + } + + public Builder setScore(float score) { + this.score = score; + return this; + } + + public Builder setLeft(float left) { + this.left = left; + return this; + } + + public Builder setTop(float top) { + this.top = top; + return this; + } + + public Builder setRight(float right) { + this.right = right; + return this; + } + + public Builder setBottom(float bottom) { + this.bottom = bottom; + return this; + } + } + + + public String getImgID() { + return imgID; + } + + public String getRectID() { + return rectID; + } + + public String getObjectName() { + return objectName; + } + + public float getScore() { + return score; + } + + public float getLeft() { + return left; + } + + public float getTop() { + return top; + } + + public float getRight() { + return right; + } + + public float getBottom() { + return bottom; + } + + + public static List getRecognitionList(String result) { + if (!TextUtils.isEmpty(result)) { + String[] resultArray = result.split(";"); + List list = new ArrayList<>(); + for (int i = 0; i < resultArray.length; i++) { + String singleRecognitionResult = resultArray[i]; + String[] singleResult = singleRecognitionResult.split("_"); + RecognitionObjectBean bean = new RecognitionObjectBean.Builder() + .setRectID(String.valueOf(i + 1)) + .setImgID(null != getData(0, singleResult) ? getData(0, singleResult) : "") + .setObjectName(null != getData(1, singleResult) ? getData(1, singleResult) : "") + .setScore(null != getData(2, singleResult) ? Float.parseFloat(getData(2, singleResult)) : 0) + .setLeft(null != getData(3, singleResult) ? Float.parseFloat(getData(3, singleResult)) : 0) + .setTop(null != getData(4, singleResult) ? Float.parseFloat(getData(4, singleResult)) : 0) + .setRight(null != getData(5, singleResult) ? Float.parseFloat(getData(5, singleResult)) : 0) + .setBottom(null != getData(6, singleResult) ? Float.parseFloat(getData(6, singleResult)) : 0) + .build(); + list.add(bean); + } + return list; + } else { + return null; + } + } + + /** + * @param index + * @param singleResult + * @return + */ + private static String getData(int index, String[] singleResult) { + if (index > singleResult.length) { + return null; + } else { + if (!TextUtils.isEmpty(singleResult[index])) { + return singleResult[index]; + } + } + return null; + } +} diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/TrackingMobile.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/TrackingMobile.java new file mode 100644 index 00000000000..35b38a0914f --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/help/TrackingMobile.java @@ -0,0 +1,118 @@ +package com.mindspore.hiobject.help; + +import android.content.Context; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.util.Log; + +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.HashMap; + +public class TrackingMobile { + private final static String TAG = "TrackingMobile"; + + static { + try { + System.loadLibrary("mlkit-label-MS"); + Log.i(TAG, "load libiMindSpore.so successfully."); + } catch (UnsatisfiedLinkError e) { + Log.e(TAG, "UnsatisfiedLinkError " + e.getMessage()); + } + } + + public static HashMap synset_words_map = new HashMap<>(); + + public static float[] threshold = new float[494]; + + private long netEnv = 0; + + private final Context mActivity; + + public TrackingMobile(Context activity) throws FileNotFoundException { + this.mActivity = activity; + } + + /** + * jni加载模型 + * + * @param assetManager assetManager + * @param buffer buffer + * @param numThread numThread + * @return 加载模型数据 + */ + public native long loadModel(AssetManager assetManager, ByteBuffer buffer, int numThread); + + /** + * jni运行模型 + * + * @param netEnv 加载模型数据 + * @param img 当前图片 + * @return 运行模型数据 + */ + public native String runNet(long netEnv, Bitmap img); + + /** + * 解绑模型数据 + * + * @param netEnv 模型数据 + * @return 解绑状态 + */ + public native boolean unloadModel(long netEnv); + + /** + * C++侧封装成了MSNetWorks类的方法 + * + * @param assetManager 模型文件位置 + * @return 加载模型文件状态 + */ + public boolean loadModelFromBuf(AssetManager assetManager) { +// String ModelPath = "model/model_hebing_3branch.ms"; + String ModelPath = "model/ssd.ms"; + + ByteBuffer buffer = loadModelFile(ModelPath); + netEnv = loadModel(assetManager, buffer, 2); + return true; + } + + /** + * 运行Mindspore + * + * @param img 当前图片识别 + * @return 识别出来的文字信息 + */ + public String MindSpore_runnet(Bitmap img) { + String ret_str = runNet(netEnv, img); + return ret_str; + } + + /** + * 解绑模型 + * @return true + */ + public boolean unloadModel() { + unloadModel(netEnv); + return true; + } + + /** + * 加载模型文件流 + * @param modelPath 模型文件路径 + * @return 加载模型文件流 + */ + public ByteBuffer loadModelFile(String modelPath) { + InputStream is = null; + try { + is = mActivity.getAssets().open(modelPath); + byte[] bytes = new byte[is.available()]; + is.read(bytes); + return ByteBuffer.allocateDirect(bytes.length).put(bytes); + } catch (Exception e) { + Log.d("loadModelFile", " Exception occur "); + e.printStackTrace(); + } + return null; + } + +} diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/AutoFitTextureView.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/AutoFitTextureView.java new file mode 100644 index 00000000000..b40d886636d --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/AutoFitTextureView.java @@ -0,0 +1,78 @@ +/* + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mindspore.hiobject.objectdetect; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.TextureView; + +/** + * A {@link TextureView} that can be adjusted to a specified aspect ratio. + */ +public class AutoFitTextureView extends TextureView { + + private int mRatioWidth = 0; + private int mRatioHeight = 0; + + public AutoFitTextureView(Context context) { + this(context, null); + } + + public AutoFitTextureView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + /** + * Sets the aspect ratio for this view. The size of the view will be measured based on the ratio + * calculated from the parameters. Note that the actual sizes of parameters don't matter, that + * is, calling setAspectRatio(2, 3) and setAspectRatio(4, 6) make the same result. + * + * @param width Relative horizontal size + * @param height Relative vertical size + */ + public void setAspectRatio(int width, int height) { + if (width < 0 || height < 0) { + throw new IllegalArgumentException("Size cannot be negative."); + } + mRatioWidth = width; + mRatioHeight = height; + requestLayout(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (0 == mRatioWidth || 0 == mRatioHeight) { + setMeasuredDimension(width, height); + } else { + if (width > height * mRatioWidth / mRatioHeight) { + setMeasuredDimension(width, width * mRatioHeight / mRatioWidth); + } else { + setMeasuredDimension(height * mRatioWidth / mRatioHeight, height); + } + } + } + + + +} diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/CameraActivity.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/CameraActivity.java new file mode 100644 index 00000000000..68c75794df9 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/CameraActivity.java @@ -0,0 +1,48 @@ +package com.mindspore.hiobject.objectdetect; + +import android.os.Bundle; +import android.view.WindowManager; + +import androidx.appcompat.app.AppCompatActivity; + +import com.mindspore.hiobject.R; + +/** + * [入口主页面] + * + * 向JNI传入图片,测试MindSpore模型加载推理等. + */ + +public class CameraActivity extends AppCompatActivity { + + private final String TAG = "CameraActivity"; + private static final String BUNDLE_FRAGMENTS_KEY = "android:support:fragments"; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_camera); + + if (savedInstanceState != null && this.clearFragmentsTag()) { + // 重建时清除 fragment的状态 + savedInstanceState.remove(BUNDLE_FRAGMENTS_KEY); + } + + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + getSupportFragmentManager().beginTransaction().replace(R.id.container, CameraFragment.newInstance()).commit(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (outState != null && this.clearFragmentsTag()) { + // 销毁时不保存fragment的状态 + outState.remove(BUNDLE_FRAGMENTS_KEY); + } + } + + protected boolean clearFragmentsTag() { + return true; + } +} diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/CameraFragment.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/CameraFragment.java new file mode 100644 index 00000000000..611422cd136 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/CameraFragment.java @@ -0,0 +1,899 @@ + +package com.mindspore.hiobject.objectdetect; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.ImageFormat; +import android.graphics.Matrix; +import android.graphics.Point; +import android.graphics.RectF; +import android.graphics.SurfaceTexture; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.CaptureResult; +import android.hardware.camera2.TotalCaptureResult; +import android.hardware.camera2.params.StreamConfigurationMap; +import android.media.Image; +import android.media.ImageReader; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.text.TextUtils; +import android.util.Log; +import android.util.Size; +import android.util.SparseIntArray; +import android.view.LayoutInflater; +import android.view.Surface; +import android.view.TextureView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; + +import com.mindspore.hiobject.R; +import com.mindspore.hiobject.help.RecognitionObjectBean; +import com.mindspore.hiobject.help.TrackingMobile; + +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +import static com.mindspore.hiobject.help.RecognitionObjectBean.getRecognitionList; + + +public class CameraFragment extends Fragment { + + /** + * Conversion from screen rotation to JPEG orientation. + */ + private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); + private static final String FRAGMENT_DIALOG = "dialog"; + + static { + ORIENTATIONS.append(Surface.ROTATION_0, 90); + ORIENTATIONS.append(Surface.ROTATION_90, 0); + ORIENTATIONS.append(Surface.ROTATION_180, 270); + ORIENTATIONS.append(Surface.ROTATION_270, 180); + } + + /** + * Tag for the {@link Log}. + */ + private static final String TAG = "CameraFragment"; + + /** + * Camera state: Showing ic_launcher preview. + */ + private static final int STATE_PREVIEW = 0; + + /** + * Camera state: Waiting for the focus to be locked. + */ + private static final int STATE_WAITING_LOCK = 1; + + /** + * Camera state: Waiting for the exposure to be precapture state. + */ + private static final int STATE_WAITING_PRECAPTURE = 2; + + /** + * Camera state: Waiting for the exposure state to be something other than precapture. + */ + private static final int STATE_WAITING_NON_PRECAPTURE = 3; + + /** + * Camera state: Picture was taken. + */ + private static final int STATE_PICTURE_TAKEN = 4; + + /** + * Max preview width that is guaranteed by Camera2 API + */ + private static final int MAX_PREVIEW_WIDTH = 1920; + + /** + * Max preview height that is guaranteed by Camera2 API + */ + private static final int MAX_PREVIEW_HEIGHT = 1080; + + /** + * {@link TextureView.SurfaceTextureListener} handles several lifecycle events on a + * {@link TextureView}. + */ + private final TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() { + + @Override + public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) { + openCamera(width, height); + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) { + configureTransform(width, height); + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) { + return true; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture texture) { + } + + }; + + /** + * ID of the current {@link CameraDevice}. + */ + private String mCameraId; + + /** + * An {@link AutoFitTextureView} for ic_launcher preview. + */ + private AutoFitTextureView mTextureView; + + /** + * An {@link ObjectRectView} for Object_draw_Rect_view. + */ + private ObjectRectView mObjectRectView; + + /** + * A {@link CameraCaptureSession } for ic_launcher preview. + */ + private CameraCaptureSession mCaptureSession; + + /** + * A reference to the opened {@link CameraDevice}. + */ + private CameraDevice mCameraDevice; + + /** + * The {@link Size} of ic_launcher preview. + */ + private Size mPreviewSize; + + + /** + * {@link CameraDevice.StateCallback} is called when {@link CameraDevice} changes its state. + */ + private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() { + + @Override + public void onOpened(@NonNull CameraDevice cameraDevice) { + // This method is called when the ic_launcher is opened. We start ic_launcher preview here. + mCameraOpenCloseLock.release(); + mCameraDevice = cameraDevice; + createCameraPreviewSession(); + } + + @Override + public void onDisconnected(@NonNull CameraDevice cameraDevice) { + mCameraOpenCloseLock.release(); + cameraDevice.close(); + mCameraDevice = null; + } + + @Override + public void onError(@NonNull CameraDevice cameraDevice, int error) { + mCameraOpenCloseLock.release(); + cameraDevice.close(); + mCameraDevice = null; + if (null != getActivity()) { + getActivity().finish(); + } + } + + }; + + /** + * An additional thread for running tasks that shouldn't block the UI. + */ + private HandlerThread mBackgroundThread, mPreBackgroundThread; + + /** + * A {@link Handler} for running tasks in the background. + */ + private Handler mBackgroundHandler, mPreBackgroundHandler; + + /** + * An {@link ImageReader} that handles still image capture. + */ + private ImageReader mImageReader; + + + /*** + * A {@link TrackingMobile} for data tracking + */ + private TrackingMobile mTrackingMobile; + + /** + * This a callback object for the {@link ImageReader}. "onImageAvailable" will be called when a + * still image is ready to be saved. + */ + private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { + + @Override + public void onImageAvailable(ImageReader reader) { + try { + Image image = reader.acquireNextImage(); + image.close(); + } catch (Exception e) { + Log.e(TAG, "onImageAvailable: " + e.toString()); + } + } + }; + /** + * {@link CaptureRequest.Builder} for the ic_launcher preview + */ + private CaptureRequest.Builder mPreviewRequestBuilder; + + /** + * {@link CaptureRequest} generated by {@link #mPreviewRequestBuilder} + */ + private CaptureRequest mPreviewRequest; + + /** + * The current state of ic_launcher state for taking pictures. + * + * @see #mCaptureCallback + */ + private int mState = STATE_PREVIEW; + + /** + * A {@link Semaphore} to prevent the app from exiting before closing the ic_launcher. + */ + private Semaphore mCameraOpenCloseLock = new Semaphore(1); + + /** + * Whether the current ic_launcher device supports Flash or not. + */ + private boolean mFlashSupported; + + /** + * Orientation of the ic_launcher sensor + */ + private int mSensorOrientation; + + /** + * A {@link CameraCaptureSession.CaptureCallback} that handles events related to JPEG capture. + */ + private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() { + + private void process(CaptureResult result) { + switch (mState) { + case STATE_PREVIEW: { + // We have nothing to do when the ic_launcher preview is working normally. + break; + } + case STATE_WAITING_LOCK: { + Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); + if (afState == null) { + captureStillPicture(); + } else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState || + CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) { + // CONTROL_AE_STATE can be null on some devices + Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); + if (aeState == null || + aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) { + mState = STATE_PICTURE_TAKEN; + captureStillPicture(); + } else { + runPrecaptureSequence(); + } + } + break; + } + case STATE_WAITING_PRECAPTURE: { + // CONTROL_AE_STATE can be null on some devices + Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); + if (aeState == null || + aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE || + aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) { + mState = STATE_WAITING_NON_PRECAPTURE; + } + break; + } + case STATE_WAITING_NON_PRECAPTURE: { + // CONTROL_AE_STATE can be null on some devices + Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); + if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) { + mState = STATE_PICTURE_TAKEN; + captureStillPicture(); + } + break; + } + } + } + + @Override + public void onCaptureProgressed(@NonNull CameraCaptureSession session, + @NonNull CaptureRequest request, + @NonNull CaptureResult partialResult) { + process(partialResult); + } + + @Override + public void onCaptureCompleted(@NonNull CameraCaptureSession session, + @NonNull CaptureRequest request, + @NonNull TotalCaptureResult result) { + process(result); + } + + }; + + + /** + * Given {@code choices} of {@code Size}s supported by a ic_launcher, choose the smallest one that + * is at least as large as the respective texture view size, and that is at most as large as the + * respective max size, and whose aspect ratio matches with the specified value. If such size + * doesn't exist, choose the largest one that is at most as large as the respective max size, + * and whose aspect ratio matches with the specified value. + * + * @param choices The list of sizes that the ic_launcher supports for the intended output + * class + * @param textureViewWidth The width of the texture view relative to sensor coordinate + * @param textureViewHeight The height of the texture view relative to sensor coordinate + * @param maxWidth The maximum width that can be chosen + * @param maxHeight The maximum height that can be chosen + * @param aspectRatio The aspect ratio + * @return The optimal {@code Size}, or an arbitrary one if none were big enough + */ + private static Size chooseOptimalSize(Size[] choices, int textureViewWidth, int textureViewHeight, int maxWidth, int maxHeight, Size aspectRatio) { + + // Collect the supported resolutions that are at least as big as the preview Surface + List bigEnough = new ArrayList<>(); + // Collect the supported resolutions that are smaller than the preview Surface + List notBigEnough = new ArrayList<>(); + int w = aspectRatio.getWidth(); + int h = aspectRatio.getHeight(); + for (Size option : choices) { + if (option.getWidth() <= maxWidth && option.getHeight() <= maxHeight && option.getHeight() == option.getWidth() * h / w) { +// if (option.getWidth() <= maxWidth && option.getHeight() <= maxHeight) { + if (option.getWidth() >= textureViewWidth && option.getHeight() >= textureViewHeight) { + bigEnough.add(option); + } else { + notBigEnough.add(option); + } + } + } + + // Pick the smallest of those big enough. If there is no one big enough, pick the + // largest of those not big enough. + if (bigEnough.size() > 0) { + return Collections.min(bigEnough, new CompareSizesByArea()); + } else if (notBigEnough.size() > 0) { + return Collections.max(notBigEnough, new CompareSizesByArea()); + } else { + Log.e(TAG, "Couldn't find any suitable preview size"); + return choices[0]; + } + } + + + public static CameraFragment newInstance() { + return new CameraFragment(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_camera, container, false); + } + + + @Override + public void onViewCreated(final View view, Bundle savedInstanceState) { + mTextureView = view.findViewById(R.id.texture); + mObjectRectView = view.findViewById(R.id.objRectView); + } + + @Override + public void onDetach() { + super.onDetach(); + if (mTrackingMobile != null) { + mTrackingMobile.unloadModel(); + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + try { + mTrackingMobile = new TrackingMobile(getActivity()); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + boolean ret = mTrackingMobile.loadModelFromBuf(getActivity().getAssets()); + Log.d(TAG, "TrackingMobile loadModelFromBuf: " + ret); + } + + + @Override + public void onResume() { + super.onResume(); + initChildThread(); + // When the screen is turned off and turned back on, the SurfaceTexture is already + // available, and "onSurfaceTextureAvailable" will not be called. In that case, we can open + // a ic_launcher and start preview from here (otherwise, we wait until the surface is ready in + // the SurfaceTextureListener). + if (mTextureView.isAvailable()) { + openCamera(mTextureView.getWidth(), mTextureView.getHeight()); + Log.d(TAG, "isAvailable: " + mTextureView.getWidth() + "--" + mTextureView.getHeight()); + } else { + Log.d(TAG, "notAvailable: " + mTextureView.getWidth() + "--" + mTextureView.getHeight()); + mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); + } + + } + + @Override + public void onPause() { + closeCamera(); + stopBackgroundThread(); + super.onPause(); + } + + + /** + * Sets up member variables related to ic_launcher. + * + * @param width The width of available size for ic_launcher preview + * @param height The height of available size for ic_launcher preview + */ + @SuppressWarnings("SuspiciousNameCombination") + private void setUpCameraOutputs(int width, int height) { + CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); + try { + for (String cameraId : manager.getCameraIdList()) { + CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); + + // We don't use a front facing ic_launcher in this sample. + Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); + if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) { + continue; + } + + StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + if (map == null) { + continue; + } + + // For still image captures, we use the largest available size. + Size largest = Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)), new CompareSizesByArea()); + //TODO 设置输出图片 + mImageReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, /*maxImages*/30); + mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler); + + // Find out if we need to swap dimension to get the preview size relative to sensor coordinate. + int displayRotation = getActivity().getWindowManager().getDefaultDisplay().getRotation(); + Log.d("displayRotation", "displayRotation: " + displayRotation); + //noinspection ConstantConditions + mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + boolean swappedDimensions = false; + switch (displayRotation) { + case Surface.ROTATION_0: + case Surface.ROTATION_180: + if (mSensorOrientation == 90 || mSensorOrientation == 270) { + swappedDimensions = true; + } + break; + case Surface.ROTATION_90: + case Surface.ROTATION_270: + if (mSensorOrientation == 0 || mSensorOrientation == 180) { + swappedDimensions = true; + } + break; + default: + Log.e(TAG, "Display rotation is invalid: " + displayRotation); + } + + Point displaySize = new Point(); + getActivity().getWindowManager().getDefaultDisplay().getSize(displaySize); + int rotatedPreviewWidth = width; + int rotatedPreviewHeight = height; + int maxPreviewWidth = displaySize.x; + int maxPreviewHeight = displaySize.y; + + if (swappedDimensions) { + rotatedPreviewWidth = height; + rotatedPreviewHeight = width; + maxPreviewWidth = displaySize.y; + maxPreviewHeight = displaySize.x; + } + + if (maxPreviewWidth > MAX_PREVIEW_WIDTH) { + maxPreviewWidth = MAX_PREVIEW_WIDTH; + } + + if (maxPreviewHeight > MAX_PREVIEW_HEIGHT) { + maxPreviewHeight = MAX_PREVIEW_HEIGHT; + } + + // Danger, W.R.! Attempting to use too large a preview size could exceed the ic_launcher + // bus' bandwidth limitation, resulting in gorgeous previews but the storage of + // garbage capture data. + mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth, maxPreviewHeight, largest); + // We fit the aspect ratio of TextureView to the size of preview we picked. + int orientation = getResources().getConfiguration().orientation;//manifest中方向已经写死 + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight()); + } else { + mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth()); + } + // Check if the flash is supported. + Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); + mFlashSupported = available == null ? false : available; + + mCameraId = cameraId; + return; + } + } catch (CameraAccessException e) { + e.printStackTrace(); + } catch (NullPointerException e) { + // Currently an NPE is thrown when the Camera2API is used but not supported on the + // device this code runs. + ErrorDialog.newInstance(getString(R.string.camera_error)).show(getChildFragmentManager(), FRAGMENT_DIALOG); + } + } + + /** + * Opens the ic_launcher specified by {@link CameraFragment#mCameraId}. + */ + @SuppressLint("MissingPermission") + private void openCamera(int width, int height) { + setUpCameraOutputs(width, height); + configureTransform(width, height); + Activity activity = getActivity(); + CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); + try { + if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { + throw new RuntimeException("Time out waiting to lock ic_launcher opening."); + } + manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + throw new RuntimeException("Interrupted while trying to lock ic_launcher opening.", e); + } + } + + /** + * Closes the current {@link CameraDevice}. + */ + private void closeCamera() { + try { + mCameraOpenCloseLock.acquire(); + if (null != mCaptureSession) { + mCaptureSession.close(); + mCaptureSession = null; + } + if (null != mCameraDevice) { + mCameraDevice.close(); + mCameraDevice = null; + } + if (null != mImageReader) { + mImageReader.close(); + mImageReader = null; + } + } catch (InterruptedException e) { + throw new RuntimeException("Interrupted while trying to lock ic_launcher closing.", e); + } finally { + mCameraOpenCloseLock.release(); + } + } + + /** + * Starts a background thread and its {@link Handler}. + */ + private void initChildThread() { + mBackgroundThread = new HandlerThread("CameraBackground"); + mBackgroundThread.start(); + mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); + + mPreBackgroundThread = new HandlerThread("AlgoBackground"); + mPreBackgroundThread.start(); + mPreBackgroundHandler = new Handler(mPreBackgroundThread.getLooper()); + mPreBackgroundHandler.post(periodicClassify); + } + + + private boolean isPreBackgroundThreadPause; + + private Runnable periodicClassify = new Runnable() { + public void run() { + synchronized (CameraFragment.this) { + Bitmap bitmap = mTextureView.getBitmap(); + if (bitmap != null) { + drawBitmapToRect(bitmap); + } + //重复请求 + if (mPreBackgroundHandler != null && !isPreBackgroundThreadPause) { + mPreBackgroundHandler.post(periodicClassify); + } + } + } + }; + + + /** + * Stops the background thread and its {@link Handler}. + */ + private void stopBackgroundThread() { + isPreBackgroundThreadPause = true; + + mBackgroundThread.quitSafely(); + mPreBackgroundThread.quitSafely(); + try { + mBackgroundThread.join(); + mBackgroundThread = null; + mBackgroundHandler = null; + + mPreBackgroundThread.join(); + mPreBackgroundThread = null; + mPreBackgroundThread = null; + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private void createCameraPreviewSession() { + try { + SurfaceTexture texture = mTextureView.getSurfaceTexture(); + // Set preview size. + texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); + // This is the output Surface we need to start preview. + Surface surface = new Surface(texture); + + mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); + mPreviewRequestBuilder.addTarget(surface); + // mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); + // Here, we create a CameraCaptureSession for ic_launcher preview. + mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), + new CameraCaptureSession.StateCallback() { + + @Override + public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { + // The ic_launcher is already closed + if (null == mCameraDevice) { + return; + } + + // When the session is ready, we start displaying the preview. + mCaptureSession = cameraCaptureSession; + try { + // Auto focus should be continuous for ic_launcher preview. + mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, + CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); + // Flash is automatically enabled when necessary. + setAutoFlash(mPreviewRequestBuilder); + // Finally, we start displaying the ic_launcher preview. + mPreviewRequest = mPreviewRequestBuilder.build(); + mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + @Override + public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { + Toast.makeText(getActivity(), "Failed", Toast.LENGTH_LONG).show(); + } + }, null); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + private List recognitionObjectBeanList; + + public void drawBitmapToRect(Bitmap bitmap) { + if (recognitionObjectBeanList != null) { + recognitionObjectBeanList.clear(); + } + + long startTime = System.currentTimeMillis(); + String result = mTrackingMobile.MindSpore_runnet(bitmap); + long endTime = System.currentTimeMillis(); + Log.d(TAG, "MindSpore_runnet:time>>>" + (endTime - startTime)); + Log.d(TAG, "MindSpore_runnet:result>>>" + result); + if (TextUtils.isEmpty(result)) { + mObjectRectView.clearCanvas(); + return; + } + recognitionObjectBeanList = getRecognitionList(result); + mObjectRectView.setInfo(recognitionObjectBeanList); + } + + + /** + * Configures the necessary {@link Matrix} transformation to `mTextureView`. + * This method should be called after the ic_launcher preview size is determined in + * setUpCameraOutputs and also the size of `mTextureView` is fixed. + * + * @param viewWidth The width of `mTextureView` + * @param viewHeight The height of `mTextureView` + */ + private void configureTransform(int viewWidth, int viewHeight) { + if (null == mTextureView || null == mPreviewSize || null == getActivity()) { + return; + } + int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation(); + Matrix matrix = new Matrix(); + RectF viewRect = new RectF(0, 0, viewWidth, viewHeight); + RectF bufferRect = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth()); + float centerX = viewRect.centerX(); + float centerY = viewRect.centerY(); + if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) { + bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY()); + matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL); + float scale = Math.max((float) viewHeight / mPreviewSize.getHeight(), (float) viewWidth / mPreviewSize.getWidth()); + matrix.postScale(scale, scale, centerX, centerY); + matrix.postRotate(90 * (rotation - 2), centerX, centerY); + } else if (Surface.ROTATION_180 == rotation) { + matrix.postRotate(180, centerX, centerY); + } + mTextureView.setTransform(matrix); + } + + + /** + * Run the precapture sequence for capturing a still image. This method should be called when + */ + private void runPrecaptureSequence() { + try { + // This is how to tell the ic_launcher to trigger. + mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START); + // Tell #mCaptureCallback to wait for the precapture sequence to be set. + mState = STATE_WAITING_PRECAPTURE; + mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + /** + * Capture a still picture. This method should be called when we get a response in + */ + private void captureStillPicture() { + try { + final Activity activity = getActivity(); + if (null == activity || null == mCameraDevice) { + return; + } + // This is the CaptureRequest.Builder that we use to take a picture. + final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); + captureBuilder.addTarget(mImageReader.getSurface()); + + // Use the same AE and AF modes as the preview. + captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); + setAutoFlash(captureBuilder); + + // Orientation + int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); + captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation)); + + CameraCaptureSession.CaptureCallback CaptureCallback + = new CameraCaptureSession.CaptureCallback() { + + @Override + public void onCaptureCompleted(@NonNull CameraCaptureSession session, + @NonNull CaptureRequest request, + @NonNull TotalCaptureResult result) { + unlockFocus(); + } + }; + + mCaptureSession.stopRepeating(); + mCaptureSession.abortCaptures(); + mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + /** + * Retrieves the JPEG orientation from the specified screen rotation. + * + * @param rotation The screen rotation. + * @return The JPEG orientation (one of 0, 90, 270, and 360) + */ + private int getOrientation(int rotation) { + // Sensor orientation is 90 for most devices, or 270 for some devices (eg. Nexus 5X) + // We have to take that into account and rotate JPEG properly. + // For devices with orientation of 90, we simply return our mapping from ORIENTATIONS. + // For devices with orientation of 270, we need to rotate the JPEG 180 degrees. + return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360; + } + + /** + * Unlock the focus. This method should be called when still image capture sequence is + * finished. + */ + private void unlockFocus() { + try { + // Reset the auto-focus trigger + mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, + CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); + setAutoFlash(mPreviewRequestBuilder); + mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, + mBackgroundHandler); + // After this, the ic_launcher will go back to the normal state of preview. + mState = STATE_PREVIEW; + mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, + mBackgroundHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + + private void setAutoFlash(CaptureRequest.Builder requestBuilder) { + if (mFlashSupported) { + requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, + CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); + } + } + + /** + * Compares two {@code Size}s based on their areas. + */ + static class CompareSizesByArea implements Comparator { + + @Override + public int compare(Size lhs, Size rhs) { + // We cast here to ensure the multiplications won't overflow + return Long.signum((long) lhs.getWidth() * lhs.getHeight() - (long) rhs.getWidth() * rhs.getHeight()); + } + + } + + /** + * Shows an error message dialog. + */ + public static class ErrorDialog extends DialogFragment { + + private static final String ARG_MESSAGE = "message"; + + public static ErrorDialog newInstance(String message) { + ErrorDialog dialog = new ErrorDialog(); + Bundle args = new Bundle(); + args.putString(ARG_MESSAGE, message); + dialog.setArguments(args); + return dialog; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity activity = getActivity(); + return new AlertDialog.Builder(activity) + .setMessage(getArguments().getString(ARG_MESSAGE)) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + activity.finish(); + } + }) + .create(); + } + } +} diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/DealDataActivity.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/DealDataActivity.java new file mode 100644 index 00000000000..38806ac3355 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/DealDataActivity.java @@ -0,0 +1,263 @@ +package com.mindspore.hiobject.objectdetect; + +import android.Manifest; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; + +import com.mindspore.hiobject.R; +import com.mindspore.hiobject.help.TrackingMobile; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * [入口主页面] + *

+ * 向JNI传入图片,测试MindSpore模型加载推理等. + */ + +public class DealDataActivity extends AppCompatActivity { + private final String TAG = "DealDataActivity"; + + //自行将v2017的图片放入手机sdcard的位置 + private final static String IMGPATH = "/sdcard/val2017"; + private final static String IMG_RESULT_PATH = "/sdcard/val2017result/result.txt"; + private final static String IMG_RESULT_SINGLE_PATH = "/sdcard/val2017result/result2.txt"; + + private Bitmap mBitmap; + private TrackingMobile mTrackingMobile; + + private static final String PERMISSION_READ_EXTERNAL_STORAGEA = Manifest.permission.READ_EXTERNAL_STORAGE; + private static final String PERMISSION_WRITE_EXTERNAL_STORAGEA = Manifest.permission.WRITE_EXTERNAL_STORAGE; + + private static final int PERMISSIONS_REQUEST = 1; + + + private Handler handler = new Handler() { + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if (1 == msg.what) { + dealData(); + // dealSingleData(); + } + } + }; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_dealdata); + + + try { + mTrackingMobile = new TrackingMobile(this); + } catch (FileNotFoundException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + mTrackingMobile.loadModelFromBuf(getAssets()); + + if (hasPermission()) { + getImgFileList(); + } else { + requestPermission(); + } + + } + + + private List imgFileList; + + private void getImgFileList() { + new Thread(new Runnable() { + @Override + public void run() { + imgFileList = getFilesAllName(IMGPATH); + Message message = new Message(); + message.what = 1; + handler.sendMessage(message); + } + }).start(); + } + + + List dealList = new ArrayList<>(); + + private void dealData() { + if (imgFileList != null && imgFileList.size() > 0) { + Log.d(TAG, "imgFileList size()>>" + imgFileList.size()); + for (int i = 0; i < imgFileList.size(); i++) { + Bitmap bitmap = BitmapFactory.decodeFile(imgFileList.get(i)).copy(Bitmap.Config.ARGB_8888, true); + + String result = mTrackingMobile.MindSpore_runnet(bitmap); + String fileName = imgFileList.get(i).substring(imgFileList.get(i).lastIndexOf("/") + 1); + Log.d(TAG, "index>>>" + i + ">>" + fileName + ">>result" + result); + StringBuilder sb = new StringBuilder(); + sb.append(fileName).append("_").append(result); + dealList.add(sb.toString()); + } + Log.d(TAG, "dealList >>>" + dealList.size()); + writeListIntoSDcard(IMG_RESULT_PATH, dealList); + } + } + + private void dealSingleData() { + String fileFullName = IMGPATH + "/error.jpg"; + Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.error).copy(Bitmap.Config.ARGB_8888, true); +// Bitmap bitmap = BitmapFactory.decodeFile(fileFullName).copy(Bitmap.Config.ARGB_8888, true); + if (bitmap != null) { + + String result = mTrackingMobile.MindSpore_runnet(bitmap); + Log.d(TAG, ">>result" + result); + StringBuilder sb = new StringBuilder(); + sb.append("error.jpg").append("_").append(result); +// writeStringIntoSDcard(IMG_RESULT_SINGLE_PATH, sb.toString()); + } + } + + + public boolean writeListIntoSDcard(String fileName, List list) { + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + File sdFile = new File(fileName); + try { + FileOutputStream fos = new FileOutputStream(sdFile); + ObjectOutputStream oos = new ObjectOutputStream(fos); + oos.writeObject(list);//写入 + fos.close(); + oos.close(); + return true; + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return false; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return false; + } + } else { + return false; + } + } + + + public boolean writeStringIntoSDcard(String fileName, String content) { + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + File sdFile = new File(fileName); + try { + FileOutputStream fos = new FileOutputStream(sdFile); + ObjectOutputStream oos = new ObjectOutputStream(fos); + oos.writeObject(content);//写入 + fos.close(); + oos.close(); + return true; + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return false; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return false; + } + } else { + return false; + } + } + + @Override + public void onRequestPermissionsResult(final int requestCode, final String[] permissions, + final int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == PERMISSIONS_REQUEST) { + if (allPermissionsGranted(grantResults)) { + getImgFileList(); + } else { + requestPermission(); + } + } + } + + private static boolean allPermissionsGranted(final int[] grantResults) { + for (int result : grantResults) { + if (result != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + private boolean hasPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return checkSelfPermission(PERMISSION_READ_EXTERNAL_STORAGEA) == PackageManager.PERMISSION_GRANTED && + checkSelfPermission(PERMISSION_WRITE_EXTERNAL_STORAGEA) == PackageManager.PERMISSION_GRANTED; + } else { + return true; + } + } + + private void requestPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(PERMISSION_READ_EXTERNAL_STORAGEA)) { + Toast.makeText(this, "Read permission is required for this demo", Toast.LENGTH_LONG) + .show(); + } + if (shouldShowRequestPermissionRationale(PERMISSION_WRITE_EXTERNAL_STORAGEA)) { + Toast.makeText(this, "WRITE permission is required for this demo", Toast.LENGTH_LONG) + .show(); + } + requestPermissions(new String[]{PERMISSION_READ_EXTERNAL_STORAGEA, PERMISSION_WRITE_EXTERNAL_STORAGEA}, PERMISSIONS_REQUEST); + } + } + + + public List getFilesAllName(String path) { + //传入指定文件夹的路径 + File file = new File(path); + if (null == file || !file.isDirectory()) { + return null; + } + File[] files = file.listFiles(); + List imagePaths = new ArrayList<>(); + for (int i = 0; i < files.length; i++) { + if (checkIsImageFile(files[i].getPath())) { + imagePaths.add(files[i].getPath()); + } + } + return imagePaths; + } + + /** + * 判断是否是照片 + */ + public boolean checkIsImageFile(String fName) { + boolean isImageFile = false; + //获取拓展名 + String fileEnd = fName.substring(fName.lastIndexOf(".") + 1, + fName.length()).toLowerCase(); + if (fileEnd.equals("jpg") || fileEnd.equals("png") || fileEnd.equals("gif") + || fileEnd.equals("jpeg") || fileEnd.equals("bmp")) { + isImageFile = true; + } else { + isImageFile = false; + } + return isImageFile; + } +} diff --git a/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/ObjectRectView.java b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/ObjectRectView.java new file mode 100644 index 00000000000..e7d7248d6d4 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/java/com/mindspore/hiobject/objectdetect/ObjectRectView.java @@ -0,0 +1,114 @@ +package com.mindspore.hiobject.objectdetect; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +import com.mindspore.hiobject.help.RecognitionObjectBean; + +import java.util.ArrayList; +import java.util.List; + +/** + * 针对物体检测的矩形框绘制类 + *

+ * 使用的API: + * 1. Canvas:代表“依附”于指定View的画布,用它的方法来绘制各种图形. + * 2. Paint:代表Canvas上的画笔,用于设置画笔颜色、画笔粗细、填充风格等. + */ + +public class ObjectRectView extends View { + + private final String TAG = "ObjectRectView"; + + private List mRecognitions = new ArrayList<>(); + private Paint mPaint = null; + + // 画框区域. + private RectF mObjRectF; + + + public ObjectRectView(Context context) { + super(context); + initialize(); + } + + public ObjectRectView(Context context, AttributeSet attrs) { + super(context, attrs); + initialize(); + } + + public ObjectRectView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initialize(); + } + + + public int[] MyColor = {Color.RED, Color.WHITE, Color.YELLOW, Color.GREEN, Color.LTGRAY, Color.MAGENTA, Color.BLACK, Color.BLUE, Color.CYAN}; + + + private void initialize() { + mObjRectF = new RectF(); + + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setTextSize(50); + //只绘制图形轮廓(描边) + mPaint.setStyle(Style.STROKE); + mPaint.setStrokeWidth(5); + } + + /** + * 传入需绘制信息 + * + * @param recognitions + */ + public void setInfo(List recognitions) { + Log.i(TAG, "setInfo: "+recognitions.size()); + + mRecognitions.clear(); + mRecognitions.addAll(recognitions); + + //重新draw(). + invalidate(); + } + + public void clearCanvas(){ + mRecognitions.clear(); + //重新draw(). + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + if (mRecognitions == null || mRecognitions.size() == 0) { +// mPaint.setColor(Color.TRANSPARENT); +// mObjRectF = new RectF(0, 0, 5, 5); +// canvas.drawRoundRect(mObjRectF, 0, 0, mPaint); + return; + } + for (int i = 0;i recognitionObjectBeanList; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_photo); + + imgPhoto = findViewById(R.id.img_photo); + + Uri uri = getIntent().getData(); + String imgPath = ImageDegreeHelper.getPath(this,uri); + int degree = ImageDegreeHelper.readPictureDegree(imgPath); + Bitmap originBitmap = BitmapFactory.decodeFile(imgPath); + if (originBitmap != null) { + Bitmap bitmap = ImageDegreeHelper.rotaingImageView(degree, originBitmap.copy(Bitmap.Config.ARGB_8888, true)); + if (bitmap != null) { + imgPhoto.setImageBitmap(bitmap); + initMindspore(bitmap); + } + } + } + + private void initMindspore(Bitmap bitmap) { + try { + trackingMobile = new TrackingMobile(this); + } catch (FileNotFoundException e) { + Log.e(TAG, Log.getStackTraceString(e)); + e.printStackTrace(); + } + // 加载模型 + boolean ret = trackingMobile.loadModelFromBuf(getAssets()); + + if (!ret) { + Log.e(TAG, "Load model error."); + return; + } + // run net. + long startTime = System.currentTimeMillis(); + String result = trackingMobile.MindSpore_runnet(bitmap); + long endTime = System.currentTimeMillis(); + + Log.d(TAG, "RUNNET 耗时:"+(endTime-startTime)+"ms"); + Log.d(TAG, "result:"+ result); + + recognitionObjectBeanList = getRecognitionList(result); + + if (recognitionObjectBeanList != null && recognitionObjectBeanList.size() > 0) { + drawRect(bitmap); + } + } + + private void drawRect(Bitmap bitmap) { + Canvas canvas = new Canvas(bitmap); + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setTextSize(dip2px(15)); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(3); + + for (int i = 0; i < recognitionObjectBeanList.size(); i++) { + RecognitionObjectBean objectBean = recognitionObjectBeanList.get(i); + StringBuilder sb = new StringBuilder(); + sb.append(objectBean.getRectID()).append("_").append(objectBean.getObjectName()).append("_").append(String.format("%.2f", (100 * objectBean.getScore())) + "%"); + + int paintColor = COLORS[i % COLORS.length]; + paint.setColor(paintColor); + + RectF rectF = new RectF(objectBean.getLeft(), objectBean.getTop(), objectBean.getRight(), objectBean.getBottom()); + canvas.drawRect(rectF, paint); + canvas.drawText(sb.toString(),objectBean.getLeft(), objectBean.getTop()-10,paint); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + trackingMobile.unloadModel(); + } + + public int dip2px(float dipValue){ + float scale = getResources().getDisplayMetrics().density; + return (int) (dipValue*scale+0.5f); + + } +} \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/model_zoo/official/lite/object_detection/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000000..2b068d11462 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/drawable/dog_cat.jpg b/model_zoo/official/lite/object_detection/app/src/main/res/drawable/dog_cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47bf70c16b10723d5b72a3192660d36646d08256 GIT binary patch literal 86807 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 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/drawable/error.jpg b/model_zoo/official/lite/object_detection/app/src/main/res/drawable/error.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85d30843597d21351240863c25d1dce4822678e2 GIT binary patch literal 224683 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 H$*YL@LblH9oI1-RbN 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

vM0q}SaBzidRk?P|p;JxY5Km_oLv&MGNTKvwOk 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%0AdIZW?2WqmtkWr0 zbv{)><)%xyZW^rt`qf2=NiBrMZb)&&p!V}#1uh3Y?YjX3lbsY;MY8Cjy1A(Avu5bG zZYQj$6gX}abC8T7b9`6UKIpY* z4UB}jskM_H^@!V4iHVyY=cHB?rsIUE$@3sFGul#~=-Rkt7$<}WQgCyJRA2@H*nQVw zsk0#uH&RTxvJ*Dxr%0p8lSyrLSW%*~NnB;MCDvF7KD(A!B=#hgayjWS_1bAT)wG0| z23KYwg|;I_SJ=Ai)f%i<8ceD^QKYzh##QgfUecY&Jbm62J7lDMG1fzcV4H`2YHqPx zjxWSpUYTfZ+jBa~xy{#CUa&OgWj*_F)uBI2gEBl&TVaUp2O3(6ahAyirQmi5NWmR? z790ZDAg?p4j;P{D_>GjI71hM4K9wlPhAUH9bvy)ueW16Jc^JYl2d~Sq%{PdXcm+fK zxov>AxL^57w`3+O)GF-^PfH?9XIc&+V{!_cJ4nIjJOVS=kkNv7)KbAAnvb$SEhmr3=sY)xkfO}Uwqw1|)XT;@h z<5@D3RNjDe+*Kg(;zzY-^mgP4v>^dbzp?@R?-d1Wox|9a&*QB*ngqWw=>B%c>2b*{n9B^f)cQTX}4oXUr zau!EbnBFOeXgQ3{)vgzX)vkN6V%x2l*1ckdCc8$hMN}td+Z7}R3P4i|LGx1DfEY@` zkbTfGkB1#!@O(onu*dfWne7H6A*T0}EqES^t+*LlLV}cBBPRonv$bh7lCNQ&!PHi&c2r5x#oE{laLjZHQppr*Dlk3*Bw1^H>&8XI0&9UA;mD0}* zGG{>2<(TaGJJ9+|iYX~~cv?z|4`853$9x0v<|ZoxO0!6K1a(=r;{O1v8+A}ui8_tD zD($XIcHvwqya*5y+fxa4MN&(k2V75ZhT2L&%857$A0e1#0;?Vz;4+)rP&QWFIA#-_wfWIR+PxV7v`5SAMZrCAGc&_Y6X^<77Y zF~kroW={9!reScM<#+&w&XZ*U-S?GZ?XAqNToqZBTD$HkZ%BF7y0;1Vtz@X+0Fjfz zQUKr%uW)!K(Wl*0fC&ori-jjc1RM1hO@OHK5`gmE0|i9vJ%_{N)XErVmqcAKRACva z9;)}n`!f7yJ{9HZ5?ET$4rEv9O$3d(875Efw^uayU2^=y$EV;_HM>!RrBH%Txl?^m z)0?+PbprCz`{pznedlk_ewk5bEXHNF#FmZ}ls?Lo+kg@GkfJ^W^#tJiy0Gj20H&(R zn8wwlT;5u%y{p!=mMKzh2(Kk^#il

SWzcCwvmzBliSvB4y6QHLZgd# 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 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/drawable/ic_launcher_background.xml b/model_zoo/official/lite/object_detection/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000000..07d5da9cbf1 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/drawable/mindspore.png b/model_zoo/official/lite/object_detection/app/src/main/res/drawable/mindspore.png new file mode 100644 index 0000000000000000000000000000000000000000..c3bdbc44230096d09e8d2515294d4c7a2fa5c3d9 GIT binary patch literal 35998 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

)~^ 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 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_camera.xml b/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_camera.xml new file mode 100644 index 00000000000..735234b56e8 --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_camera.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_dealdata.xml b/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_dealdata.xml new file mode 100644 index 00000000000..f9504c9a46c --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_dealdata.xml @@ -0,0 +1,6 @@ + + + + diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_photo.xml b/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_photo.xml new file mode 100644 index 00000000000..c24b18ebc7c --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_photo.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_splash.xml b/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 00000000000..a0cb447982f --- /dev/null +++ b/model_zoo/official/lite/object_detection/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,52 @@ + + + + + +