树莓派虚拟键盘和别人的不一样

为啥我树莓派安装的虚拟键盘

sudo apt-get install matchbox-keyboard


和别人的不一样

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7778822
  • 这篇博客你也可以参考下:一文读懂交叉熵和最大似然的关系及在人脸识别中的应用
  • 除此之外, 这篇博客: 常见公开人脸数据集的获取和制作自定义人脸数据集中的 第一阶段 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    爬取人脸图片的核心思路就是获取中国明星的名字,然后使用明星的名字作为图片搜索的关键字进行获取图片,然后删除下载过程损坏的图片和没有包含人脸的图片,或者过多人脸的图片(我们只保存一张图片只包含一张人脸的图片)。

    首先获取中国明星的名字,该功能主要在get_star_name.py中实现。获取明显的名字核心代码如下,获取的名字不能保证百分之百正确,所以可能需要手动去检查。

    # 获取明星的名字并保存到文件中
    def get_page(pages, star_name):
        params = []
        # 设置访问的请求头,包括分页数和明星所在的地区
        for i in range(0, 12 * pages + 12, 12):
            params.append({
                'resource_id': 28266,
                'from_mid': 1,
                'format': 'json',
                'ie': 'utf-8',
                'oe': 'utf-8',
                'query': '明星',
                'sort_key': '',
                'sort_type': 1,
                'stat0': '',
                'stat1': star_name,
                'stat2': '',
                'stat3': '',
                'pn': i,
                'rn': 12})
    
        # 请求的百度接口获取明星的名字
        url = 'https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php'
    
        x = 0
        # 根据请求头下载明星的名字
        for param in params:
            try:
                # 获取请求数据
                res = requests.get(url, params=param, timeout=50)
                # 把网页数据转换成json数据
                js = json.loads(res.text)
                # 获取json中的明星数据
                results = js.get('data')[0].get('result')
            except AttributeError as e:
                print('【错误】出现错误:%s' % e)
                continue
    
            # 从数据中提取明星的名字
            for result in results:
                img_name = result['ename']
                f.write(img_name + '\n',)
    

    然后根据明星的名字从网上下载图片,该功能主要在download_image.py中实现,以下就是下载图片的核心代码片段。

    # 获取百度图片下载图片
    def download_image(key_word, download_max):
        download_sum = 0
        str_gsm = '80'
        # 把每个明显的图片存放在单独一个文件夹中
        save_path = 'star_image' + '/' + key_word
        if not os.path.exists(save_path):
            os.makedirs(save_path)
        while download_sum < download_max:
            # 下载次数超过指定值就停止下载
            if download_sum >= download_max:
                break
            str_pn = str(download_sum)
            # 定义百度图片的路径
            url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&' \
                  'word=' + key_word + '&pn=' + str_pn + '&gsm=' + str_gsm + '&ct=&ic=0&lm=-1&width=0&height=0'
            try:
                # 获取当前页面的源码
                result = requests.get(url, timeout=30).text
                # 获取当前页面的图片URL
                img_urls = re.findall('"objURL":"(.*?)",', result, re.S)
                if len(img_urls) < 1:
                    break
                # 把这些图片URL一个个下载
                for img_url in img_urls:
                    # 获取图片内容
                    img = requests.get(img_url, timeout=30)
                    img_name = save_path + '/' + str(uuid.uuid1()) + '.jpg'
                    # 保存图片
                    with open(img_name, 'wb') as f:
                        f.write(img.content)
                    with open('image_url_list.txt', 'a+', encoding='utf-8') as f:
                        f.write(img_name + '\t' + img_url + '\n')
                    download_sum += 1
                    if download_sum >= download_max:
                        break
            except Exception as e:
                download_sum += 1
                continue
    

    下载图片完成之后,有很多损坏的图片,需要把这些损坏的图片删除,该功能主要在delete_error_image.py实现。下面是删除损坏图片的核心代码片段。

    # 删除不是JPEG或者PNG格式的图片
    def delete_error_image(father_path):
        # 获取父级目录的所有文件以及文件夹
        image_paths = []
        for root, dirs, files in os.walk(father_path):
            for file in files:
                image_paths.append(os.path.join(root, file))
        for image in tqdm(image_paths):
            try:
                # 获取图片的类型
                image_type = imghdr.what(image)
                # 如果图片格式不是JPEG同时也不是PNG就删除图片
                if image_type is not 'jpeg' and image_type is not 'png':
                    os.remove(image)
                    continue
                # 删除灰度图
                img = numpy.array(Image.open(image))
                if len(img.shape) is 2:
                    os.remove(image)
            except:
                os.remove(image)
    

    下载的图片中可能没有人脸,或者包含多张人脸,所以我们要把这些图片删除掉,该功能主要在delete_more_than_one.py中实现。删除没有人脸或者过多人脸图片的关键代码片段如下。

    # 删除两个人脸以上的图片或者没有人脸的图片
    def delete_image(result, image_path):
        try:
            face_num = int(result['result']['face_num'])
            if face_num is not 1:
                os.remove(image_path)
            else:
                face_type = result['result']['face_list'][0]['face_type']['type']
                probability = result['result']['face_list'][0]['face_type']['probability']
                if face_type == 'cartoon' and probability > 0.8:
                    os.remove(image_path)
        except:
            os.remove(image_path)
    
  • 您还可以看一下 董洪伟老师的算法设计与分析课程中的 动态规划很简单-零钱问题、机器人走法小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^