divenswu
2 years ago
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