|
|
#include "libdet.h" |
|
|
#include "cmdline.hpp" |
|
|
#include "timer.hpp" |
|
|
#include <fstream> |
|
|
#include <cstring> |
|
|
#include <opencv2/opencv.hpp> |
|
|
|
|
|
int main(int argc, char *argv[]) |
|
|
{ |
|
|
ax_devices_t ax_devices; |
|
|
memset(&ax_devices, 0, sizeof(ax_devices_t)); |
|
|
if (ax_dev_enum_devices(&ax_devices) != 0) |
|
|
{ |
|
|
printf("enum devices failed\n"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
if (ax_devices.host.available) |
|
|
{ |
|
|
ax_dev_sys_init(host_device, -1); |
|
|
} |
|
|
|
|
|
if (ax_devices.devices.count > 0) |
|
|
{ |
|
|
ax_dev_sys_init(axcl_device, 0); |
|
|
} |
|
|
|
|
|
if (!ax_devices.host.available && ax_devices.devices.count == 0) |
|
|
{ |
|
|
printf("no device available\n"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
ax_det_init_t init_info; |
|
|
memset(&init_info, 0, sizeof(init_info)); |
|
|
|
|
|
cmdline::parser parser; |
|
|
parser.add<std::string>("model", 'm', "model", true); |
|
|
parser.add<int>("model_type", 't', "model type", true); |
|
|
parser.add<std::string>("image", 'i', "image folder(jpg png etc....)", true); |
|
|
parser.add<float>("threshold", 0, "threshold", false, 0.25); |
|
|
parser.add<int>("num_classes", 'c', "num classes", false, 80); |
|
|
parser.add<int>("num_kpt", 0, "num kpt", false, 0); |
|
|
parser.add<std::string>("output", 'o', "output", false, "results.jpg"); |
|
|
parser.parse_check(argc, argv); |
|
|
|
|
|
if (ax_devices.host.available) |
|
|
{ |
|
|
init_info.dev_type = host_device; |
|
|
} |
|
|
else if (ax_devices.devices.count > 0) |
|
|
{ |
|
|
init_info.dev_type = axcl_device; |
|
|
init_info.devid = 0; |
|
|
} |
|
|
|
|
|
init_info.num_classes = parser.get<int>("num_classes"); |
|
|
init_info.num_kpt = parser.get<int>("num_kpt"); |
|
|
|
|
|
init_info.model_type = ax_det_model_type_e(parser.get<int>("model_type")); |
|
|
|
|
|
sprintf(init_info.model_path, "%s", parser.get<std::string>("model").c_str()); |
|
|
init_info.threshold = parser.get<float>("threshold"); |
|
|
|
|
|
ax_det_handle_t handle; |
|
|
int ret = ax_det_init(&init_info, &handle); |
|
|
if (ret != ax_det_errcode_success) |
|
|
{ |
|
|
printf("ax_det_init failed\n"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
std::string image_src = parser.get<std::string>("image"); |
|
|
cv::Mat src = cv::imread(image_src); |
|
|
if (src.empty()) |
|
|
{ |
|
|
printf("imread %s failed\n", image_src.c_str()); |
|
|
return -1; |
|
|
} |
|
|
cv::cvtColor(src, src, cv::COLOR_BGR2RGB); |
|
|
ax_det_img_t img; |
|
|
img.data = src.data; |
|
|
img.width = src.cols; |
|
|
img.height = src.rows; |
|
|
img.channels = src.channels(); |
|
|
img.stride = src.step; |
|
|
ax_det_result_t result; |
|
|
memset(&result, 0, sizeof(result)); |
|
|
ret = ax_det(handle, &img, &result); |
|
|
if (ret != ax_det_errcode_success) |
|
|
{ |
|
|
printf("ax_det failed\n"); |
|
|
return -1; |
|
|
} |
|
|
printf("num_objs: %d\n", result.num_objs); |
|
|
|
|
|
cv::cvtColor(src, src, cv::COLOR_RGB2BGR); |
|
|
|
|
|
for (int i = 0; i < result.num_objs; i++) |
|
|
{ |
|
|
ax_det_obj_t &obj = result.objects[i]; |
|
|
cv::Rect rect(obj.box.x, obj.box.y, obj.box.w, obj.box.h); |
|
|
cv::rectangle(src, rect, cv::Scalar(0, 255, 0), 2); |
|
|
char label_info[128]; |
|
|
sprintf(label_info, "%d %5.2f", obj.label, obj.score); |
|
|
cv::putText(src, label_info, cv::Point(obj.box.x, obj.box.y + 25), cv::FONT_HERSHEY_SIMPLEX, 1.5, cv::Scalar(0, 255, 0), 2); |
|
|
|
|
|
for (int j = 0; j < obj.num_kpt; j++) |
|
|
{ |
|
|
cv::circle(src, cv::Point(obj.kpts[j].x, obj.kpts[j].y), 10, cv::Scalar(0, 255, 0), -1); |
|
|
} |
|
|
} |
|
|
|
|
|
cv::imwrite(parser.get<std::string>("output"), src); |
|
|
|
|
|
ax_det_deinit(handle); |
|
|
|
|
|
if (ax_devices.host.available) |
|
|
{ |
|
|
ax_dev_sys_deinit(host_device, -1); |
|
|
} |
|
|
else if (ax_devices.devices.count > 0) |
|
|
{ |
|
|
ax_dev_sys_deinit(axcl_device, 0); |
|
|
} |
|
|
|
|
|
return 0; |
|
|
} |