资讯动态

口红色号检测系统实战:Dlib+TensorFlow+PyQt5全流程解析

发布时间:2026/9/20 11:38:18 来源:尧图企业网站定制
简介本资源为基于Dlib、PyQt5与TensorFlow的智能口红色号检测推荐系统完整工程包面向计算机视觉初学者、美妆推荐系统开发者及深度学习实践者解决唇部特征提取、肤色匹配与色号推荐问题。项目利用Dlib 68点人脸特征点定位唇部区域通过颜色空间转换与色号库比对实现口红色号的自动推荐并配套PyQt5图形界面可直接二次开发。包内含84个文件约3.03MB主要包含Python源码10个py、JSON色号库与配置8个json、模型运行说明37个txt、UI设计文件、数据集图表21个png及参考论文PDF等目录结构清晰涵盖数据预处理、人脸检测、唇部蒙版创建、色彩提取、结果输出等完整流程。已有464人学习下载适合希望快速上手图像识别与推荐系统项目、或进行美妆领域应用开发的读者。1. 这个项目解决的真实问题口红色号检测到底在检测什么做一个口红色号检测推荐系统很多人第一反应是这不就是取个颜色平均值再匹配色号吗。但你真正写完跑一遍会发现从嘴唇在哪到这个颜色算什么色号中间每一步都有文章。这个项目把Dlib、TensorFlow、PyQt5三个完全不同的技术栈串在一起完成从上传人脸照片、定位唇部、提取颜色特征、识别色号到界面展示推荐的全流程属于典型的深度学习视觉应用。先说清楚这套系统能干的事用户上传一张含有人脸的图片系统自动检测人脸和唇部关键点剪出嘴唇区域分析颜色特征再调用训练好的模型判断口红色号最后在界面展示色号名称、相近色推荐和搭配建议。工程源码、训练好的模型和数据集都是现成的适合想完整走一遍视觉检测深度学习桌面GUI整套流程的初学者也适合作为毕业设计或课程项目参考。只盯某一个环节的人也能从对应章节找到可复用的方案。1.1 三个库的分工逻辑Dlib负责看——检测人脸框、定位五官坐标尤其是唇部轮廓的20个关键点TensorFlow负责认——把唇部区域的颜色特征变成可区分的色号类别PyQt5负责说——把识别结果用一个像样的桌面窗口呈现给用户。三者的关系是一条单向流水线图像先进Dlib拿到坐标坐标裁出区域区域算成特征特征送入模型模型输出标签标签显示在PyQt5界面上。任何一环出问题整个链路就断掉这也是为什么很多人在单独某个库上没问题一整合就报错连连。1.2 全流程数据链路我把整个处理链路拆成六个阶段人脸检测→关键点定位→唇部区域裁剪→颜色特征提取→模型推理→界面展示与推荐。第一阶段用Dlib自带的frontal_face_detector速度非常快CPU上单张图也就几十毫秒第二阶段用shape_predictor_68_face_landmarks.dat载入68点模型第三阶段根据48到67号关键点构建唇部mask用OpenCV抠图第四阶段在抠出的纯唇部像素上计算颜色统计量第五阶段加载TensorFlow训练好的色号分类模型输出概率分布第六阶段由PyQt5窗口绑定按钮和显示区域。后面每一章都会讲这个链路里的关键细节和坑。2. 环境配置Dlib、PyQt5与TensorFlow的版本兼容细节我见过太多人还没跑到模型推理就卡在装库上。搜索热词里大量出现dlib下载pyqt5安装tensorflow dll diagnostic这类问题说明环境才是本项目的第一个拦路虎。这里直接给出一套经过验证的方案省得你在版本地狱里反复折腾。2.1 版本选择的核心依据Python版本建议锁定3.8或3.9不要追新。TensorFlow 2.10是最后一个在Windows上原生支持GPU的版本2.11以后GPU支持被移到了Linux的WSL2里这对通常用Windows做本地开发的人来说很关键。PyQt5建议选5.15.x系列这个系列最稳定网上能查到的解决方案也最多。Dlib建议配19.24.x这个版本对Python 3.9支持最完善。我自己用的是Python 3.9.13、TensorFlow 2.10.0CPU版、PyQt5 5.15.9、Dlib 19.24.2整条链路跑得最稳。2.2 Dlib安装失败的处理Dlib在Windows上直接pip install dlib经常因为编译不通过报C环境错误这是因为Dlib依赖CMake和C编译工具链。两条路可以选一条是安装Visual Studio Build Tools之后用pip install cmake和pip install dlib这样的顺序来编译安装顺便说一句Dlib没有独立的官方pip包你需要通过pip install dlib或者conda install -c conda-forge dlib来获取另一条是直接下载别人编译好的dlib.whl文件cp39表示适配Python 3.9win_amd64表示64位Windows装起来最省事。我建议初学者选第二条路把精力留给后面模型部分。2.3 TensorFlow DLL诊断问题热词里的tensorflow dll diagnostic analyzing: d:\anaconda\lib\site-packages\tensorf...是TensorFlow启动时自动检查DLL依赖的提示。看到Analyzing说明库加载阶段已经在找动态链接库了这行日志后面的内容才是重点——如果提示缺少cudart64_.dll或cublas64_.dll说明你把CPU版和GPU版混在一起了或者CUDA、cuDNN与TensorFlow版本不匹配。最稳妥的办法是卸载干净后只装CPU版tensorflow对色号检测这种任务CPU推理完全够用也绕开了GPU环境一堆版本要求。另一个常见原因是没装Microsoft Visual C Redistributable去微软官网装一个最新的x64运行库就能解决。2.4 PyQt5装完后的验证PyQt5装完不要急着写界面先建一个只有QLabel和QComboBox的最小窗口跑一下。这是为了验证Qt基础组件是否正常。热词里出现的pyqt5 下拉框闪退问题大多数情况下是PyQt5和Qt版本混装造成的比如先装了PyQt5又从其他渠道装了不匹配的Qt库。解决办法是在虚拟环境里统一用pip install PyQt55.15.9重装并且不要手动去改site-packages里的Qt文件。如果用了Anaconda注意在base环境里import到的Qt和虚拟环境里的Qt可能是两套一定要确认当前项目用的是哪个Python解释器。3. Dlib唇部关键点从68点坐标到可用的颜色特征环境配置好之后第二个技术重点就是如何准确拿到唇部区域。直接整图送给模型不是不行但背景、牙齿、肤色都会污染颜色特征模型学到的可能不是口红色号而是人脸肤色。所以必须先靠Dlib把嘴唇精确定位出来。3.1 68点模型的坐标含义Dlib的shape_predictor_68_face_landmarks.dat预测的是人脸68个关键点其中唇部相关的点是第48号到第67号。简单拆解一下48到59是外唇轮廓60到67是内唇边缘。它的坐标形式是每个点包含(x, y)单位是像素。你把检测到的点用cv2.circle画出来就能看到一条非常清晰的唇线。import dlib import cv2 detector dlib.get_frontal_face_detector() predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) img cv2.imread(sample.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces detector(gray, 1) for face in faces: landmarks predictor(gray, face) lips_points [] for i in range(48, 68): x landmarks.part(i).x y landmarks.part(i).y lips_points.append((x, y)) cv2.circle(img, (x, y), 2, (0, 0, 255), -1)这段代码里detector(gray, 1)的第二个参数是图像金字塔的上采样次数。数值越大越容易检测到远处的、更小的人脸但计算时间也会增加。实际测试中设为1最合适单个测试即可。3.2 唇部区域裁剪与边界处理拿到20个关键点坐标之后最常见的做法是直接用cv2.boundingRect求外接矩形然后矩形裁剪。说实话矩形裁剪会把一部分皮肤和牙齿也截进来对这个项目的后续颜色分析影响不大因为只要唇色和肤色差异明显统计特征仍然以嘴唇为主。但如果你想做得更精细建议用凸包mask。先用cv2.convexHull把这些点包成一个闭合多边形再生成一张黑色背景的mask把多边形内部填充为白色最后与原图做位运算就得到了纯嘴唇区域。3.3 颜色特征的计算方法抠出嘴唇后颜色特征怎么算最直接的是计算RGB三个通道的均值和一个色调统计值。BGR转HSV之后取H通道的均值或直方图峰值这个值对色号分类尤其重要因为口红色号本质上就是色调的变化。为确保特征稳定我会把唇部区域缩放成固定尺寸再计算比如把mask抠出来的图resize到64×64这样不管原始图片里人脸是大是小进到模型里的特征尺寸都是统一的。还有一个实操细节如果嘴唇区域过小比如人脸只占几十个像素算出来的颜色统计量几乎没有意义处理时应设置一个面积阈值小于阈值的直接提示用户换图而不是硬着头皮预测。4. TensorFlow色号分类模型的训练数据、结构与调参唇部颜色特征是输入色号类别是输出中间那一层智能就来自TensorFlow训练出来的模型。这个章节我把自己训练时踩过的坑和最终采用的方案一起讲。4.1 数据集应该长什么样项目的核心数据是唇部图像色号标签的配对。数据集的构建分两步第一步准备一批人脸图片用人脸检测和唇部关键点提取出唇部区域做统一预处理第二步人工标注每张唇部图像对应的口红色号。色号分类的粒度不需要做成几百个色号的大分类实际训练时按常见色系划分成N个类别就足够了比如正红色、豆沙色、珊瑚色、砖红色、玫粉色、裸色等等类别数建议控制在8到12个之间类别太少区分度不高太多单类样本不够容易过拟合。预处理环节我会做一个唇部区域的标准化裁剪后resize到64×64再按ImageNet数据集的均值和方差做像素归一化。这一步非常关键直接按原始像素值训练会让模型对光照和肤色极度敏感。4.2 模型结构设计与输入特征这个项目有两条建模路线。一条是直接对64×64×3的唇部图做端到端CNN分类适合数据量充足的情况另一条是把颜色统计量拼成一个特征向量再送进全连接网络特征维度低、训练快、部署轻量。我的实践是先走CNN路线模型结构用三层卷积加两个全连接层。每条训练样本要把唇部图作为输入标签编码使用sparse_categorical_crossentropy所以不需要做one-hot编码直接用整数标签。当验证集准确率达标后再把模型导出为SavedModel格式供PyQt5加载。如果数据量少特征向量方案是更务实的选择——把唇部区域的平均BGR、平均HSV、H通道直方图等拼接成约100维的向量用三层全连接网络即可训练时间以秒计算准确率也不差。对新手来说可以先跑通这条轻量路线再升级成CNN。4.3 训练过程中的过拟合处理口红色号数据集通常不会特别大过拟合是首要问题。我常用的招数一是数据增强用TensorFlow的ImageDataGenerator做随机旋转、水平翻转、亮度调整、对比度调整每次训练迭代都让模型看到变过形的样本二是EarlyStopping监控验证集损失连续10个epoch不降就停止避免无效训练浪费时间三是Dropout全连接层之间加0.3到0.5的Dropout让模型不依赖个别神经元。这三个手段组合下来验证集准确率一般能比不处理时高10个百分点以上。训练完成后做一次简单的错误样本分析把预测错误的图片单独打印出来看。我遇到最多的情况是两大类被混淆豆沙色和裸色、珊瑚色和砖红色。这两种色系在视觉上确实接近合理设置类别边界比反复调参更有效很多项目最后就是靠合并相近色系类别把准确率拉上去的。5. PyQt5界面从模型调用到异常交互的工程化处理模型有了最后一步是把能力包装成用户能直接操作的东西。PyQt5界面看起来只是个壳但工程化细节相当多尤其是模型加载、线程和控件异常这三块。5.1 界面功能模块划分我建议界面分成三个区域左侧是图片预览区中间是检测结果区右侧是色号推荐区。图片预览区放一个QLabel用于显示上传的图片旁边放两个QPushButton一个负责打开图片一个负责启动检测。检测结果区用一个QLineEdit或QLabel展示色号名和置信度。色号推荐区用QListWidget展示相近色推荐点击某个推荐项可以弹出该色号的颜色预览和适用场景描述。整体用QVBoxLayout和QHBoxLayout组合布局窗口大小固定为900×600比较合适。5.2 模型加载与推理的线程处理这是新手最容易踩的坑加载TensorFlow模型和执行Dlib检测都是耗时操作如果直接写在按钮的槽函数里界面会卡死好几秒看起来像程序崩溃。正确做法是把检测和推理逻辑放到QThread的子线程里主线程只负责接收结果并更新界面。定义一个信号携带结果字典色号名、置信度、推荐列表线程执行完通过emit把数据传回主线程在槽函数里更新UI。如果你的模型比较大加载模型也可以在子线程里完成在窗口启动时预加载避免用户点按钮时等太久。5.3 下拉框闪退与超链接交互热词里提到的pyqt5下拉框闪退我在这个项目里也遇到过。现象是打开下拉框列表一瞬间程序直接退出没有任何报错。排查后确认是PyQt5与Qt的版本混装重装PyQt5之后问题消失。但如果重装后还闪退就要观察是不是下拉框的qss样式表设置了不兼容的边框或背景属性——删除样式表作为对照实验缩小区间定位问题。还有一个界面交互需求是文本框超链接点击后执行自定义操作。比如点击推荐色号名字的链接打开系统浏览器查询购买页。这个功能实现起来不难QLabel默认支持富文本把setOpenExternalLinks(False)设置好后连接linkActivated信号在槽函数里用QDesktopServices.openUrl打开对应链接即可。from PyQt5.QtCore import QUrl from PyQt5.QtGui import QDesktopServices label QLabel(a hrefhttps://example.com/color/01查看此色号详情/a) label.setOpenExternalLinks(False) label.linkActivated.connect(lambda url: QDesktopServices.openUrl(QUrl(url)))核心逻辑是setOpenExternalLinks(False)不让Qt自己处理链接而是把url交给自定义槽函数。你可能还想在槽函数里加一个参数把色号名一起传出来实现点击后自动复制色号并写入搜索框之类的高级操作这个灵活性就是QLabel方案相比QTextBrowser方案的最大优势。6. 实测效果与面向复现者的建议代码全部连通之后我在自己的笔记本上做了完整验证。硬件是Windows 11、i5处理器、16GB内存、无独立显卡全程CPU推理。单张人脸图片从载入到显示结果总耗时约1.5到2秒其中Dlib检测约占200毫秒到400毫秒模型推理占200毫秒到500毫秒其余时间花在图像读写和界面刷新上。作为桌面应用这个速度可以接受。误判主要集中在光线偏暗和嘴唇被牙齿遮挡的场景所以界面里我会提示用户尽量上传正面、光线均匀的照片。如果要继续提高准确率可以往两个方向扩展。第一个方向是升级唇部区域提取算法比如用Dlib的深度人脸检测器替换HOG检测器或者引入MediaPipe做更细的唇部分割把牙齿和阴影区域去掉能明显减少颜色特征被污染的情况第二个方向是引入肤色与妆容兼容推荐比如检测完唇色后同时提取脸颊区域的肤色冷暖属性再通过预设的颜色搭配规则表输出推荐色号让检测升级成真正的推荐系统。给想复现这个项目的朋友最后提三点建议。第一环境问题不要硬扛Dlib编译失败就找预编译包TensorFlow报DLL错误就换纯CPU版把时间留给核心逻辑。第二首次跑通时可以在Dlib检测和TensorFlow推理之间加print输出或日志确定数据链路每一步都正常再加PyQt5界面千万不要一次把所有功能写完再调试那样出问题时你根本不知道从哪下手。第三训练数据的质量比数量重要同一个色号至少保证5种不同光照、不同肤色的样本宁缺毋滥我用一套几百张的精标数据训练出来的效果比混乱扩充到上千张的效果还要好。整个过程走下来你对怎么把视觉算法、深度学习模型和桌面应用串成一条完整链路会有一个非常具体的体感这套思路换到其他检测识别类项目里照样能复用。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价