
8 changed files with 118 additions and 181 deletions
@ -0,0 +1,23 @@ |
|||
package com.visual.open.anpr.core.base; |
|||
|
|||
import com.visual.open.anpr.core.domain.ImageMat; |
|||
import com.visual.open.anpr.core.domain.PlateInfo; |
|||
|
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
public interface PlateDetection { |
|||
|
|||
|
|||
/** |
|||
*获取人脸信息 |
|||
* @param image 图像信息 |
|||
* @param scoreTh 人脸人数阈值 |
|||
* @param iouTh 人脸iou阈值 |
|||
* @param params 参数信息 |
|||
* @return |
|||
*/ |
|||
List<PlateInfo> inference(ImageMat image, float scoreTh, float iouTh, Map<String, Object> params); |
|||
|
|||
|
|||
} |
@ -0,0 +1,44 @@ |
|||
package com.visual.open.anpr.core.models; |
|||
|
|||
import ai.onnxruntime.OnnxTensor; |
|||
import com.visual.open.anpr.core.base.BaseOnnxInfer; |
|||
import com.visual.open.anpr.core.base.PlateDetection; |
|||
import com.visual.open.anpr.core.domain.ImageMat; |
|||
import com.visual.open.anpr.core.domain.PlateInfo; |
|||
import com.visual.open.anpr.core.utils.ReleaseUtil; |
|||
import org.opencv.core.Scalar; |
|||
|
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
public class PaddlePlateDetection extends BaseOnnxInfer implements PlateDetection { |
|||
|
|||
private float std[] = {0.229f, 0.224f, 0.225f}; |
|||
private Scalar mean = new Scalar(0.485, 0.456, 0.406); |
|||
|
|||
public PaddlePlateDetection(String modelPath, int threads) { |
|||
super(modelPath, threads); |
|||
} |
|||
|
|||
@Override |
|||
public List<PlateInfo> inference(ImageMat image, float scoreTh, float iouTh, Map<String, Object> params) { |
|||
ImageMat imageMat = image.clone(); |
|||
OnnxTensor tensor = null; |
|||
try { |
|||
tensor = imageMat |
|||
.blobFromImageAndDoReleaseMat(1.0/255, mean, true) |
|||
.to4dFloatOnnxTensorAndNoReleaseMat(std,true); |
|||
|
|||
|
|||
|
|||
}catch (Exception e){ |
|||
|
|||
}finally { |
|||
ReleaseUtil.release(tensor); |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
|
|||
} |
@ -1,111 +0,0 @@ |
|||
package com.visual.open.anpr.core.utils; |
|||
|
|||
import com.visual.face.search.core.domain.FaceInfo; |
|||
import com.visual.face.search.core.domain.ImageMat; |
|||
import org.opencv.core.*; |
|||
import org.opencv.imgproc.Imgproc; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
public class MaskUtil { |
|||
|
|||
/**添加遮罩层所需要的索引号:InsightCoordFaceKeyPoint**/ |
|||
private static int [] MASK_106_IST_ROUND_INDEX = new int[]{ |
|||
1,9,10,11,12,13,14,15,16,2,3,4,5,6,7,8,0, |
|||
24,23,22,21,20,19,18,32,31,30,29,28,27,26,25,17, |
|||
101,105,104,103,102,50,51,49,48,43 |
|||
}; |
|||
|
|||
/** |
|||
* 添加遮罩层 |
|||
* @param image 原始图像 |
|||
* @param pts 指定不不需要填充的区域 |
|||
* @param release 是否释放参数image |
|||
* @return |
|||
*/ |
|||
public static Mat mask(Mat image, List<MatOfPoint> pts, boolean release){ |
|||
Mat pattern = null; |
|||
try { |
|||
pattern = MatOfPoint.zeros(image.size(), CvType.CV_8U); |
|||
Imgproc.fillPoly(pattern, pts, new Scalar(1,1,1)); |
|||
Mat dst = new Mat(); |
|||
image.copyTo(dst, pattern); |
|||
return dst; |
|||
}finally { |
|||
if(null != pattern){ |
|||
pattern.release(); |
|||
} |
|||
if(release && null != pts){ |
|||
for(MatOfPoint pt : pts){ |
|||
pt.release(); |
|||
} |
|||
} |
|||
if(release && null != image){ |
|||
image.release(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 添加遮罩层 |
|||
* @param image 原始图像 |
|||
* @param fillPoints 指定不不需要填充的区域的点 |
|||
* @param release 是否释放参数image |
|||
* @return |
|||
*/ |
|||
public static Mat mask(Mat image, Point[] fillPoints, boolean release){ |
|||
List<MatOfPoint> pts = null; |
|||
try { |
|||
pts = new ArrayList<>(); |
|||
pts.add(new MatOfPoint(fillPoints)); |
|||
return mask(image, pts, false); |
|||
}finally { |
|||
if(null != pts){ |
|||
for(MatOfPoint pt : pts){ |
|||
pt.release(); |
|||
} |
|||
} |
|||
if(release && null != image){ |
|||
image.release(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 添加遮罩层:InsightCoordFaceKeyPoint |
|||
* @param image 原始图像 |
|||
* @param points 人脸标记点 |
|||
* @param release 是否释放参数image |
|||
* @return |
|||
*/ |
|||
public static Mat maskFor106InsightCoordModel(Mat image, FaceInfo.Points points, boolean release){ |
|||
try { |
|||
Point[] fillPoints = PointUtil.convert(points.select(MASK_106_IST_ROUND_INDEX)); |
|||
return mask(image, fillPoints, false); |
|||
}finally { |
|||
if(release && null != image){ |
|||
image.release(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 添加遮罩层:InsightCoordFaceKeyPoint |
|||
* @param image 原始图像 |
|||
* @param points 人脸标记点 |
|||
* @param release 是否释放参数image |
|||
* @return |
|||
*/ |
|||
public static ImageMat maskFor106InsightCoordModel(ImageMat image, FaceInfo.Points points, boolean release){ |
|||
try { |
|||
Mat mat = maskFor106InsightCoordModel(image.toCvMat(), points, false); |
|||
return ImageMat.fromCVMat(mat); |
|||
}finally { |
|||
if(release && null != image){ |
|||
image.release(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
@ -1,39 +0,0 @@ |
|||
package com.visual.open.anpr.core.utils; |
|||
|
|||
import com.visual.face.search.core.domain.FaceInfo; |
|||
import org.opencv.core.Point; |
|||
|
|||
public class PointUtil { |
|||
|
|||
/** |
|||
* 转换点对象 |
|||
* @param point |
|||
* @return |
|||
*/ |
|||
public static FaceInfo.Point convert(Point point){ |
|||
return FaceInfo.Point.build((float)point.x, (float)point.y); |
|||
} |
|||
|
|||
/** |
|||
* 转换点对象 |
|||
* @param point |
|||
* @return |
|||
*/ |
|||
public static Point convert(FaceInfo.Point point){ |
|||
return new Point(point.x, point.y); |
|||
} |
|||
|
|||
/** |
|||
* 转换点对象 |
|||
* @param points |
|||
* @return |
|||
*/ |
|||
public static Point[] convert(FaceInfo.Points points){ |
|||
Point[] result = new Point[points.size()]; |
|||
for(int i=0; i< points.size(); i++){ |
|||
result[i] = convert(points.get(i)); |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue