テスト中

This commit is contained in:
lltcggie 2025-09-08 03:47:12 +09:00
parent ea6af02321
commit a63b2510c6
2 changed files with 174 additions and 98 deletions

View File

@ -280,8 +280,11 @@ public:
}
};
void reg();
int main(int argc, char** argv) {
CV_DNN_REGISTER_LAYER_CLASS(CropCenter, CropCenterLayer);
//CV_DNN_REGISTER_LAYER_CLASS(CropCenter, CropCenterLayer);
reg();
// ImageNet Caffeリファレンスモデル
string protoFile = "models/upresnet10/noise0_scale2.0x_model.prototxt";
@ -298,7 +301,7 @@ int main(int argc, char** argv) {
//net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
//net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
//net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
}
catch (const cv::Exception& e) {
@ -326,8 +329,8 @@ int main(int argc, char** argv) {
const auto probMat = net.forward();
std::vector<cv::Mat> outImgs;
//cv::dnn::imagesFromBlob(probMat, outImgs);
cv::dnn::imagesFromBlob(inputBlob, outImgs);
cv::dnn::imagesFromBlob(probMat, outImgs);
//cv::dnn::imagesFromBlob(inputBlob, outImgs);
auto outImg = outImgs[0];
// 値を01にクリッピング

View File

@ -23,14 +23,11 @@
using namespace cv::dnn::cuda4dnn;
#endif
namespace cv
namespace
{
namespace dnn
cv::Range normalizeRange(const cv::Range& input_range, int n)
{
Range normalizeRange(const Range& input_range, int n)
{
Range range = input_range;
cv::Range range = input_range;
if (range.start != n) {
range.start = std::min(std::max(range.start, -n), n - 1);
@ -50,7 +47,7 @@ namespace cv
}
// TODO: support cv::Range with steps and negative steps to get rid of this transformation
void tranformForNegSteps(const MatShape& inpShape, std::vector<std::vector<Range> >& sliceRanges, std::vector<std::vector<int> >& sliceSteps)
void tranformForNegSteps(const cv::dnn::MatShape& inpShape, std::vector<std::vector<cv::Range> >& sliceRanges, std::vector<std::vector<int> >& sliceSteps)
{
// in case of negative steps,
// x of shape [5, 10], x[5:0:-1, 10:1:-3] <=> np.flip(x[1:5:1, 2:10:3], aixs=(0, 1))
@ -77,7 +74,7 @@ namespace cv
}
}
std::vector<std::vector<cv::Range> > finalizeSliceRange(const MatShape& inpShape, int& axis,
std::vector<std::vector<cv::Range> > finalizeSliceRange(const cv::dnn::MatShape& inpShape, int& axis,
const std::vector<std::vector<cv::Range> >& inputSliceRanges)
{
std::vector<std::vector<cv::Range> > sliceRanges = inputSliceRanges;
@ -86,10 +83,10 @@ namespace cv
axis = (axis + static_cast<int>(inpShape.size())) % inpShape.size();
for (size_t i = 0; i < sliceRanges.size(); ++i) {
std::vector<Range>& ranges = sliceRanges[i];
std::vector<cv::Range>& ranges = sliceRanges[i];
if (axisNeg)
{
ranges.insert(ranges.begin(), axis, Range::all());
ranges.insert(ranges.begin(), axis, cv::Range::all());
}
for (size_t j = 0; j < ranges.size(); ++j)
@ -106,6 +103,14 @@ namespace cv
return sliceRanges;
}
}
namespace cv
{
namespace dnn
{
class SliceLayerImpl : public SliceLayer
{
@ -826,10 +831,10 @@ namespace cv
bool hasSteps;
};
class CropLayerImpl CV_FINAL : public SliceLayerImpl
class CropCenterLayerImpl CV_FINAL : public SliceLayerImpl
{
public:
CropLayerImpl(const LayerParams& params) : SliceLayerImpl(LayerParams())
CropCenterLayerImpl(const LayerParams& params) : SliceLayerImpl(LayerParams())
{
setParamsFrom(params);
axis = params.get<int>("axis", 2);
@ -840,6 +845,21 @@ namespace cv
for (int i = 0; i < paramOffset->size(); i++)
offset.push_back(paramOffset->get<int>(i));
}
if (params.has("crop_size"))
{
const auto& paramCropSize = params.get("crop_size");
const auto& str = paramCropSize.getStringValue();
const int s = atoi(str.c_str());
offset.resize(4);
offset[0] = 0;
offset[1] = 0;
offset[2] = s;
offset[3] = s;
axis = 0;
}
}
bool getMemoryShapes(const std::vector<MatShape>& inputs,
@ -847,26 +867,75 @@ namespace cv
std::vector<MatShape>& outputs,
std::vector<MatShape>& internals) const CV_OVERRIDE
{
CV_Assert(inputs.size() == 2);
//CV_Assert(inputs.size() == 2);
//MatShape dstShape = inputs[0];
//int start = normalize_axis(axis, dstShape);
//for (int i = start; i < dstShape.size(); i++)
//{
// dstShape[i] = inputs[1][i];
//}
//outputs.resize(1, dstShape);
MatShape dstShape = inputs[0];
int start = normalize_axis(axis, dstShape);
for (int i = start; i < dstShape.size(); i++)
{
dstShape[i] = inputs[1][i];
dstShape[i] = dstShape[i] - offset[i] * 2;
}
outputs.resize(1, dstShape);
return false;
}
void finalize(InputArrayOfArrays inputs_arr, OutputArrayOfArrays) CV_OVERRIDE
{
//std::vector<Mat> inputs;
//inputs_arr.getMatVector(inputs);
//CV_Assert(2 == inputs.size());
//const Mat& inpBlob = inputs[0];
//const Mat& inpSzBlob = inputs[1];
//int dims = inpBlob.dims;
//int start_axis = normalize_axis(axis, dims);
//std::vector<int> offset_final(dims, 0);
//if (offset.size() == 1)
//{
// for (int i = start_axis; i < dims; i++)
// offset_final[i] = offset[0];
//}
//else if (offset.size() > 1)
//{
// if ((int)offset.size() != dims - start_axis)
// CV_Error(Error::StsBadArg, "number of offset values specified must be "
// "equal to the number of dimensions following axis.");
// for (int i = start_axis; i < dims; i++)
// offset_final[i] = offset[i - start_axis];
//}
//finalSliceRanges.resize(1);
//finalSliceRanges[0].resize(dims);
//for (int i = 0; i < start_axis; i++)
//{
// finalSliceRanges[0][i] = Range(0, inpBlob.size[i]);
//}
//for (int i = start_axis; i < dims; i++)
//{
// if (offset_final[i] < 0 || offset_final[i] + inpSzBlob.size[i] > inpBlob.size[i])
// CV_Error(Error::StsBadArg, "invalid crop parameters or blob sizes");
// finalSliceRanges[0][i] = Range(offset_final[i], offset_final[i] + inpSzBlob.size[i]);
//}
std::vector<Mat> inputs;
inputs_arr.getMatVector(inputs);
CV_Assert(2 == inputs.size());
CV_Assert(1 == inputs.size());
const Mat& inpBlob = inputs[0];
const Mat& inpSzBlob = inputs[1];
int dims = inpBlob.dims;
int start_axis = normalize_axis(axis, dims);
@ -895,25 +964,29 @@ namespace cv
}
for (int i = start_axis; i < dims; i++)
{
if (offset_final[i] < 0 || offset_final[i] + inpSzBlob.size[i] > inpBlob.size[i])
int w = inpBlob.size[i] - offset_final[i] * 2;
if (offset_final[i] < 0 || w < 0)
CV_Error(Error::StsBadArg, "invalid crop parameters or blob sizes");
finalSliceRanges[0][i] = Range(offset_final[i], offset_final[i] + inpSzBlob.size[i]);
finalSliceRanges[0][i] = Range(offset_final[i], offset_final[i] + w);
}
}
static cv::Ptr<cv::dnn::Layer> create(cv::dnn::LayerParams& params)
{
return cv::Ptr<CropCenterLayerImpl>(new CropCenterLayerImpl(params));
}
private:
std::vector<int> offset;
};
Ptr<SliceLayer> SliceLayer::create(const LayerParams& params)
{
return Ptr<SliceLayer>(new SliceLayerImpl(params));
}
Ptr<Layer> CropLayer::create(const LayerParams& params)
{
return Ptr<Layer>(new CropLayerImpl(params));
}
}
}
# include <opencv2/dnn/layer.details.hpp>
void reg()
{
CV_DNN_REGISTER_LAYER_CLASS(CropCenter, cv::dnn::CropCenterLayerImpl);
}