使用yolov5检测商店烟柜香烟摆放的整齐程度


前言

提示:这里可以添加本文要记录的大概内容:

有一个有意思的问题:大多数商店都出售香烟,各种香烟摆放在烟柜上,我们用眼睛能够很容易判断出香烟摆放的整不整齐,但是计算机该如何判断摆放的整齐与否?
烟柜的香烟


提示:以下是本篇文章正文内容,下面案例可供参考

一、利用FLD直线检测算法(最终放弃传统图像处理)

首先利用LSD算法找出目标图片里所有的直线,再筛选出长度符合的直线(主要是去除烟盒上复杂的图案,只留下烟盒大概的轮廓)。
处理后的图片
由于烟盒颜色,样式太过复杂,所得到的图片不能完整显示所有烟盒的轮廓,并且价格标签也会影响对烟盒轮廓的判断,想了很多办法但都没有太大作用,所以最终舍弃了这种办法。

二、使用目标检测(yolov5)算法计算整齐度

1.模型的训练

首先我从各种软件和浏览器上找到了大概20张拍的比较规范的烟柜图片,标记出了图片里摆放整齐的所有烟盒,训练后的模型基本可以检测出图片里所有规范的烟盒。

模型检测的烟盒:
检测的烟盒

在这里插入图片描述

2.在detect.py文件中将62行附近的save_txt打开,如图所示。这样就可以得到烟盒的坐标信息。

在这里插入图片描述

3.处理得到的.txt坐标文件

这里我在test.py文件中处理得到的坐标并计算整齐程度。

file = open('runs/detect/exp24/labels/p6.txt')
cig = 0.0
left_x = 10000
left_y = 10000
right_x = 0
right_y = 0
average = 0
count = 0
row1 = 0
row2 = 0
up = 0
arr = []
arr2 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
row_count = 0
for line in file:
    num = 0
    count += 1
    line = line.split()
    x1 = int(line[1])
    y1 = int(line[2])
    x2 = int(line[3])
    y2 = int(line[4])
    central = (y2 - y1) / 2 + y1
    for i in range(0, len(arr), 1):
        if y1 < arr[i] < y2:
            arr2[i] += 1
            num += 1
            break
    if num == 0:
        row1 += 1
        arr.append(central)
    cig += (x2 - x1) * (y2 - y1)
    if left_x > x1:
        left_x = x1
    if left_y > y1:
        left_y = y1
    if right_x < x2:
        right_x = x2
    if right_y < y2:
        right_y = y2
    average += y2 - y1
average_area = average / count
for i in arr2:
    if i > 3:
        row2 += 1
differ = 0
dif_count = 0
dif_sum = 0
dif_yu = 0
for i in range(len(arr2) - 1, -1, -1):
    if arr2[i] == 1 and dif_count == 0:
        continue
    if arr2[i] != 1:
        dif_count = 1
    dif_sum += arr2[i]
    dif_yu += 1
    if (arr2[i - 1] > 10 or arr2[i] > 10) and abs(arr2[i - 1] - arr2[i]) >= 4:
        # print(abs(arr2[i-1]-arr2[i]))
        differ = differ + 1
dif_average = dif_sum / dif_yu
little = 0
more = 0
for i in range(0, dif_yu, 1):
    if arr2[i] < dif_average:
        little += 1
    else:
        more += 1
if differ > 1 and more < little:
    rate = cig / (row1 * average_area * (right_x - left_x))
else:
    rate = cig / (row2 * average_area * (right_x - left_x))
print(rate)
file.close()

大致思路:首先遍历所有坐标,计算出所有烟盒的面积之和s1,计算所有烟盒高度之和,计算出烟柜有多少行烟,并利用左上和右下坐标得到最长一行烟的长度a,如图:
在这里插入图片描述
利用得到的高度之和除烟盒数就可以得到烟盒高度的平均值,用这个值乘行数乘a就大概得到这个烟柜应该摆放烟的面积s2,用s1s2就可以算出烟盒的整齐度了。其他的代码是为了提高计算的准确度,更加精确地检测出有多少行烟盒。

4.检测效果

第一幅:
在这里插入图片描述
对于这幅图,计算出的整齐度为0.94。

在这里插入图片描述
————————————————————————————————
第二幅:
在这里插入图片描述
对于这幅图,检测出的整齐度约为0.89。

在这里插入图片描述
可以看出基本实现了对烟盒摆放整齐的计算。


总结

项目代码:https://gitee.com/wangfl1013/cigarette-case.git
烟盒图片也在项目代码中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值