#include "libdet.h" #include "cmdline.hpp" #include "timer.hpp" #include #include #include 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("model", 'm', "model", true); parser.add("model_type", 't', "model type", true); parser.add("image", 'i', "image folder(jpg png etc....)", true); parser.add("threshold", 0, "threshold", false, 0.25); parser.add("num_classes", 'c', "num classes", false, 80); parser.add("num_kpt", 0, "num kpt", false, 0); parser.add("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("num_classes"); init_info.num_kpt = parser.get("num_kpt"); init_info.model_type = ax_det_model_type_e(parser.get("model_type")); sprintf(init_info.model_path, "%s", parser.get("model").c_str()); init_info.threshold = parser.get("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("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("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; }