家居網(wǎng)站建設(shè)的背景及意義百度網(wǎng)
使用DJL和PaddlePaddle的口罩檢測(cè)詳細(xì)指南
完整代碼
該項(xiàng)目利用DJL和PaddlePaddle的預(yù)訓(xùn)練模型,構(gòu)建了一個(gè)口罩檢測(cè)應(yīng)用程序。該應(yīng)用能夠在圖片中檢測(cè)人臉,并將每張人臉?lè)诸?lèi)為“戴口罩”或“未戴口罩”。我們將深入分析代碼的每個(gè)部分,以便清晰了解每一步。
代碼關(guān)鍵組件
-
縮放比例和置信度閾值配置:
scale
:控制圖像縮放比例;值越小檢測(cè)速度越快,但精度會(huì)降低。可根據(jù)應(yīng)用場(chǎng)景的精度要求調(diào)整。threshold
:設(shè)定檢測(cè)結(jié)果的最低置信度,用于過(guò)濾低置信度的檢測(cè)結(jié)果。
-
人臉和口罩檢測(cè)模型的初始化:
- 初始化
FaceDetection
用于定位人臉區(qū)域,FaceMaskDetect
則用于對(duì)檢測(cè)出的人臉區(qū)域進(jìn)行口罩狀態(tài)的分類(lèi)。
- 初始化
-
模型加載和預(yù)測(cè):
- 使用DJL的
ZooModel
類(lèi)加載人臉檢測(cè)和口罩分類(lèi)模型。人臉檢測(cè)模型識(shí)別圖像中的人臉區(qū)域,分類(lèi)模型判斷每張人臉是否佩戴口罩。 - 遍歷資源目錄中的所有圖像文件,分別進(jìn)行檢測(cè)和分類(lèi),并將結(jié)果保存和記錄。
- 使用DJL的
優(yōu)化后的代碼講解
以下是代碼的改進(jìn)版本,加入了詳細(xì)的注釋來(lái)說(shuō)明每一步的操作:
@SneakyThrows
@Test
public void test1() {// 設(shè)置人臉檢測(cè)的縮放比例和置信度閾值float scale = 0.5f; // 縮小圖像尺寸,提升檢測(cè)速度float threshold = 0.7f; // 僅保留置信度大于0.7的檢測(cè)結(jié)果// 初始化人臉檢測(cè)和口罩檢測(cè)模型FaceDetection faceDetection = new FaceDetection();FaceMaskDetect faceMaskDetect = new FaceMaskDetect();try (// 加載人臉檢測(cè)模型ZooModel<Image, DetectedObjects> model = ModelZoo.loadModel(faceDetection.criteria(scale, threshold));Predictor<Image, DetectedObjects> faceDetector = model.newPredictor();// 加載口罩分類(lèi)模型ZooModel<Image, Classifications> classifyModel = ModelZoo.loadModel(faceMaskDetect.criteria());Predictor<Image, Classifications> classifier = classifyModel.newPredictor()) {// 遍歷資源目錄中的圖像文件for (File file : new File("src/test/resources").listFiles()) {// 讀取并處理圖像BufferedImage img = ImageIO.read(file);Image image = ImageFactory.getInstance().fromImage(img);// 使用人臉檢測(cè)和口罩分類(lèi)器進(jìn)行預(yù)測(cè)DetectedObjects detections = faceMaskDetect.predict(faceDetector, classifier, image);// 保存檢測(cè)結(jié)果,繪制邊框并記錄到指定目錄ImageUtils.saveBoundingBoxImage(image, detections, file.getName(), "build/output");// 日志輸出檢測(cè)結(jié)果logger.info("{}", detections);}}
}
各步驟詳細(xì)解讀
Step 1: 設(shè)置檢測(cè)參數(shù)
scale參數(shù)控制圖像縮放的比率??s小圖像的尺寸會(huì)提升檢測(cè)速度,但可能會(huì)損失一些精度。該值可以根據(jù)需求靈活調(diào)整。
threshold參數(shù)設(shè)定了最小置信度,用于過(guò)濾低置信度的檢測(cè)結(jié)果。例如,0.7的閾值意味著僅保留置信度在70%以上的結(jié)果。
Step 2: 初始化檢測(cè)模型
這里分別初始化FaceDetection和FaceMaskDetect兩個(gè)對(duì)象。FaceDetection對(duì)象用于人臉檢測(cè),即識(shí)別圖像中的人臉位置。FaceMaskDetect對(duì)象則用于口罩檢測(cè),即對(duì)識(shí)別出的人臉區(qū)域進(jìn)一步分類(lèi)。
Step 3: 加載模型和初始化預(yù)測(cè)器
ModelZoo.loadModel(faceDetection.criteria(scale, threshold))通過(guò)criteria加載人臉檢測(cè)模型,并將其轉(zhuǎn)化為DJL的ZooModel對(duì)象。
Predictor<Image, DetectedObjects> faceDetector = model.newPredictor()創(chuàng)建一個(gè)Predictor,用于接收Image對(duì)象并返回人臉檢測(cè)的DetectedObjects。
同樣,口罩分類(lèi)模型通過(guò)faceMaskDetect.criteria()加載,并使用Predictor<Image, Classifications>進(jìn)行分類(lèi)預(yù)測(cè)。
Step 4: 遍歷圖像文件
使用listFiles()方法遍歷指定目錄下的所有圖像文件,以便逐個(gè)進(jìn)行人臉檢測(cè)和口罩分類(lèi)。
Step 5: 執(zhí)行人臉檢測(cè)和口罩分類(lèi)
faceMaskDetect.predict(faceDetector, classifier, image)方法同時(shí)使用人臉檢測(cè)器faceDetector和分類(lèi)器classifier,首先檢測(cè)人臉位置,然后在檢測(cè)到的人臉區(qū)域內(nèi)進(jìn)行口罩狀態(tài)的分類(lèi)。
Step 6: 保存檢測(cè)結(jié)果
使用ImageUtils.saveBoundingBoxImage()方法,將檢測(cè)結(jié)果繪制到圖像上,并保存到build/output目錄下。該方法會(huì)在圖片上標(biāo)注檢測(cè)框及口罩狀態(tài),便于直觀觀察檢測(cè)效果。
Step 7: 輸出檢測(cè)結(jié)果
使用日志記錄檢測(cè)結(jié)果,包含分類(lèi)結(jié)果(“MASK” 或 “NO MASK”)、置信度、檢測(cè)框的坐標(biāo)和尺寸等信息??刂婆_(tái)示例輸出如下:
運(yùn)行效果示例
執(zhí)行該代碼后,在控制臺(tái)中可以看到每張圖片的檢測(cè)結(jié)果,包括人臉位置和是否佩戴口罩的分類(lèi)信息。以下是示例輸出:
[INFO ] - [class: "MASK", probability: 0.95524, bounds: [x=0.415, y=0.234, width=0.319, height=0.425]
]
[INFO ] - [class: "MASK", probability: 0.99275, bounds: [x=0.274, y=0.226, width=0.412, height=0.523]
]
[INFO ] - [class: "MASK", probability: 0.99931, bounds: [x=0.489, y=0.289, width=0.234, height=0.443]
]
[INFO ] - [class: "NO MASK", probability: 0.99916, bounds: [x=0.489, y=0.311, width=0.171, height=0.395]
]
[INFO ] - [
]
[INFO ] - [class: "MASK", probability: 0.99964, bounds: [x=0.190, y=0.187, width=0.309, height=0.538]
]
檢測(cè)效果圖示例
以下展示了原圖和檢測(cè)后的效果圖:
原圖 | 檢測(cè)圖 |
---|---|
![]() | ![]() |
![]() | ![]() |
總結(jié)與優(yōu)化建議
該系統(tǒng)能夠精準(zhǔn)地檢測(cè)人臉并判斷口罩佩戴狀態(tài),可應(yīng)用于各類(lèi)檢測(cè)場(chǎng)景??梢愿鶕?jù)實(shí)際需求,調(diào)整縮放比例scale
和置信度閾值threshold
以平衡速度和精度。
完整代碼