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