python中dir的坑

[‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘getstate’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘setstate’, ‘sizeof’, ‘sklearn_is_fitted’, ‘str’, ‘subclasshook’, ‘weakref’, ‘_can_use_inplace_predict’, ‘_check_n_features’, ‘_configure_fit’, ‘_early_stopping_attr’, ‘_estimator_type’, ‘_get_iteration_range’, ‘_get_param_names’, ‘_get_tags’, ‘_get_type’, ‘more_tags’, ‘repr_html’, ‘repr_html_inner’, ‘repr_mimebundle’, ‘set_evaluation_result’, ‘validate_data’, ‘apply’, ‘base_score’, ‘best_iteration’, ‘best_ntree_limit’, ‘best_score’, ‘booster’, ***'coef’, ‘***colsample_bylevel’, ‘colsample_bynode’, ‘colsample_bytree’, ‘enable_categorical’, ‘evals_result’, 'feature_importances’, ‘fit’, ‘gamma’, ‘get_booster’, ‘get_num_boosting_rounds’, ‘get_params’, ‘get_xgb_params’, ‘gpu_id’, ‘importance_type’, ‘interaction_constraints’, 'intercept’, ‘learning_rate’, ‘load_model’, ‘max_delta_step’, ‘max_depth’, ‘min_child_weight’, ‘missing’, ‘monotone_constraints’, ‘n_estimators’, 'n_features_in’, ‘n_jobs’, ‘num_parallel_tree’, ‘objective’, ‘predict’, ‘predict_proba’, ‘predictor’, ‘random_state’, ‘reg_alpha’, ‘reg_lambda’, ‘save_model’, ‘scale_pos_weight’, ‘score’, ‘set_params’, ‘subsample’, ‘tree_method’, ‘use_label_encoder’, ‘validate_parameters’, ‘verbosity’]

Traceback (most recent call last):
File “D:/AllExploreDownloads/IDM/ExtraCode/feature_selection.py”, line 682, in
filter_features(rectified_unrepeated_save_path, ‘./merged_features/filtered_features.csv’)
File “D:/AllExploreDownloads/IDM/ExtraCode/feature_selection.py”, line 626, in filter_features
is_remaining_list = xgboost_rfe_filtered_features(df_feat_data, df_label_data, df_columns_list[3:], is_remaining_list)
File “D:/AllExploreDownloads/IDM/ExtraCode/feature_selection.py”, line 457, in xgboost_rfe_filtered_features
print(“model coef:”, selector.estimator.coef_)
File “D:\Anaconda3\lib\site-packages\xgboost\sklearn.py”, line 1064, in coef_
raise AttributeError(
AttributeError: Coefficients are not defined for Booster type None

上方是dir(XGBoostClassifier对象)的输出以及获取其coef_时的报错,可以发现dir的属性和方法并不一定是该类的对象就一定可以使用。
在这里插入图片描述

<think>嗯,用户想用YOLOv8自己的数据集训练得到的best.pt模型,转换成OpenVINO的格式,然后用C++结合OpenCV,通过CMake编译,实现对视频中矩形框的关键点检测。这个问题需要分步骤来解决,我得仔细想想每个步骤应该怎么做。 首先,用户需要将YOLOv8的PyTorch模型转换为ONNX,然后再转成OpenVINO的IR格式。这一步我记得YOLOv8的导出功能可以直接导出ONNX,但可能需要指定关键点检测的参数,比如--kpts,对吧?然后,用OpenVINO的模型优化器转换ONNX到IR。 接下来是C++的部分。用户需要用OpenCV的dnn模块来加载OpenVINO模型,不过可能得用OpenVINO的推理引擎API更好?或者两者结合?需要确认OpenCV是否支持直接读取ONNX或IR模型,或者是否需要通过OpenVINO的API来加载。这里可能需要注意版本兼容性,比如OpenCV的版本是否支持特定的OpenVINO版本。 然后,视频处理部分需要用OpenCV读取视频流,逐帧处理。对于关键点检测,YOLOv8的输出结构可能需要解析,特别是关键点的坐标。每个检测结果可能包含边界框和多个关键点,需要正确地从输出张量中提取这些数据。 CMake编译环节,需要链接OpenCV和OpenVINO的库。用户可能需要在CMakeLists.txt中正确设置include路径和链接库,特别是如果使用OpenVINO的C++ API,可能需要找到对应的库文件。 还有,预处理和后处理步骤需要注意。输入图像需要按照模型的要求进行归一化、调整大小等操作。输出解析可能需要根据模型的输出节点结构来处理,比如知道关键点的位置在输出数组中的索引。 可能遇到的:模型转换时的输出层名称不匹配,导致在C++代码中无法正确获取输出;输入图像的预处理步骤不正确,比如归一化的均值和标准差与训练时不一致;关键点的坐标是否需要后处理,比如从相对坐标转换到绝对坐标;OpenCV和OpenVINO版本之间的兼容性问题,比如某些函数在旧版本中不可用。 用户可能对模型转换的具体参数不太清楚,比如是否需要添加--dynamic参数以适应不同尺寸的输入;在C++代码中,如何高效地处理视频流,避免内存泄漏;关键点检测后的可视化,比如绘制矩形框和关键点连线。 需要确保所有步骤的连贯性:模型转换正确→C++代码正确加载模型→预处理正确→推理执行→后处理正确解析→绘制结果。如果其中任何一步出错,整个流程就会失败,所以可能需要分步验证每个环节。 最后,可能需要提供示例代码片段,特别是模型加载、推理和结果解析的部分,帮助用户理解如何将各个模块整合在一起。同时,提醒用户根据实际模型结构调整参数,比如类别数、关键点数量等。</think>好的!以下是使用YOLOv8自定义数据集结合OpenVINO和C++实现视频关键点检测的完整技术路线: --- ### **Step 1:模型格式转换** #### 1.1 YOLOv8模型转ONNX ```bash pip install ultralytics python -m ultralytics.engine.exporter \ model=best.pt \ format=onnx \ simplify=True \ opset=12 \ imgsz=640 \ kpt_shape=[5,2] # 关键点参数需与训练时一致 ``` #### 1.2 ONNX转OpenVINO IR ```bash mo --input_model best.onnx \ --output_dir openvino_model \ --input_shape [1,3,640,640] \ --data_type FP16 ``` 生成`best.xml`和`best.bin`文件 --- ### **Step 2:C++环境搭建** #### 2.1 CMakeLists.txt配置 ```cmake cmake_minimum_required(VERSION 3.10) project(KeypointDetection) set(CMAKE_CXX_STANDARD 17) find_package(OpenCV REQUIRED) find_package(InferenceEngine REQUIRED) add_executable(main main.cpp) target_link_libraries(main ${OpenCV_LIBS} InferenceEngine::inference_engine ) ``` --- ### **Step 3:核心代码实现** #### 3.1 OpenVINO模型加载 ```cpp #include <opencv2/opencv.hpp> #include <inference_engine.hpp> using namespace InferenceEngine; Core ie; CNNNetwork network = ie.ReadNetwork("best.xml", "best.bin"); ExecutableNetwork executable_network = ie.LoadNetwork(network, "CPU"); InferRequest infer_request = executable_network.CreateInferRequest(); ``` #### 3.2 视频处理框架 ```cpp cv::VideoCapture cap("input.mp4"); cv::Mat frame; while(cap.read(frame)) { // 预处理 cv::Mat blob; cv::resize(frame, frame, cv::Size(640, 640)); cv::dnn::blobFromImage(frame, blob, 1.0/255.0, cv::Size(640, 640)); // 设置输入 Blob::Ptr input = infer_request.GetBlob("images"); MemoryBlob::Ptr minput = as<MemoryBlob>(input); auto minputHolder = minput->wmap(); float* data = minputHolder.as<float*>(); memcpy(data, blob.ptr<float>(), blob.total() * blob.elemSize()); // 推理 infer_request.Infer(); // 获取输出 Blob::Ptr output = infer_request.GetBlob("output0"); MemoryBlob::Ptr moutput = as<MemoryBlob>(output); auto moutputHolder = moutput->rmap(); const float* detection = moutputHolder.as<const float*>(); } ``` #### 3.3 关键点解析(示例) ```cpp struct Detection { cv::Rect box; std::vector<cv::Point2f> keypoints; }; void parse_output(const float* data, std::vector<Detection>& detections) { const int num_det = 25200; // YOLOv8默认输出维度 const int kpt_size = 5 * 2; // 假设5个关键点 for(int i = 0; i < num_det; ++i) { float conf = data[i*85 + 4]; if(conf > 0.5) { Detection det; // 解析边界框 det.box.x = data[i*85] * frame.cols; det.box.y = data[i*85+1] * frame.rows; det.box.width = data[i*85+2] * frame.cols; det.box.height = data[i*85+3] * frame.rows; // 解析关键点 for(int k=0; k<5; ++k) { float x = data[i*85 + 5 + k*2] * frame.cols; float y = data[i*85 + 6 + k*2] * frame.rows; det.keypoints.emplace_back(x, y); } detections.push_back(det); } } } ``` --- ### **Step 4:编译与运行** ```bash mkdir build && cd build cmake .. make -j4 ./main ``` --- ### **关键问题解决技巧** 1. **输入输出维度匹配** - 使用Netron工具查看模型结构 ```python pip install netron import netron; netron.start("best.onnx") ``` 2. **性能优化** ```cpp // 开启异步推理 infer_request.StartAsync(); infer_request.Wait(InferenceEngine::InferRequest::WaitMode::RESULT_READY); ``` 3. **多线程处理** ```cpp // 使用TBB并行 ie.SetConfig({{CONFIG_KEY(CPU_THREADS_NUM), "4"}}); ``` --- ### **效果展示** 建议绘制关键点连线: ```cpp const std::vector<std::pair<int, int>> skeleton = { {0,1}, {1,2}, {2,3}, {3,4} // 根据实际关键点定义 }; for(auto& conn : skeleton) { cv::line(frame, det.keypoints[conn.first], det.keypoints[conn.second], cv::Scalar(0,255,0), 2); } ``` --- ### **注意事项** 1. 预处理必须与训练时完全一致(归一化方式、BGR/RGB顺序) 2. OpenVINO版本建议使用2022.3 LTS版本 3. 对于动态输入需在转换时指定: ```bash mo --input_model best.onnx --dynamic_shape ``` 4. 关键点置信度阈值建议从0.3开始逐步调整 完整代码需要根据实际模型结构调整输出解析逻辑,建议先使用Python验证输出格式后再进行C++移植。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值