Commit 4a5d431d authored by lijian6's avatar lijian6
Browse files

init

parent fd79240c
cmake_minimum_required(VERSION 3.16)
project(resnet)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread -g")
add_definitions(-DUNICODE -D_UNICODE)
add_definitions("-Wall")
# find_package(OpenCV REQUIRED)
# 头文件
set(INCLUDE_PATH
${CMAKE_CURRENT_SOURCE_DIR}/include
/usr/local/include/opencv4
${ROCM_PATH}/onnxruntime/include)
include_directories(${INCLUDE_PATH})
# 库文件
set(LIB_PATH
${ROCM_PATH}/onnxruntime/lib
/usr/local/lib
$ENV{DTKROOT}/lib/
)
link_directories(${LIB_PATH})
# 库文件链接
set(LIB onnxruntime opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)
link_libraries(${LIB})
set(source_cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/resnet50.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/Helpers.cpp)
add_executable(resnet ${source_cpp})
\ No newline at end of file
# Resnet50_onnxruntime # Resnet50_onnxruntime
## 论文
`Deep Residual Learning for Image Recognition`
- https://arxiv.org/abs/1512.03385
## 模型结构
ResNet50模型包含了49个卷积层、一个全连接层。
![ResNet50模型结构](./resource/1.png)
## 算法原理
ResNet50使用了多个具有残差连接的残差块来解决梯度消失或梯度爆炸问题,并使得网络可以向更深层发展。
![算法原理](./resource/2.png)
## 环境配置
### Docker
拉取镜像:
```
docker pull image.sourcefind.cn:5000/dcu/admin/base/custom:opencv49_ffmpeg4.2.1_ubuntu20.04-dtk24.04.2
```
## 数据集
## 推理
### C++推理
该cpp项目支持多batch,下面介绍cpp项目编译流程
#### 构建工程
```
cd resnet50_ort
mkdir build && cd build
cmake ../
make
```
#### 执行程序
```
export ORT_ROCM_MULTITHRAED_ENABLE=1
cd build
./resnet
```
## result
输出结果为每个图像得分前五的类别标签
![算法原理](./resource/3.jpg)
## 应用场景
### 算法类别
`图像分类`
### 热点应用行业
`制造,政府,医疗,科研`
## 源码仓库及问题反馈
https://developer.sourcefind.cn/codes/change/resnet50_ort
## 参考资料
https://github.com/onnx/models/tree/main/vision/classification/resnet
icon.png

64.6 KB

#pragma once
#include "opencv2/imgproc.hpp"
class Helpers
{
public:
static std::vector<float> loadImage;
static std::vector<std::string> loadLabels;
};
# 模型唯一标识
modelCode = 1195
# 模型名称
modelName=resnet50_ort
# 模型描述
modelDescription=使用onnxruntime_cpp接口推理,支持多batch推理
# 应用场景
appScenario=制造,政府,医疗,科研
# 框架类型
frameType=onnxruntime
tench
goldfish
great_white_shark
tiger_shark
hammerhead
electric_ray
stingray
cock
hen
ostrich
brambling
goldfinch
house_finch
junco
indigo_bunting
robin
bulbul
jay
magpie
chickadee
water_ouzel
kite
bald_eagle
vulture
great_grey_owl
European_fire_salamander
common_newt
eft
spotted_salamander
axolotl
bullfrog
tree_frog
tailed_frog
loggerhead
leatherback_turtle
mud_turtle
terrapin
box_turtle
banded_gecko
common_iguana
American_chameleon
whiptail
agama
frilled_lizard
alligator_lizard
Gila_monster
green_lizard
African_chameleon
Komodo_dragon
African_crocodile
American_alligator
triceratops
thunder_snake
ringneck_snake
hognose_snake
green_snake
king_snake
garter_snake
water_snake
vine_snake
night_snake
boa_constrictor
rock_python
Indian_cobra
green_mamba
sea_snake
horned_viper
diamondback
sidewinder
trilobite
harvestman
scorpion
black_and_gold_garden_spider
barn_spider
garden_spider
black_widow
tarantula
wolf_spider
tick
centipede
black_grouse
ptarmigan
ruffed_grouse
prairie_chicken
peacock
quail
partridge
African_grey
macaw
sulphur-crested_cockatoo
lorikeet
coucal
bee_eater
hornbill
hummingbird
jacamar
toucan
drake
red-breasted_merganser
goose
black_swan
tusker
echidna
platypus
wallaby
koala
wombat
jellyfish
sea_anemone
brain_coral
flatworm
nematode
conch
snail
slug
sea_slug
chiton
chambered_nautilus
Dungeness_crab
rock_crab
fiddler_crab
king_crab
American_lobster
spiny_lobster
crayfish
hermit_crab
isopod
white_stork
black_stork
spoonbill
flamingo
little_blue_heron
American_egret
bittern
crane
limpkin
European_gallinule
American_coot
bustard
ruddy_turnstone
red-backed_sandpiper
redshank
dowitcher
oystercatcher
pelican
king_penguin
albatross
grey_whale
killer_whale
dugong
sea_lion
Chihuahua
Japanese_spaniel
Maltese_dog
Pekinese
Shih-Tzu
Blenheim_spaniel
papillon
toy_terrier
Rhodesian_ridgeback
Afghan_hound
basset
beagle
bloodhound
bluetick
black-and-tan_coonhound
Walker_hound
English_foxhound
redbone
borzoi
Irish_wolfhound
Italian_greyhound
whippet
Ibizan_hound
Norwegian_elkhound
otterhound
Saluki
Scottish_deerhound
Weimaraner
Staffordshire_bullterrier
American_Staffordshire_terrier
Bedlington_terrier
Border_terrier
Kerry_blue_terrier
Irish_terrier
Norfolk_terrier
Norwich_terrier
Yorkshire_terrier
wire-haired_fox_terrier
Lakeland_terrier
Sealyham_terrier
Airedale
cairn
Australian_terrier
Dandie_Dinmont
Boston_bull
miniature_schnauzer
giant_schnauzer
standard_schnauzer
Scotch_terrier
Tibetan_terrier
silky_terrier
soft-coated_wheaten_terrier
West_Highland_white_terrier
Lhasa
flat-coated_retriever
curly-coated_retriever
golden_retriever
Labrador_retriever
Chesapeake_Bay_retriever
German_short-haired_pointer
vizsla
English_setter
Irish_setter
Gordon_setter
Brittany_spaniel
clumber
English_springer
Welsh_springer_spaniel
cocker_spaniel
Sussex_spaniel
Irish_water_spaniel
kuvasz
schipperke
groenendael
malinois
briard
kelpie
komondor
Old_English_sheepdog
Shetland_sheepdog
collie
Border_collie
Bouvier_des_Flandres
Rottweiler
German_shepherd
Doberman
miniature_pinscher
Greater_Swiss_Mountain_dog
Bernese_mountain_dog
Appenzeller
EntleBucher
boxer
bull_mastiff
Tibetan_mastiff
French_bulldog
Great_Dane
Saint_Bernard
Eskimo_dog
malamute
Siberian_husky
dalmatian
affenpinscher
basenji
pug
Leonberg
Newfoundland
Great_Pyrenees
Samoyed
Pomeranian
chow
keeshond
Brabancon_griffon
Pembroke
Cardigan
toy_poodle
miniature_poodle
standard_poodle
Mexican_hairless
timber_wolf
white_wolf
red_wolf
coyote
dingo
dhole
African_hunting_dog
hyena
red_fox
kit_fox
Arctic_fox
grey_fox
tabby
tiger_cat
Persian_cat
Siamese_cat
Egyptian_cat
cougar
lynx
leopard
snow_leopard
jaguar
lion
tiger
cheetah
brown_bear
American_black_bear
ice_bear
sloth_bear
mongoose
meerkat
tiger_beetle
ladybug
ground_beetle
long-horned_beetle
leaf_beetle
dung_beetle
rhinoceros_beetle
weevil
fly
bee
ant
grasshopper
cricket
walking_stick
cockroach
mantis
cicada
leafhopper
lacewing
dragonfly
damselfly
admiral
ringlet
monarch
cabbage_butterfly
sulphur_butterfly
lycaenid
starfish
sea_urchin
sea_cucumber
wood_rabbit
hare
Angora
hamster
porcupine
fox_squirrel
marmot
beaver
guinea_pig
sorrel
zebra
hog
wild_boar
warthog
hippopotamus
ox
water_buffalo
bison
ram
bighorn
ibex
hartebeest
impala
gazelle
Arabian_camel
llama
weasel
mink
polecat
black-footed_ferret
otter
skunk
badger
armadillo
three-toed_sloth
orangutan
gorilla
chimpanzee
gibbon
siamang
guenon
patas
baboon
macaque
langur
colobus
proboscis_monkey
marmoset
capuchin
howler_monkey
titi
spider_monkey
squirrel_monkey
Madagascar_cat
indri
Indian_elephant
African_elephant
lesser_panda
giant_panda
barracouta
eel
coho
rock_beauty
anemone_fish
sturgeon
gar
lionfish
puffer
abacus
abaya
academic_gown
accordion
acoustic_guitar
aircraft_carrier
airliner
airship
altar
ambulance
amphibian
analog_clock
apiary
apron
ashcan
assault_rifle
backpack
bakery
balance_beam
balloon
ballpoint
Band_Aid
banjo
bannister
barbell
barber_chair
barbershop
barn
barometer
barrel
barrow
baseball
basketball
bassinet
bassoon
bathing_cap
bath_towel
bathtub
beach_wagon
beacon
beaker
bearskin
beer_bottle
beer_glass
bell_cote
bib
bicycle-built-for-two
bikini
binder
binoculars
birdhouse
boathouse
bobsled
bolo_tie
bonnet
bookcase
bookshop
bottlecap
bow
bow_tie
brass
brassiere
breakwater
breastplate
broom
bucket
buckle
bulletproof_vest
bullet_train
butcher_shop
cab
caldron
candle
cannon
canoe
can_opener
cardigan
car_mirror
carousel
carpenter\s_kit
carton
car_wheel
cash_machine
cassette
cassette_player
castle
catamaran
CD_player
cello
cellular_telephone
chain
chainlink_fence
chain_mail
chain_saw
chest
chiffonier
chime
china_cabinet
Christmas_stocking
church
cinema
cleaver
cliff_dwelling
cloak
clog
cocktail_shaker
coffee_mug
coffeepot
coil
combination_lock
computer_keyboard
confectionery
container_ship
convertible
corkscrew
cornet
cowboy_boot
cowboy_hat
cradle
crane
crash_helmet
crate
crib
Crock_Pot
croquet_ball
crutch
cuirass
dam
desk
desktop_computer
dial_telephone
diaper
digital_clock
digital_watch
dining_table
dishrag
dishwasher
disk_brake
dock
dogsled
dome
doormat
drilling_platform
drum
drumstick
dumbbell
Dutch_oven
electric_fan
electric_guitar
electric_locomotive
entertainment_center
envelope
espresso_maker
face_powder
feather_boa
file
fireboat
fire_engine
fire_screen
flagpole
flute
folding_chair
football_helmet
forklift
fountain
fountain_pen
four-poster
freight_car
French_horn
frying_pan
fur_coat
garbage_truck
gasmask
gas_pump
goblet
go-kart
golf_ball
golfcart
gondola
gong
gown
grand_piano
greenhouse
grille
grocery_store
guillotine
hair_slide
hair_spray
half_track
hammer
hamper
hand_blower
hand-held_computer
handkerchief
hard_disc
harmonica
harp
harvester
hatchet
holster
home_theater
honeycomb
hook
hoopskirt
horizontal_bar
horse_cart
hourglass
iPod
iron
jack-o\-lantern
jean
jeep
jersey
jigsaw_puzzle
jinrikisha
joystick
kimono
knee_pad
knot
lab_coat
ladle
lampshade
laptop
lawn_mower
lens_cap
letter_opener
library
lifeboat
lighter
limousine
liner
lipstick
Loafer
lotion
loudspeaker
loupe
lumbermill
magnetic_compass
mailbag
mailbox
maillot
maillot
manhole_cover
maraca
marimba
mask
matchstick
maypole
maze
measuring_cup
medicine_chest
megalith
microphone
microwave
military_uniform
milk_can
minibus
miniskirt
minivan
missile
mitten
mixing_bowl
mobile_home
Model_T
modem
monastery
monitor
moped
mortar
mortarboard
mosque
mosquito_net
motor_scooter
mountain_bike
mountain_tent
mouse
mousetrap
moving_van
muzzle
nail
neck_brace
necklace
nipple
notebook
obelisk
oboe
ocarina
odometer
oil_filter
organ
oscilloscope
overskirt
oxcart
oxygen_mask
packet
paddle
paddlewheel
padlock
paintbrush
pajama
palace
panpipe
paper_towel
parachute
parallel_bars
park_bench
parking_meter
passenger_car
patio
pay-phone
pedestal
pencil_box
pencil_sharpener
perfume
Petri_dish
photocopier
pick
pickelhaube
picket_fence
pickup
pier
piggy_bank
pill_bottle
pillow
ping-pong_ball
pinwheel
pirate
pitcher
plane
planetarium
plastic_bag
plate_rack
plow
plunger
Polaroid_camera
pole
police_van
poncho
pool_table
pop_bottle
pot
potter\s_wheel
power_drill
prayer_rug
printer
prison
projectile
projector
puck
punching_bag
purse
quill
quilt
racer
racket
radiator
radio
radio_telescope
rain_barrel
recreational_vehicle
reel
reflex_camera
refrigerator
remote_control
restaurant
revolver
rifle
rocking_chair
rotisserie
rubber_eraser
rugby_ball
rule
running_shoe
safe
safety_pin
saltshaker
sandal
sarong
sax
scabbard
scale
school_bus
schooner
scoreboard
screen
screw
screwdriver
seat_belt
sewing_machine
shield
shoe_shop
shoji
shopping_basket
shopping_cart
shovel
shower_cap
shower_curtain
ski
ski_mask
sleeping_bag
slide_rule
sliding_door
slot
snorkel
snowmobile
snowplow
soap_dispenser
soccer_ball
sock
solar_dish
sombrero
soup_bowl
space_bar
space_heater
space_shuttle
spatula
speedboat
spider_web
spindle
sports_car
spotlight
stage
steam_locomotive
steel_arch_bridge
steel_drum
stethoscope
stole
stone_wall
stopwatch
stove
strainer
streetcar
stretcher
studio_couch
stupa
submarine
suit
sundial
sunglass
sunglasses
sunscreen
suspension_bridge
swab
sweatshirt
swimming_trunks
swing
switch
syringe
table_lamp
tank
tape_player
teapot
teddy
television
tennis_ball
thatch
theater_curtain
thimble
thresher
throne
tile_roof
toaster
tobacco_shop
toilet_seat
torch
totem_pole
tow_truck
toyshop
tractor
trailer_truck
tray
trench_coat
tricycle
trimaran
tripod
triumphal_arch
trolleybus
trombone
tub
turnstile
typewriter_keyboard
umbrella
unicycle
upright
vacuum
vase
vault
velvet
vending_machine
vestment
viaduct
violin
volleyball
waffle_iron
wall_clock
wallet
wardrobe
warplane
washbasin
washer
water_bottle
water_jug
water_tower
whiskey_jug
whistle
wig
window_screen
window_shade
Windsor_tie
wine_bottle
wing
wok
wooden_spoon
wool
worm_fence
wreck
yawl
yurt
web_site
comic_book
crossword_puzzle
street_sign
traffic_light
book_jacket
menu
plate
guacamole
consomme
hot_pot
trifle
ice_cream
ice_lolly
French_loaf
bagel
pretzel
cheeseburger
hotdog
mashed_potato
head_cabbage
broccoli
cauliflower
zucchini
spaghetti_squash
acorn_squash
butternut_squash
cucumber
artichoke
bell_pepper
cardoon
mushroom
Granny_Smith
strawberry
orange
lemon
fig
pineapple
banana
jackfruit
custard_apple
pomegranate
hay
carbonara
chocolate_sauce
dough
meat_loaf
pizza
potpie
burrito
red_wine
espresso
cup
eggnog
alp
bubble
cliff
coral_reef
geyser
lakeside
promontory
sandbar
seashore
valley
volcano
ballplayer
groom
scuba_diver
rapeseed
daisy
yellow_lady\s_slipper
corn
acorn
hip
buckeye
coral_fungus
agaric
gyromitra
stinkhorn
earthstar
hen-of-the-woods
bolete
ear
toilet_tissue
\ No newline at end of file
#include <filesystem>
#include <fstream>
#include <iostream>
#include <array>
#include "Helpers.h"
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
static std::vector<float> loadImage(const std::string& filename, int sizeX = 224, int sizeY = 224)
{
cv::Mat image = cv::imread(filename);
if (image.empty()) {
std::cout << "No image found.";
}
// convert from BGR to RGB
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
// resize
cv::resize(image, image, cv::Size(sizeX, sizeY));
// reshape to 1D
image = image.reshape(1, 1);
// uint_8, [0, 255] -> float, [0, 1]
// Normalize number to between 0 and 1
// Convert to vector<float> from cv::Mat.
std::vector<float> vec;
image.convertTo(vec, CV_32FC1, 1. / 255);
// Transpose (Height, Width, Channel)(224,224,3) to (Chanel, Height, Width)(3,224,224)
std::vector<float> output;
for (size_t ch = 0; ch < 3; ++ch) {
for (size_t i = ch; i < vec.size(); i += 3) {
output.emplace_back(vec[i]);
}
}
return output;
}
static std::vector<std::string> loadLabels(const std::string& filename)
{
std::vector<std::string> output;
std::ifstream file(filename);
if (file) {
std::string s;
while (getline(file, s)) {
output.emplace_back(s);
}
file.close();
}
return output;
}
\ No newline at end of file
// OnnxRuntimeResNet.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include <onnxruntime_cxx_api.h>
#include <iostream>
#include <string.h>
#include "Helpers.cpp"
int main()
{
Ort::Env env(ORT_LOGGING_LEVEL_ERROR, "resnet4multi_batch");
Ort::RunOptions runOptions;
Ort::Session session(nullptr);
constexpr int64_t Batchsize = 5;
constexpr int64_t numChannels = 3;
constexpr int64_t width = 224;
constexpr int64_t height = 224;
constexpr int64_t numClasses = 1000;
constexpr int64_t numInputElements = numChannels * height * width;
const std::string labelFile = "../models/imagenet_classes.txt";
auto modelPath = "../models/resnet50-v2-7.onnx";
//load labels
std::vector<std::string> labels = loadLabels(labelFile);
if (labels.empty()) {
std::cout << "Failed to load labels: " << labelFile << std::endl;
return 1;
}
std::string imagePath = "../images/";
std::string _strPattern = imagePath + "*.JPEG"; // test_images
std::vector<cv::String> filesVec;
cv::glob(_strPattern, filesVec);
std::vector<std::vector<float>> ImageBatch;
for (int i = 0; i < Batchsize; i++)
{
const std::vector<float> imageVec = loadImage(filesVec[i]);
if (imageVec.empty()) {
std::cout << "Failed to load image: " << filesVec[i] << std::endl;
return 1;
}
if (imageVec.size() != numInputElements) {
std::cout << "Invalid image format. Must be 224x224 RGB image." << std::endl;
return 1;
}
ImageBatch.push_back(imageVec);
}
// Use CUDA GPU
Ort::SessionOptions session_options;
OrtROCMProviderOptions options;
options.device_id = 0;
session_options.AppendExecutionProvider_ROCM(options);
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
//create session
session = Ort::Session(env, modelPath, session_options);
// Use CPU
//session = Ort::Session(env, modelPath, Ort::SessionOptions{ nullptr });
// Define shape
const std::array<int64_t, 4> inputShape = { Batchsize, numChannels, height, width };
const std::array<int64_t, 2> outputShape = { Batchsize, numClasses };
// Define array
std::vector<float> input(Batchsize * numInputElements);
std::vector<float> results(Batchsize * numClasses);
// Define Tensor
auto memory_info = Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU);
auto inputTensor = Ort::Value::CreateTensor<float>(memory_info, input.data(), input.size(), inputShape.data(), inputShape.size());
auto outputTensor = Ort::Value::CreateTensor<float>(memory_info, results.data(), results.size(), outputShape.data(), outputShape.size());
// Copy image data to input array
for (int i = 0; i < Batchsize; ++i) {
std::copy(ImageBatch[i].begin(), ImageBatch[i].end(), input.begin() + i * numInputElements);
}
// Define names
Ort::AllocatorWithDefaultOptions ort_alloc;
Ort::AllocatedStringPtr inputName = session.GetInputNameAllocated(0, ort_alloc);
Ort::AllocatedStringPtr outputName = session.GetOutputNameAllocated(0, ort_alloc);
const std::array<const char*, 1> inputNames = { inputName.get() };
const std::array<const char*, 1> outputNames = { outputName.get() };
inputName.release();
outputName.release();
// Run inference
try {
session.Run(runOptions, inputNames.data(), &inputTensor, 1, outputNames.data(), &outputTensor, 1);
}
catch (Ort::Exception& e) {
std::cout << e.what() << std::endl;
return 1;
}
// Sort results and show Top5 for each image in the batch
for (int b = 0; b < Batchsize; b++) {
std::vector<std::pair<size_t, float>> indexValuePairs;
for (size_t i = 0; i < numClasses; ++i) {
indexValuePairs.emplace_back(i, results[b * numClasses + i]);
}
std::sort(indexValuePairs.begin(), indexValuePairs.end(), [](const auto& lhs, const auto& rhs) { return lhs.second > rhs.second; });
std::cout << "Image " << b + 1 << "-" << filesVec[b] <<std::endl;
// Show Top5
for (size_t i = 0; i < 5; ++i) {
const auto& result = indexValuePairs[i];
std::cout << i + 1 << ": " << labels[result.first] << " " << result.second << std::endl;
}
}
return 0;
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment