Commit 937322e1 authored by change's avatar change
Browse files

first commit

parent aaf6edeb
cmake_minimum_required(VERSION 3.0)
project(resnet50_migraphx CXX C)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread -g")
# set(DTKROOT "/opt/dtk")
find_package(OpenCV REQUIRED)
message(STATUS "opencv libraay status:")
message(STATUS " version:${OpenCV_VERSION}")
message(STATUS " include dir:${OpenCV_INCLUDE_DIRS}")
message(STATUS " lib dir:${OpenCV_LIBS}")
message(STATUS " dtkpath:$ENV{DTKROOT}")
message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}")
# include("include/")
add_executable(main
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/Helpers.cpp)
target_include_directories(main PUBLIC ${OpenCV_INCLUDE_DIRS} "$ENV{DTKROOT}/include" "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(main PUBLIC ${OpenCV_LIBS})
target_link_libraries(main PUBLIC "$ENV{DTKROOT}/lib/libmigraphx.so" "$ENV{DTKROOT}/lib/libmigraphx_onnx.so" "$ENV{DTKROOT}/lib/libmigraphx_gpu.so")
\ No newline at end of file
# Resnet50_migraphx
## 论文
`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/migraphx:4.5.0-py3.10-dtk24.04.3-ubuntu20.04
# 安装opencv(编译源码方式)
git clone --branch 4.9.0 --depth=1 https://github.com/opencv/opencv.git
sudo apt-get install build-essential libgtk2.0-dev libjpeg8-dev libjasper-dev libtiff5-dev libpng12-dev libatlas-base-dev gfortran libavcodec-dev libavformat-dev libswscale-dev libv4l-dev python-numpy libtbb2 libtbb-dev libdc1394-22-dev
cd opencv
mkdir build&& cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/ -D FFMPEG=ON -D OPENCV_GENERATE_PKGCONFIG=YES -D WITH_1394=OFF -D OPENCV_ENABLE_NONFREE=ON -D BUILD_opencv_videoio=ON -D BUILD_opencv_highgui=ON ..
make -j8 # 几个线程编
# 安装
make install
```
## 数据集
## 推理
### C++推理
该cpp项目支持多batch,下面介绍cpp项目编译流程
#### 构建工程
```
cd resnet50_migraphx
mkdir build && cd build
cmake ../
make
```
#### 执行程序
```
cd build
./main
```
## result
输出结果为每个图像得分前五的类别标签
![算法原理](./resource/3.jpg)
## 应用场景
### 算法类别
`图像分类`
### 热点应用行业
`制造,政府,医疗,科研`
## 源码仓库及问题反馈
- https://developer.sourcefind.cn/codes/change/resnet50_migraphx
## 参考资料
- https://developer.sourcefind.cn/codes/modelzoo/resnet50_migraphx
- https://developer.sourcefind.cn/codes/change/resnet50_ort
icon.png

64.6 KB

#include "opencv2/imgproc.hpp"
#include <string>
class Helpers
{
public:
static std::vector<float> loadImage(const std::string& filename, int sizeX = 224, int sizeY = 224);
static std::vector<std::string> loadLabels(const std::string& filename);
};
# 模型唯一标识
modelCode = 1231
# 模型名称
modelName=resnet50_migraphx
# 模型描述
modelDescription=使用migraphx_cpp接口推理,支持多batch推理
# 应用场景
appScenario=制造,政府,医疗,科研
# 框架类型
frameType=migraphx
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>
std::vector<float> Helpers::loadImage(const std::string& filename, int sizeX, int sizeY)
{
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;
}
std::vector<std::string> Helpers::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;
}
#include <migraphx/onnx.hpp>
#include <migraphx/gpu/target.hpp>
#include <opencv2/opencv.hpp>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include "Helpers.h"
// Softmax function to convert logits to probabilities
std::vector<float> softmax(const std::vector<float>& logits) {
float max_logit = *std::max_element(logits.begin(), logits.end());
float sum_exp = 0.0f;
std::vector<float> probs(logits.size());
for (size_t i = 0; i < logits.size(); ++i) {
probs[i] = exp(logits[i] - max_logit);
sum_exp += probs[i];
}
for (size_t i = 0; i < probs.size(); ++i) {
probs[i] /= sum_exp;
}
return probs;
}
int main(int argc, char *argv[])
{
// 设置最大输入shape: input表示输入节点名,{8,3,224,224}表示最大输入shape
migraphx::onnx_options onnx_options;
onnx_options.map_input_dims["input"] = {8, 3, 224, 224};
// 加载模型
migraphx::program net = migraphx::parse_onnx("../models/ResNet50.onnx", onnx_options);
// 加载标签
const std::string labelFile = "../models/imagenet_classes.txt";
std::vector<std::string> labels = Helpers::loadLabels(labelFile);
if (labels.empty()) {
std::cout << "Failed to load labels: " << labelFile << std::endl;
return 1;
}
// 获取模型输入/输出节点信息
std::cout << "inputs:" << std::endl;
std::unordered_map<std::string, migraphx::shape> inputs = net.get_inputs();
for (auto i : inputs)
{
std::cout << i.first << ":" << i.second << std::endl;
}
std::cout << "outputs:" << std::endl;
std::unordered_map<std::string, migraphx::shape> outputs = net.get_outputs();
for (auto i : outputs)
{
std::cout << i.first << ":" << i.second << std::endl;
}
std::string inputName = inputs.begin()->first;
migraphx::shape inputShape = inputs.begin()->second;
int N = inputShape.lens()[0];
int C = inputShape.lens()[1];
int H = inputShape.lens()[2];
int W = inputShape.lens()[3];
// 编译模型
migraphx::compile_options options;
options.device_id = 0; // 设置GPU设备,默认为0号设备
options.offload_copy = true;
net.compile(migraphx::gpu::target{}, options);
// 设置动态输入
std::vector<std::vector<std::size_t>> inputShapes;
int batch=4;
inputShapes.push_back({batch, 3, 224, 224});
// 测试图片的目录
const std::string imagePath = "../img_in/";
const std::string _strPattern = imagePath + "*.jpg";
std::vector<std::string> ImageNames;
cv::glob(_strPattern, ImageNames);
for (int i = 0; i < inputShapes.size(); ++i)
{
// 数据预处理并转换为NCHW格式
std::vector<cv::Mat> srcImages;
for (int j = 0; j < inputShapes[i][0]; ++j)
{
cv::Mat srcImage = cv::imread(ImageNames[j], 1);
srcImages.push_back(srcImage);
}
cv::Mat inputBlob;
cv::dnn::blobFromImages(srcImages,
inputBlob,
0.0078125,
cv::Size(inputShapes[i][3], inputShapes[i][2]),
cv::Scalar(127.5, 127.5, 127.5),
false, false);
// 创建输入数据
std::unordered_map<std::string, migraphx::argument> inputData;
inputData[inputName] = migraphx::argument{migraphx::shape(inputShape.type(), inputShapes[i]), (float*)inputBlob.data};
// 推理
std::vector<migraphx::argument> results = net.eval(inputData);
// 获取输出节点的属性
migraphx::argument result = results[0]; // 获取第一个输出节点的数据
migraphx::shape outputShape = result.get_shape(); // 输出节点的shape
std::vector<std::size_t> outputSize = outputShape.lens();
// 每一维大小,维度顺序为(N,C,H,W)
int numberOfOutput = outputShape.elements(); // 输出节点元素的个数
float *resultData = (float *)result.data(); // 输出节点数据指针
// 每张图像的标签输出
int numClasses = outputSize[1]; // output shape = [batch_size, num_classes, ...]
for (int imgIndex = 0; imgIndex < batch; ++imgIndex) {
// Extract logits for the current image
std::vector<float> logits(resultData + imgIndex * numClasses, resultData + (imgIndex + 1) * numClasses);
// Convert logits to probabilities
std::vector<float> probs = softmax(logits);
// Find the index of the maximum probability
auto max_it = std::max_element(probs.begin(), probs.end());
int top_label_index = std::distance(probs.begin(), max_it);
// Print the top label for the current image
printf("Image %d: Top label index: %d, Label: %s\n", imgIndex, top_label_index, labels[top_label_index].c_str());
}
}
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