diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 6fb560f..499f140 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -634,7 +634,7 @@ std::vector strides = {8, 16, 32}; // might have stride=64 std::vector grid_strides; generate_grids_and_stride(in_pad.w, in_pad.h, strides, grid_strides); - generate_proposals(grid_strides, out, 0.4f, proposals, 50); + generate_proposals(grid_strides, out, 0.4f, proposals, 58); // sort all proposals by score from highest to lowest qsort_descent_inplace(proposals); @@ -756,7 +756,7 @@ std::vector strides = {8, 16, 32}; // might have stride=64 std::vector grid_strides; generate_grids_and_stride(in_pad.w, in_pad.h, strides, grid_strides); - generate_proposals(grid_strides, out, prob_threshold, proposals, 50); + generate_proposals(grid_strides, out, prob_threshold, proposals, 58); // sort all proposals by score from highest to lowest qsort_descent_inplace(proposals); diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 6fb560f..499f140 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -634,7 +634,7 @@ std::vector strides = {8, 16, 32}; // might have stride=64 std::vector grid_strides; generate_grids_and_stride(in_pad.w, in_pad.h, strides, grid_strides); - generate_proposals(grid_strides, out, 0.4f, proposals, 50); + generate_proposals(grid_strides, out, 0.4f, proposals, 58); // sort all proposals by score from highest to lowest qsort_descent_inplace(proposals); @@ -756,7 +756,7 @@ std::vector strides = {8, 16, 32}; // might have stride=64 std::vector grid_strides; generate_grids_and_stride(in_pad.w, in_pad.h, strides, grid_strides); - generate_proposals(grid_strides, out, prob_threshold, proposals, 50); + generate_proposals(grid_strides, out, prob_threshold, proposals, 58); // sort all proposals by score from highest to lowest qsort_descent_inplace(proposals); diff --git a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt index b3d0352..fe56d38 100644 --- a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt +++ b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt @@ -13,7 +13,9 @@ var hiddenTroubles = ArrayList() fun siftHiddenTrouble( - segmentationResults: MutableList, detectResults: MutableList + targetTypeSet: HashSet, + segmentationResults: MutableList, + detectResults: MutableList ) { //每次刷新画面帧都清除掉之前的筛选结果 hiddenTroubles.clear() @@ -23,13 +25,16 @@ if (detectResults.isContains(3)) { if (!detectResults.isContains(24) && !detectResults.isContains(9)) { //不包含工服/防护服 - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoWorkerClothes" - result.warning = "未穿工服/防护服" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(24) && !targetTypeSet.contains(9)) { + //当前画面帧不包含工服和防护服且当前场景下没有识别过工服和防护服。以下类推 + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoWorkerClothes" + result.warning = "未穿工服/防护服" + hiddenTroubles.add(result) + } } - if (!detectResults.isContains(18)) { + if (!detectResults.isContains(18) && !targetTypeSet.contains(18)) { //不包含安全帽 val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoWorkerSafelyHat" @@ -39,7 +44,7 @@ } //结果不包含呼吸防护设备 - if (!detectResults.isContains(11)) { + if (!detectResults.isContains(11) && !targetTypeSet.contains(11)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoWorkerMask" result.warning = "现场无呼吸器" @@ -48,10 +53,12 @@ //结果不包含路锥、警戒线 if (!detectResults.isContains(48) && !detectResults.isContains(43)) { - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoEnclosure" - result.warning = "现场无围挡设施" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(48) && !targetTypeSet.contains(43)) { + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoEnclosure" + result.warning = "现场无围挡设施" + hiddenTroubles.add(result) + } } //结果不包含安全告知牌 @@ -59,13 +66,18 @@ !detectResults.isContains(6) && !detectResults.isContains(28) ) { - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoWarningSign" - result.warning = "现场无安全告知牌" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(16) && + !targetTypeSet.contains(6) && + !targetTypeSet.contains(28) + ) { + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoWarningSign" + result.warning = "现场无安全告知牌" + hiddenTroubles.add(result) + } } - if (!detectResults.isContains(4)) { + if (!detectResults.isContains(4) && !targetTypeSet.contains(4)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoJobInformationSign" result.warning = "现场无作业信息公示牌" @@ -74,14 +86,16 @@ //结果不包含通风设备 if (!detectResults.isContains(57) && !detectResults.isContains(58)) { - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoAirSupply" - result.warning = "现场无送风设备" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(57) && !targetTypeSet.contains(58)) { + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoAirSupply" + result.warning = "现场无送风设备" + hiddenTroubles.add(result) + } } //结果不包含井下照明设备 - if (!detectResults.isContains(37)) { + if (!detectResults.isContains(37) && !targetTypeSet.contains(37)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoLighting" result.warning = "现场无照明设备" @@ -89,7 +103,7 @@ } //结果不包含对讲设备 - if (!detectResults.isContains(22)) { + if (!detectResults.isContains(22) && !targetTypeSet.contains(22)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoIntercom" result.warning = "现场无对讲设备" @@ -97,7 +111,7 @@ } //结果不包含施工三脚架 - if (!detectResults.isContains(0)) { + if (!detectResults.isContains(0) && !targetTypeSet.contains(0)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoTripod" result.warning = "现场无三脚架" @@ -106,10 +120,12 @@ //结果不包含气体检测仪 if (!detectResults.isContains(13) && !detectResults.isContains(29)) { - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoGasDetector" - result.warning = "现场无气体检测报警仪" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(13) && !targetTypeSet.contains(29)) { + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoGasDetector" + result.warning = "现场无气体检测报警仪" + hiddenTroubles.add(result) + } } } @@ -117,15 +133,17 @@ //结果包含配电箱外 if (detectResults.isContains(51) && !detectResults.isContains(19)) { //不包含警示标识 - val result = HiddenTroubleResult() - result.alarmCode = "DistributionBoxHasNoWarningSign" - result.warning = "配电箱无警示标识" - hiddenTroubles.add(result) + if (targetTypeSet.contains(51) && !targetTypeSet.contains(19)) { + val result = HiddenTroubleResult() + result.alarmCode = "DistributionBoxHasNoWarningSign" + result.warning = "配电箱无警示标识" + hiddenTroubles.add(result) + } } //结果包含配电箱内 if (detectResults.isContains(50)) { - if (!detectResults.isContains(42)) { + if (!detectResults.isContains(42) && !targetTypeSet.contains(42)) { //不包含无电路图 val result = HiddenTroubleResult() result.alarmCode = "DistributionBoxHasNoCircuitDiagram" @@ -133,7 +151,7 @@ hiddenTroubles.add(result) } - if (detectResults.isContains(41)) { + if (detectResults.isContains(41) && !targetTypeSet.contains(41)) { //包含电线裸露 val result = HiddenTroubleResult() result.alarmCode = "DistributionBoxHasExposedWire" @@ -141,7 +159,7 @@ hiddenTroubles.add(result) } - if (!detectResults.isContains(47)) { + if (!detectResults.isContains(47) && !targetTypeSet.contains(47)) { //包含跨电线 val result = HiddenTroubleResult() result.alarmCode = "DistributionBoxHasNoJumperWire" @@ -159,7 +177,7 @@ hiddenTroubles.add(result) } - if (detectResults.isContains(56)) { + if (detectResults.isContains(56) && !targetTypeSet.contains(56)) { val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNonDedicatedHose" result.warning = "非标准软管" @@ -175,7 +193,7 @@ //结果包含灶台、灶眼 if (detectResults.isContains(35) || detectResults.isContains(36)) { - if (!detectResults.isContains(10)) { + if (!detectResults.isContains(10) && !targetTypeSet.contains(10)) { //不包含燃气泄漏报警装置 val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNoAlarmDevice" @@ -183,7 +201,7 @@ hiddenTroubles.add(result) } - if (!detectResults.isContains(5)) { + if (!detectResults.isContains(5) && !targetTypeSet.contains(5)) { //不包含切断阀 val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNoShutoffValve" @@ -191,7 +209,7 @@ hiddenTroubles.add(result) } - if (!detectResults.isContains(38)) { + if (!detectResults.isContains(38) && !targetTypeSet.contains(38)) { //不包含熄火保护装置 val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" @@ -202,7 +220,7 @@ } "居民用户" -> { - if (detectResults.isContains(56)) { + if (detectResults.isContains(56) && !targetTypeSet.contains(56)) { val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNonDedicatedHose" result.warning = "非标准软管" @@ -218,7 +236,7 @@ //结果包含灶台、灶眼 if (detectResults.isContains(35) || detectResults.isContains(36)) { - if (!detectResults.isContains(38)) { + if (!detectResults.isContains(38) && !targetTypeSet.contains(38)) { //不包含熄火保护装置 val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 6fb560f..499f140 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -634,7 +634,7 @@ std::vector strides = {8, 16, 32}; // might have stride=64 std::vector grid_strides; generate_grids_and_stride(in_pad.w, in_pad.h, strides, grid_strides); - generate_proposals(grid_strides, out, 0.4f, proposals, 50); + generate_proposals(grid_strides, out, 0.4f, proposals, 58); // sort all proposals by score from highest to lowest qsort_descent_inplace(proposals); @@ -756,7 +756,7 @@ std::vector strides = {8, 16, 32}; // might have stride=64 std::vector grid_strides; generate_grids_and_stride(in_pad.w, in_pad.h, strides, grid_strides); - generate_proposals(grid_strides, out, prob_threshold, proposals, 50); + generate_proposals(grid_strides, out, prob_threshold, proposals, 58); // sort all proposals by score from highest to lowest qsort_descent_inplace(proposals); diff --git a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt index b3d0352..fe56d38 100644 --- a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt +++ b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt @@ -13,7 +13,9 @@ var hiddenTroubles = ArrayList() fun siftHiddenTrouble( - segmentationResults: MutableList, detectResults: MutableList + targetTypeSet: HashSet, + segmentationResults: MutableList, + detectResults: MutableList ) { //每次刷新画面帧都清除掉之前的筛选结果 hiddenTroubles.clear() @@ -23,13 +25,16 @@ if (detectResults.isContains(3)) { if (!detectResults.isContains(24) && !detectResults.isContains(9)) { //不包含工服/防护服 - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoWorkerClothes" - result.warning = "未穿工服/防护服" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(24) && !targetTypeSet.contains(9)) { + //当前画面帧不包含工服和防护服且当前场景下没有识别过工服和防护服。以下类推 + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoWorkerClothes" + result.warning = "未穿工服/防护服" + hiddenTroubles.add(result) + } } - if (!detectResults.isContains(18)) { + if (!detectResults.isContains(18) && !targetTypeSet.contains(18)) { //不包含安全帽 val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoWorkerSafelyHat" @@ -39,7 +44,7 @@ } //结果不包含呼吸防护设备 - if (!detectResults.isContains(11)) { + if (!detectResults.isContains(11) && !targetTypeSet.contains(11)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoWorkerMask" result.warning = "现场无呼吸器" @@ -48,10 +53,12 @@ //结果不包含路锥、警戒线 if (!detectResults.isContains(48) && !detectResults.isContains(43)) { - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoEnclosure" - result.warning = "现场无围挡设施" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(48) && !targetTypeSet.contains(43)) { + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoEnclosure" + result.warning = "现场无围挡设施" + hiddenTroubles.add(result) + } } //结果不包含安全告知牌 @@ -59,13 +66,18 @@ !detectResults.isContains(6) && !detectResults.isContains(28) ) { - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoWarningSign" - result.warning = "现场无安全告知牌" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(16) && + !targetTypeSet.contains(6) && + !targetTypeSet.contains(28) + ) { + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoWarningSign" + result.warning = "现场无安全告知牌" + hiddenTroubles.add(result) + } } - if (!detectResults.isContains(4)) { + if (!detectResults.isContains(4) && !targetTypeSet.contains(4)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoJobInformationSign" result.warning = "现场无作业信息公示牌" @@ -74,14 +86,16 @@ //结果不包含通风设备 if (!detectResults.isContains(57) && !detectResults.isContains(58)) { - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoAirSupply" - result.warning = "现场无送风设备" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(57) && !targetTypeSet.contains(58)) { + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoAirSupply" + result.warning = "现场无送风设备" + hiddenTroubles.add(result) + } } //结果不包含井下照明设备 - if (!detectResults.isContains(37)) { + if (!detectResults.isContains(37) && !targetTypeSet.contains(37)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoLighting" result.warning = "现场无照明设备" @@ -89,7 +103,7 @@ } //结果不包含对讲设备 - if (!detectResults.isContains(22)) { + if (!detectResults.isContains(22) && !targetTypeSet.contains(22)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoIntercom" result.warning = "现场无对讲设备" @@ -97,7 +111,7 @@ } //结果不包含施工三脚架 - if (!detectResults.isContains(0)) { + if (!detectResults.isContains(0) && !targetTypeSet.contains(0)) { val result = HiddenTroubleResult() result.alarmCode = "ConfinedSpaceHasNoTripod" result.warning = "现场无三脚架" @@ -106,10 +120,12 @@ //结果不包含气体检测仪 if (!detectResults.isContains(13) && !detectResults.isContains(29)) { - val result = HiddenTroubleResult() - result.alarmCode = "ConfinedSpaceHasNoGasDetector" - result.warning = "现场无气体检测报警仪" - hiddenTroubles.add(result) + if (!targetTypeSet.contains(13) && !targetTypeSet.contains(29)) { + val result = HiddenTroubleResult() + result.alarmCode = "ConfinedSpaceHasNoGasDetector" + result.warning = "现场无气体检测报警仪" + hiddenTroubles.add(result) + } } } @@ -117,15 +133,17 @@ //结果包含配电箱外 if (detectResults.isContains(51) && !detectResults.isContains(19)) { //不包含警示标识 - val result = HiddenTroubleResult() - result.alarmCode = "DistributionBoxHasNoWarningSign" - result.warning = "配电箱无警示标识" - hiddenTroubles.add(result) + if (targetTypeSet.contains(51) && !targetTypeSet.contains(19)) { + val result = HiddenTroubleResult() + result.alarmCode = "DistributionBoxHasNoWarningSign" + result.warning = "配电箱无警示标识" + hiddenTroubles.add(result) + } } //结果包含配电箱内 if (detectResults.isContains(50)) { - if (!detectResults.isContains(42)) { + if (!detectResults.isContains(42) && !targetTypeSet.contains(42)) { //不包含无电路图 val result = HiddenTroubleResult() result.alarmCode = "DistributionBoxHasNoCircuitDiagram" @@ -133,7 +151,7 @@ hiddenTroubles.add(result) } - if (detectResults.isContains(41)) { + if (detectResults.isContains(41) && !targetTypeSet.contains(41)) { //包含电线裸露 val result = HiddenTroubleResult() result.alarmCode = "DistributionBoxHasExposedWire" @@ -141,7 +159,7 @@ hiddenTroubles.add(result) } - if (!detectResults.isContains(47)) { + if (!detectResults.isContains(47) && !targetTypeSet.contains(47)) { //包含跨电线 val result = HiddenTroubleResult() result.alarmCode = "DistributionBoxHasNoJumperWire" @@ -159,7 +177,7 @@ hiddenTroubles.add(result) } - if (detectResults.isContains(56)) { + if (detectResults.isContains(56) && !targetTypeSet.contains(56)) { val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNonDedicatedHose" result.warning = "非标准软管" @@ -175,7 +193,7 @@ //结果包含灶台、灶眼 if (detectResults.isContains(35) || detectResults.isContains(36)) { - if (!detectResults.isContains(10)) { + if (!detectResults.isContains(10) && !targetTypeSet.contains(10)) { //不包含燃气泄漏报警装置 val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNoAlarmDevice" @@ -183,7 +201,7 @@ hiddenTroubles.add(result) } - if (!detectResults.isContains(5)) { + if (!detectResults.isContains(5) && !targetTypeSet.contains(5)) { //不包含切断阀 val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNoShutoffValve" @@ -191,7 +209,7 @@ hiddenTroubles.add(result) } - if (!detectResults.isContains(38)) { + if (!detectResults.isContains(38) && !targetTypeSet.contains(38)) { //不包含熄火保护装置 val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" @@ -202,7 +220,7 @@ } "居民用户" -> { - if (detectResults.isContains(56)) { + if (detectResults.isContains(56) && !targetTypeSet.contains(56)) { val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNonDedicatedHose" result.warning = "非标准软管" @@ -218,7 +236,7 @@ //结果包含灶台、灶眼 if (detectResults.isContains(35) || detectResults.isContains(36)) { - if (!detectResults.isContains(38)) { + if (!detectResults.isContains(38) && !targetTypeSet.contains(38)) { //不包含熄火保护装置 val result = HiddenTroubleResult() result.alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index 512feeb..706858c 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt @@ -60,6 +60,7 @@ private val context = this private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } + private val targetTypeSet by lazy { HashSet() } private val detectedTargetSet by lazy { HashSet() } private val yolov8ncnn by lazy { Yolov8ncnn() } private val mat by lazy { Mat() } @@ -290,9 +291,9 @@ detectResults.add(it.convert2YoloResult(this)) } - //实时筛选隐患结果 - detectHelper.siftHiddenTrouble(segmentationResults, detectResults) detectResults.forEach { + //将识别到的目标type存起来。判断隐患需要 + targetTypeSet.add(it.type) val target = LocaleConstant.TARGET_NAMES_ARRAY[it.type] if (target.isTargetInScene()) { targetSet.add(target) @@ -322,6 +323,8 @@ } } } + //实时筛选隐患结果 + detectHelper.siftHiddenTrouble(targetTypeSet, segmentationResults, detectResults) runOnUiThread { if (targetSet.size > 0) { binding.tipsTagView.visibility = View.VISIBLE