1.Milvus向量库工具类
Milvus的Maven依赖:
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.1.0</version>
<exclusions>
<exclusion>
<artifactId>log4j-slf4j-impl</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
向量库的配置类:
@Data
@Component
@ConfigurationProperties(MilvusConfiguration.PREFIX)
public class MilvusConfiguration {
public static final String PREFIX = "milvus-config";
public String host;
public int port;
public String collectionName;
}
工具类主类:
@Slf4j
@Component
public class MilvusUtil {
@Resource
private MilvusConfiguration milvusConfiguration;
private MilvusServiceClient milvusServiceClient;
@PostConstruct
private void connectToServer() {
milvusServiceClient = new MilvusServiceClient(
ConnectParam.newBuilder()
.withHost(milvusConfiguration.host)
.withPort(milvusConfiguration.port)
.build());
// 加载数据
LoadCollectionParam faceSearchNewLoad = LoadCollectionParam.newBuilder()
.withCollectionName(milvusConfiguration.collectionName).build();
R<RpcStatus> rpcStatusR = milvusServiceClient.loadCollection(faceSearchNewLoad);
log.info("Milvus LoadCollection [{}]", rpcStatusR.getStatus() == 0 ? "Successful!" : "Failed!");
}
}
主类里的数据入库方法:
public int insertDataToMilvus(String id, String path, float[] feature) {
List<InsertParam.Field> fields = new ArrayList<>();
List<Float> featureList = new ArrayList<>(feature.length);
for (float v : feature) {
featureList.add(v);
}
fields.add(new InsertParam.Field("id", Collections.singletonList(id)));
fields.add(new InsertParam.Field("image\_path", Collections.singletonList(path)));
fields.add(new InsertParam.Field("image\_feature", Collections.singletonList(featureList)));
InsertParam insertParam = InsertParam.newBuilder()
.withCollectionName(milvusConfiguration.collectionName)
//.withPartitionName("novel")
.withFields(fields)
.build();
R<MutationResult> insert = milvusServiceClient.insert(insertParam);
return insert.getStatus();
}
主类类的数据查询方法:
- 这里的topK没有进行参数化。
public List<MilvusRes> searchImageByFeatureVector(float[] feature) {
List<Float> featureList = new ArrayList<>(feature.length);
for (float v : feature) {
featureList.add(v);
}
List<String> queryOutputFields = Arrays.asList("image\_path");
SearchParam faceSearch = SearchParam.newBuilder()
.withCollectionName(milvusConfiguration.collectionName)
.withMetricType(MetricType.IP)
.withVectorFieldName("image\_feature")
.withVectors(Collections.singletonList(featureList))
.withOutFields(queryOutputFields)
.withRoundDecimal(3)
.withTopK(10).build();
// 执行搜索
long l = System.currentTimeMillis();
R<SearchResults> respSearch = milvusServiceClient.search(faceSearch);
log.info("MilvusServiceClient.search cost [{}]", System.currentTimeMillis() - l);
// 解析结果数据
SearchResultData results = respSearch.getData().getResults();
int scoresCount = results.getScoresCount();
SearchResultsWrapper wrapperSearch = new SearchResultsWrapper(results);
List<MilvusRes> milvusResList = new ArrayList<>();
for (int i = 0; i < scoresCount; i++) {
float score = wrapperSearch.getIDScore(0).get(i).getScore();
Object imagePath = wrapperSearch.getFieldData("image\_path", 0).get(i);
MilvusRes milvusRes = MilvusRes.builder().score(score).imagePath(imagePath.toString()).build();
milvusResList.add(milvusRes);
}
return milvusResList;
}
2.SeetaSDK工具类
SeetaSDK的Maven依赖:
<dependency>
<groupId>com.seeta</groupId>
<artifactId>sdk</artifactId>
<version>1.2.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/seeta-sdk-platform-1.2.1.jar</systemPath>
</dependency>
<!--注意-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
jar是从官网下的源码进行的打包:
工具类主类:
@Slf4j
@Component
public class FaceUtil {
static {
// 加载本地方法
LoadNativeCore.LOAD\_NATIVE(SeetaDevice.SEETA\_DEVICE\_AUTO);
}
@Resource
private SeetaModelConfiguration seetaModelConfiguration;
private FaceDetectorProxy faceDetectorProxy;
private FaceLandmarkerProxy faceLandmarkerProxy;
private FaceRecognizerProxy faceRecognizerProxy;
private AgePredictorProxy agePredictorProxy;
private GenderPredictorProxy genderPredictorProxy;
private MaskDetectorProxy maskDetectorProxy;
private EyeStateDetectorProxy eyeStateDetectorProxy;
}
主类里的初始方法:
@PostConstruct
private void inti() {
String basePath = seetaModelConfiguration.basePath;
try {
// 人脸识别检测器对象池配置
SeetaConfSetting detectorPoolSetting = new SeetaConfSetting(
new SeetaModelSetting(0, new String[]{basePath + seetaModelConfiguration.faceDetectorModelFileName},
SeetaDevice.SEETA\_DEVICE\_AUTO));
faceDetectorProxy = new FaceDetectorProxy(detectorPoolSetting);
// 关键点定位器【默认使用5点可通过配置切换为68点】
SeetaConfSetting faceLandmarkerPoolSetting = new SeetaConfSetting(
new SeetaModelSetting(1, new String[]{basePath + seetaModelConfiguration.faceLandmarkerModelFileName},
SeetaDevice.SEETA\_DEVICE\_AUTO));
faceLandmarkerProxy = new FaceLandmarkerProxy(faceLandmarkerPoolSetting);
// 人脸向量特征提取和对比器
SeetaConfSetting faceRecognizerPoolSetting = new SeetaConfSetting(
new SeetaModelSetting(2, new String[]{basePath + seetaModelConfiguration.faceRecognizerModelFileName},
SeetaDevice.SEETA\_DEVICE\_AUTO));
faceRecognizerProxy = new FaceRecognizerProxy(faceRecognizerPoolSetting);
// 年龄评估器
SeetaConfSetting agePredictorPoolSetting = new SeetaConfSetting(
new SeetaModelSetting(3, new String[]{basePath + seetaModelConfiguration.agePredictorModelFileName},
SeetaDevice.SEETA\_DEVICE\_AUTO));
agePredictorProxy = new AgePredictorProxy(agePredictorPoolSetting);
// 性别识别器
SeetaConfSetting genderPredictorPoolSetting = new SeetaConfSetting(
new SeetaModelSetting(4, new String[]{basePath + seetaModelConfiguration.genderPredictorModelFileName},
SeetaDevice.SEETA\_DEVICE\_AUTO));
genderPredictorProxy = new GenderPredictorProxy(genderPredictorPoolSetting);
// 口罩检测器
SeetaConfSetting maskDetectorPoolSetting = new SeetaConfSetting(
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
![](https://img-blog.csdnimg.cn/img_convert/311903982dea1d8a5d2c98fc271b5b41.jpeg)
### 学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
![](https://img-blog.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)
#### 网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份**我自己整理的网络安全入门工具以及使用教程和实战。**
![](https://img-blog.csdnimg.cn/img_convert/bcd1787ce996787388468bb227d8f959.jpeg)
#### 项目实战
最后就是项目实战,这里带来的是**SRC资料&HW资料**,毕竟实战是检验真理的唯一标准嘛~
![](https://img-blog.csdnimg.cn/img_convert/35fc46df24091ce3c9a5032a9919b755.jpeg)
#### 面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**