目录

AaronJny

诗酒繁华,书剑天涯。

xyolo?几行Python代码轻松完成yolo3目标检测

前段时间在 qqwweee/keras-yolo3 的基础上改写出了一个支持 TensorFlow 2.2 版本的 yolo3 项目,我把它命名为tf2-keras-yolo3。 怎么说呢,用是肯定能用的,但操作步骤太过繁琐和反人性化,自己用起来嫌麻烦,别人用起来上手也有一定难度,于是,我萌生了重构并打包它的想法。 于是,就有了xyolo~ xyolo可以通过 pip 一键安装,而且使用起来非常简单,只需要几行代码就可以训练自己的 yolo3 模型,或者调用训练好的模型进行目标检测。废话少说,一起来看一下吧! GitHub 地址:https://github.com/AaronJny/xyolo 转载请注明来源:https://www.aaronjny.com/articles/2020/11/08/1604823112022.html 写在前面: 我使用的 Python 是 Anaconda 的 Python 3.7 发行版本,在 shell 里面进行了初始化(python 和 pip 默认指向当前激活环境,而不是默认的 python2),所以文章中的 python 和 pip ....

有趣的深度学习——使用TensorFlow 2.0实现图片神经风格迁移

前言 这也是一个重写的项目,之前用 Python 2.7 + TensorFlow 1.4 写的图片神经风格迁移的项目(TensorFlow 练手项目三:使用 VGG19 迁移学习实现图像风格迁移)直到现在还有很多朋友问我相关问题,毕竟环境太过古老,如今很难顺利跑起来,可能要做不少兼容性的调整(除非照装一样的环境……)。于是,我抽时间用 TensorFlow 2.0 重写了一下。 先做一下简单演示,风格图片统一使用《星夜》: 示例 1: 输入图片 输出图片 示例 2: 输入图片 输出图片 项目 GitHub 地址: DeepLearningExamples/tf2-neural-style-transfer : https://github.com/AaronJny/DeepLearningExamples/tree/master/tf2-neural-style-transfer 代码解读 这是一个重写项目,原理上和TensorFlow 练手项目三:使用 VGG19 迁移学习实现图像风格迁移没有任何区别,可以直接参考原博文了解细节。只是部分细节上有所差异,我会分别进行说明。....

有趣的深度学习——使用 BERT 实现一个古体诗生成器

前言 前阵子使用 RNN 写了个古体诗生成器(有趣的深度学习——使用TensorFlow 2.0 + RNN 实现一个古体诗生成器)的 NLP 小 Demo 玩玩。而现在说到 NLP,就很难绕开 Transformers 系列模型,譬如 BERT、GPT-2、RoBERTa、ALBERT、XLNet 等等。Transformers 系列模型不断刷新着 NLP 任务得分记录,在绝大多数任务下都远胜于传统的、基于 RNN 的 NLP 任务。 那么,既然之前用 RNN 写了个古体诗生成器,我们不妨也用 BERT 写一个吧,正好对比一下效果。 解读 代码结构和功能与有趣的深度学习——使用TensorFlow 2.0 + RNN 实现一个古体诗生成器(https://blog.csdn.net/aaronjny/article/details/103806954)基本上相同,只是将模型从 RNN 换成了 BERT,注释也很详细,感觉没有解读的必要了。 对照着这两份文档就能搞清楚: 基于 RNN 的模型的详细文档:使用TensorFlow 2.0 + RNN 实现一个古体诗生成器 基于 BERT ....

在kindle上阅读网络小说的正确方法——Kindle网文助手

起源 kindle 是个好东西啊,如果长时间阅读的话,kindle 的体验远胜于手机、电脑。亚马逊上有丰富的 kindle 电子书资源,但很遗憾,亚马逊上没有网络小说。手机起点又不支持推送到 kindle 阅读,如果偶尔先看看网文的话,那是真的有点淡疼…… 于是,就抽出几天零碎时间,写了个简单的小工具,我把它叫做 Kindle 网文助手。支持从网络上下载网络小说,并推送到 kindle 上阅读。 请注意,此项目不提倡盗版阅读,只因为手机起点看书费眼,也没有推送到 kindle 的途径,才萌生想法编写此项目。没有直接爬起点网站,是嫌起点反爬太多,太麻烦了(毕竟起点要面对那么多盗版网站的爬虫)。网文作者写书不易,有能力的朋友尽量订阅支持一下。 推荐如下操作: 选择一本想看的书 xxx => 打开起点,找到 xxx => 自动订阅 => 打开 kindle 网文助手,缓存 xxx => 推送到 kindle 阅读 如果真的没有闲钱,也请注册一下起点的账号,加一下收藏,投一下免费的推荐票,为你喜欢的小说点赞。写手不易,且行且珍惜。 随便写写的极简版本,比较简陋,凑合着用....

有趣的深度学习——使用TensorFlow 2.0 + RNN 实现一个古体诗生成器

一、前言 很早之前,我曾经写过一个古体诗生成器(详情可以戳TensorFlow练手项目二:基于循环神经网络(RNN)的古诗生成器),那个时候用的还是Python 2.7和TensorFlow 1.4。 随着框架的迭代,API 的变更,老项目已经很难无障碍运行起来了。有不少朋友在老项目下提出了各种问题,于是,我就萌生了使用TensorFlow 2.0重写项目的想法。 这不,终于抽空,重写了这个项目。 完整的项目已经放到了GitHub上: AaronJny/DeepLearningExamples/tf2-rnn-poetry-generator (https://github.com/AaronJny/DeepLearningExamples/tree/master/tf2-rnn-poetry-generator) 先对项目做个简单展示。项目主要包含如下功能: 使用唐诗数据集训练模型。 使用训练好的模型,随机生成一首古体诗。 使用训练好的模型,续写一首古体诗。 使用训练好的模型,随机生成一首藏头诗。 随机生成一首古体诗: 金鹤有僧心,临天寄旧身。 石松惊枕树,红鸟发禅新。 不到风前....

深度学习下的目标检测算法——TensorFlow 2.0下的YOLOv3实践

本文主要包含如下内容: 修改qqwweee/keras-yolo3(目标检测算法 YOLOv3 的一个 Keras 版本的优秀实现),将其修改为 tf.keras 为主导的,并修订不兼容的接口和逻辑,使其支持 TensorFlow 2.0 版本 实践修改后的 YOLOv3 算法 对实践结果的简单分析 修改后的项目 GitHub: tf2-keras-yolo3 (https://github.com/AaronJny/tf2-keras-yolo3) 前言 说到目标检测,YOLO 系列算法可以算是颇负盛名。目标检测相关的算法有不少,而 YOLO 因其识别速度快而出名,常被用于实时目标检测场景中。今天,我们就来实践一下 YOLOv3 算法。 因为 YOLO 原理我是清楚的,又觉得实现起来太麻烦了,所以本来想着就不自己造轮子了,直接从 GitHub 上找一个优秀的开源实现,拜读一下代码,然后调试跑通结束。但没想到,最后还是得动手写(或者说改?)代码…… 因为我主要使用的深度学习框架是 TensorFlow 和 Keras,所以直接去找了算法的 Keras 实现。然后就找了qqwwe....

机器学习里的Hello World——TensorFlow 2.0在MNIST数据集上的尝试

TensorFlow 2.0 在 MNIST 数据集上的尝试,共分为三个部分: ① 通过 TensorFlow 的低级接口,手动实现一个全连接神经网络; ② 通过 tf.keras 实现一个全连接神经网络; ③ 通过 tf.keras 实现一个卷积神经网络。 毕竟只是 Hello World,没什么难度,仅用来介绍 TensorFlow 2.0 的简单用法。

从零开始编写一个宠物识别系统(爬虫、模型训练和调优、模型部署、Web服务)

心血来潮,想从零开始编写一个相对完整的深度学习小项目。想到就做,那么首先要考虑的问题是,写什么? 思量再三,我决定写一个宠物识别系统,即给定一张图片,判断图片上的宠物是什么。宠物种类暂定为四类——猫、狗、鼠、兔。之所以想到做这个,是因为在不使用公开数据集的情况下,宠物图片数据集获取的难度相对低一些。 小项目分为如下几个部分: 爬虫。从网络上下载宠物图片,构建训练用的数据集。 模型构建、训练和调优。鉴于我们的数据比较少,这部分需要做迁移学习。 模型部署和 Web 服务。将训练好的模型部署成 Web 接口,并使用 Vue.js + Element UI 编写测试页面。 好嘞,开搞吧! 本文涉及到的所有代码,均已上传到 GitHub: pets_classifer (https://github.com/AaronJny/pets_classifer) 一、爬虫 训练模型肯定是需要数据集的,那么数据集从哪来?因为是从零开始嘛,假设我们做的这个问题,业内没有公开的数据集,我们需要自己制作数据集。 一个很简单的想法是,利用搜索引擎搜索相关图片,使用爬虫批量下载,然后人工去除不正确的图片。举个....

使用Python读取大文件

今天有个朋友问了我一个问题,如何使用 Python 读取大文件?觉得这个问题挺有意思的,就记录下来。 大部分时间我们处理小文件的时候(1g 以内?),可以直接用 f.read()或 readlines()直接把全部内容读取到内存里面来。但当文件非常大,比如 10g,100g 的时候,文件的大小一般已经超出了机器的内存大小,就没法直接按小文件的方式处理了。那应该怎么办呢? 首先,选一个文件做演示,就用上一篇博客的代码吧。我们现在有一个文件,名为replace_content.py。我们要做的事是读取并打印这个文件的每一行。这个文件可能太小了,但不影响我们演示大文件的读取。 一、读取小文件 我们先看一下读取小文件的时候是怎么做的: def get_lines(file_path): """ 给定一个文件路径,读取文件并返回一个迭代器,这个迭代器将顺序返回文件的每一行 """ with open(file_path, 'rb') as f: lines = f.readlines() return lines for e in get_lines('replace_content.py'....

使用Python脚本批量替换项目中的数据库地址

这几天接手到了一个很老很老的项目,PHP 的,里面的数据库地址不是同一配置的。有很多子站点,每个字站点又有自己的配置文件,这个时候,问题来了,要换数据库地址了!!! 初闻这个问题,我整个人都是懵逼的,这不是搞我嘛?这么多改起来得多麻烦? 但活儿还是得做啊,于是作为一名机智的大彩笔,我决定写个 Python 脚本解决这个问题。 当然,这个问题可以被简单理解为,给定路径 a,字符串列表 b,字符串 c,请将路径 a 下的全部文本文件(包括若干级子目录下的文本文件)中的字符串列表 b 中的全部字符串统一替换为字符串 c。 脚本编写如下: # -*- coding: utf-8 -*- # @File : replace_content.py # @Author: AaronJny # @Date : 2019/11/21 # @Desc : 给定路径a,字符串列表b,字符串c,请将路径a下的全部文本文件(包括若干级子目录下的文本文件)中的字符串列表b中的全部字符串统一替换为字符串c。 import logging import os from pprint import pprint imp....

使用Python3编写脚本一键备份MySQL数据库

假设,MySQL 的连接信息如下: host: 192.168.1.4 port: 3306 user: root password: mypassword 现在,我们需要对这台服务器上的数据库进行备份。从 MySQL 导出数据需要用到 mysqldump 工具,不论写不写 Python 脚本。 一、不编写 Python 脚本 备份全部数据库数据到一个 sql 文件(包括了 MySQL、sys、information_schema、performance_schema 等内置数据库): mysqldump -h192.168.1.4 -uroot -pmypassword -A > mysql_backup.sql 排除掉指定数据库,并备份其他所有数据库数据到一个 sql 文件: mysql -e "show databases;" -h192.168.1.4 -uroot -pmypassword | grep -Ev "Database|mysql|sys|information_schema|performance_schema" | xargs mysqldump ....

leetcode题解第29题 Divide Two Integers (两数相除)

题目的大意如下: 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。 简单来说,就是需要在不借助 python 内部的乘、除、去余运算的情况下,实现整数除法运算,并返回运算的商的。余数忽略。 且在此之外,还有几点额外说明: 除数永远不会为 0。 被除数和除数都是 32 位有符号整数。 假设计算机只能存储 32 位有符号整数,所以你返回的结果应该在 [−2^{31}, 2^{31} − 1]范围内,否则就返回 2^{31} − 1。 样例输入 1: dividend = 10, divisor = 3 样例输出 1: 3 样例输入 2: dividend = 7, divisor = -3 样例输出 2: -2 如果不借助语言内置的乘除法,应该怎么做除法运算呢? 一个最简单的方法是——不停累加除数,直到它大于被除数为止。这时,累加的次数-1 就是商。 这个方法看起来很美好,但是当被除数很大,而除数很小时,按这个方法就需要计算非常多次,时间复....

leetcode题解第24题 Swap Nodes in Pairs (两两交换链表中的节点)

题外话:之前说了写了代码也不一定会写题解,因为懒,然后我就真的没写……题目断断续续坚持在做,这代码都是好早之前写的了,题解嘛……果然,我就是个鸽子,咕咕咕。 反正你们应该也不需要我的题解,毕竟网上那么多,我就写着做个纪念。 好了,说正题。题目的大意是: 给定一个链表,你需要两两交换其中相邻的节点,并返回交换后的链表。但是你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 样例输入: 1->2->3->4 样例输出: 2->1->4->3 从示例可以看出,第一个节点和第二个节点做了交换,第三个节点和第四个节点做了交换。 leetcode 中的 python 链表是这样定义的: class ListNode: def __init__(self, x): self.val = x self.next = None 这就是一个简单的模拟题,直接上代码吧,注释很详细: class Solution: def swapPairs(self, head: ListNode) -> ListNode: """ 两两交换给定链表的节....

根据公司名称生成base64 logo(python文字转图片)

最近碰到了一个需求,需要根据公司的名称,生成一个临时的 logo,并以 base64 图片的形式在网页上显示。这个问题拆解一下,可以分为如下两个问题: 显示什么?即公司名称中的哪一部分需要显示出来。 怎么显示?即怎么把文字转成图片,并处理好排版问题。 用 python 把文字转图片其实很好做,随便搜一下就能找到一大堆。我找到了一位大佬(Phodal Huang)的文字转图片的实现,本文中关于图片转文字的实现中有一部分参考了 Phodal Huang 大佬的实现(已和作者取得了二次开发的许可,且使用的字体为开源字体)。 参考文章介绍 文章地址:Python PIL 转换文字到Logo 实现效果: 因我这里有不少额外需求,且 Phodal Huang 大佬是用 Python2 实现的,而我要用 python3,很多地方都不兼容,所以只能作为参考。下面记录我的实现过程。 转载请注明来源:https://blog.csdn.net/aaronjny/article/details/100140271 一、对文本信息进行处理 程序的输入可能是公司的全称,如北京市xxxx科技有限公司,也....

leetcode题解第23题 Merge k Sorted Lists(合并K个排序链表)

题目大意如下: 给定 k 个有序链表,请将这 k 个列表合并成一个有序链表,然后返回这个有序列表的头结点。 在 python 中,链表被这样实现: # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None 样例输入: [ 1->4->5, 1->3->4, 2->6 ] 样例输出: 1->1->2->3->4->4->5->6 题目链接:https://leetcode.com/problems/merge-k-sorted-lists 解题思路: 这道题考察的是链表的操作和归并排序,只不过这里做的是多个列表的归并。 输入是一个链表头结点组成的列表,我们需要创建一个指向这些链表头结点的指针构成的列表,和一个结果链表。 比较所有指针对应的值的大小,获取最小的节点的值,创建新节点,加入到结果链表中。然后将指向最小节点的指针后移一位。当一个指针走到头时,这....

leetcode题解第22题 Generate Parentheses(括号生成)

题目的大意如下: 给定一个整数 n,代表括号的对数,请给出所有合法的括号组合。 样例输入: 3 样例输出: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] 题目链接:https://leetcode.com/problems/generate-parentheses/ 解题思路: 生成 n 对括号,通过递归可以很轻松实现,问题的关键在于,什么样的生成式是正确的。 观察可以发现,合法的括号组合有如下特征: 假设 s 是一个合法的括号组合,则在 s 的任意位置,左边的左括号的数量一定大于等于右括号的数量。 emmm,大家可以举几个例子看一下,都是满足的。那么,在满足特征的情况下,使用递归生成所有组合方式即可。 样例代码: class Solution: # 最终的结果集 result = set() # 用于临时存储递归生成的一种合法组合的列表 curstring = [] def dfs(self, leftcnt, rightcnt): """ 递归搜索所有可能的合法组合,并加入到结果集中 :param le....

leetcode题解第19题 Remove Nth Node From End of List(删除链表的倒数第N个节点)

考查列表操作的一道题,题目大意如下: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 样例输入: head = 1->2->3->4->5 n = 2 样例输出: 1->2->3->5 题目链接:https://leetcode.com/problems/remove-nth-node-from-end-of-list/ emmmm,题目相当简单,所以本来没打算写的,不过交了一发,时间击败了 100% python 代码,有点特别意义,就简单说一下吧。 解题思路: 我的想法很简单,先利用指针遍历一下链表,计算链表的长度 length。 然后从头开始,将指针移动到 length-n-1 的位置,改变一下节点的 Next 的值就行了。 样例代码: class Solution(object): def list_len(self, head): """ 计算给定链表的长度 :param head: :return: """ tmp_head = head cnt = 0 while tmp_head: cn....

leetcode题解第18题 4Sum(四数之和)

跟第 15 题、第 16 题比较相似的一道题,题目大意是说: 给定一个包含 n 个整数的数组 nums 和一个整数 target,从数组中找出所有不重复的四个数相加等于 0 的组合。 注意,仅字典序不同的、包含数字相同的四元组被认为是重复的,只能保留其中一个。 样例输入: nums = [1, 0, -1, 0, -2, 2] target = 0 样例输出: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ] 题目链接:https://leetcode.com/problems/4sum/ 解题思路: 最简单的思路当然是四层循环啦,但不用试,估计也会爆炸 =。= 怎么优化呢?对,还是二分,这几道题一直在考二分 orz... 总共 n 个数,我们可以把它们两两相加,产生一个新的列表。且列表中的每个元素不止保存两个数的和,还要保存这两个数的下标,可以通过类(python)或结构体(c/c++)来实现。 新的列表我们给它起个名字,比方说就叫 sumnums。对 sumnums 进行排序,方便后面使用二分查找。 枚举 sumnums....

leetcode第17题 Letter Combinations of a Phone Number(电话号码的字母组合)

比较简单,直接深搜 + 回溯就能够解决的问题。题目的大意是: 给定一个只包含 2-9 的字符串,按照手机按键的映射关系,将它转化为一个只包含 a-z 的字符串,输出这种所有可能的转换字符串。 数字到小写字母的映射关系可以表示如下: digits_chr_map = { '2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz', } 样例输入: "23" 样例输出: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"] 题目链接:https://leetcode.com/problems/letter-combinations-of-a-phone-number/ 思路很简单,直接深搜 + 回溯就可以了,所以就不多说了,直接看代码吧,注释比较详细(python3): class Solution: # 存放所有可能的字符串的列表 combinations = [] # 数字到字母的映射....

leetcode第16题 3Sum Closest(最接近的三数之和)

这道题也比较简单,只是在第 15 题上加了一些变化。题目的大概意思是说: 给定一个长度为 n 的整数数组 nums 和一个整数 target,需要你从数组中找出三个数字,这三个数字相加的和与 target 最接近,返回这三个数字的和。 样例输入: nums = [-1,2,1,-4] target = 1 样例输出: 2 (-1 + 2 + 1 = 2) 题目链接:https://leetcode.com/problems/3sum-closest/ 相比较于第 15 题,大概有三个地方不同: 第 15 题里 target 固定为 0,这里的 target 是变化的 第 15 题里三个数相加必须等于 target,即假设三个数的和为 x,第 15 题要求 target-x==0,本题要求 abs(target-x)最小。 第 15 题要求返回所有满足条件的三个数的组合,而本题要求返回 abs(target-x)最小时的 x。 那么,可以借鉴第 15 题的思路,来解决这个问题。 解题思路: 首先,为数组排序。 实现一个二分查找算法,当查找成功时,返回给定值所在的坐标,不....